/* Whoison */
/* (c) 1993 D.S.D. Software, Written by Derek Snider */
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <utmp.h>
#include <time.h>
#include <unistd.h>

void main(argc, argv)
         char **argv;
{
  FILE *fpin;
  struct utmp buff;
  struct tm tmm;
  int num;
  char devpath[20];
  char TempID[9];
  char port[14];
  char hosty[17];
  char flag;
  char nlen;

  flag=0;
  if ((argv[1][0]=='?') && (argc==2)) {
     puts("Usage: whoison [-x] [userid] or [terminalid]");
     puts("A much faster version of the who command.");
     puts("Use -x for extra information display.");
     puts("(c) 1993 D.S.D. Software, Written by Derek Snider.");
     exit();
  }
  if ((argc>1) && (argv[1][0]=='-') && (argv[1][1]=='x')) {
     if (argc==3)
         strcpy(argv[1],argv[2]);
     flag='x';
     argc--;
  }
  nlen=strlen(argv[1]);

  fpin=fopen(UTMP_FILE,"r");

  while (fread(&buff, sizeof(buff), 1, fpin)!=0) {
     if (argc==1) {
       if (buff.ut_type == USER_PROCESS) {
           strcpy(TempID,buff.ut_user);
           TempID[8]='\0';
           printf("%-8s  ",TempID);
           strcpy(devpath,"/dev/");
           strcat(devpath,buff.ut_line);
           if (access(devpath,W_OK) == 0)
               putchar('+');
           else
               putchar('-');
           putchar(' ');
           printf("%-8s",buff.ut_line);
           if (flag=='x') {
               tmm=*gmtime(&buff.ut_time);
               printf(" %02d:%02d:%02d %02d/%02d/%02d %8i",
                      tmm.tm_hour,tmm.tm_min,tmm.tm_sec,tmm.tm_mday,
                      tmm.tm_mon+1,tmm.tm_year,buff.ut_pid);
               if (buff.ut_host[0] != 0) {
                   strcpy(hosty,buff.ut_host);
                   hosty[16]=0;
                   printf("  (%s)",hosty);
               }
           }
           putchar('\n');
       }
     }
     else {
       strcpy(TempID,buff.ut_user);
       TempID[8]='\0';
       strcpy(port,buff.ut_line); /*used to be ut_id*/
       if ((strncmp(TempID, argv[1], nlen) == 0) ||
          (strcmp(port, argv[1]) == 0)) {
           printf("%-8s  ",TempID);
           strcpy(devpath,"/dev/");
           strcat(devpath,buff.ut_line);
           if (access(devpath,W_OK) == 0)
               putchar('+');
           else
               putchar('-');
           putchar(' ');
           printf("%-8s",buff.ut_line);
           if (flag=='x') {
               tmm=*gmtime(&buff.ut_time);
               printf(" %02d:%02d:%02d %02d/%02d/%02d %8i",tmm.tm_hour,tmm.tm_min,tmm.tm_sec,tmm.tm_mday,tmm.tm_mon+1,tmm.tm_year,buff.ut_pid);
               if (buff.ut_host[0] != 0) {
                   strcpy(hosty,buff.ut_host);
                   hosty[16]=0;
                   printf("  (%s)",hosty);
               }
           }
           putchar('\n');
       }
     }
  }
  num=fclose(fpin);
}
