home *** CD-ROM | disk | FTP | other *** search
/ Hackers Toolkit v2.0 / Hackers_Toolkit_v2.0.iso / HTML / archive / Unix / c-src / cwho.c < prev    next >
C/C++ Source or Header  |  1999-11-04  |  3KB  |  118 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. struct myutmp{
  5.            char ut_line[9];
  6.            char ut_name[9];
  7.            char ut_host[17];
  8.            char ut_time[5];
  9. }record;
  10. FILE *fp;
  11. unsigned long fsize,t=(unsigned long) 0,m;
  12. char *buffer,*IPaddress;
  13. char Line[9],Name[9],Host[17];
  14. char Line1[9],Name1[9],Host1[17];
  15. int  lineflg,nameflg,hostflg,clearflg;
  16. int  line1flg,name1flg,host1flg;
  17.  
  18. int  ReadUtmp();
  19. int  Check();
  20. void Update();
  21.  
  22. void main(argc,argv)
  23.      int argc; char *argv[];
  24. {
  25.      long i;
  26.      int  c,errflg;
  27.      extern char *optarg;
  28.      extern int   optind;
  29.  
  30.      errflg=lineflg=nameflg=hostflg=clearflg=0;
  31.      line1flg=name1flg=host1flg=0;
  32.      while((c=getopt(argc,argv,"u:t:a:v:y:d:c")) != -1)
  33.      switch(c) {
  34.          case 'u': strncpy(Name,optarg,8);
  35.                nameflg++;
  36.                break;
  37.          case 't': strncpy(Line,optarg,8);
  38.                lineflg++;
  39.                break;
  40.          case 'a': strncpy(Host,optarg,16);
  41.                hostflg++;
  42.                break;
  43.          case 'v': strncpy(Name1,optarg,8);
  44.                name1flg++;
  45.                break;
  46.          case 'y': strncpy(Line1,optarg,8);
  47.                line1flg++;
  48.                break;
  49.          case 'd': strncpy(Host1,optarg,16);
  50.                host1flg++;
  51.                break;
  52.          case 'c': clearflg++;
  53.                break;
  54.              case '?': errflg++;
  55.                break;
  56.          }
  57.      if(errflg|| (argc<2) || !(nameflg||lineflg||hostflg)) {
  58.          printf("Usage: cwho [-c] ((-u usr)(-t tty)(-a hos)) ");
  59.          printf("[-v nusr] [-y ntty] [-d nhos]\n");
  60.          exit(1);
  61.      }
  62.      fp=fopen("/etc/utmp","r+");
  63.      if(fp==NULL) {
  64.          printf("Cannot open file /etc/utmp !\n");
  65.          exit(1);
  66.      }
  67.      fseek(fp,(long) 0,2);
  68.      fsize=(unsigned long) ftell(fp);
  69.      fseek(fp,(long) 0,0);
  70.      buffer=(char *) malloc(fsize);
  71.      for(i=0;i<fsize;i++) buffer[i]=fgetc(fp);
  72.      fseek(fp,(long) 0,0);
  73.      record.ut_line[8]='\0';
  74.      record.ut_name[8]='\0';
  75.      record.ut_host[16]='\0';
  76.      record.ut_time[4]='\0';
  77.      while(ReadUtmp()) if(Check()) Update();
  78.      for(i=0;i<fsize;i++) fputc(buffer[i],fp);
  79.      free(buffer);
  80.      fclose(fp);
  81.      system("who");
  82.  
  83. int  ReadUtmp()
  84. {
  85.      int i;
  86.  
  87.      if(t>=fsize) return 0;
  88.      for(i=0;i<8;i++)  record.ut_line[i]=buffer[t++];
  89.      for(i=0;i<8;i++)  record.ut_name[i]=buffer[t++];
  90.      for(i=0;i<16;i++) record.ut_host[i]=buffer[t++];
  91.      for(i=0;i<4;i++)  record.ut_time[i]=buffer[t++];
  92.      return 1;
  93. }
  94.  
  95. int  Check()
  96. {
  97.      if(nameflg && strncmp(record.ut_name,Name,8)) return 0;          
  98.      if(lineflg && strncmp(record.ut_line,Line,8)) return 0;          
  99.      if(hostflg && strncmp(record.ut_host,Host,16)) return 0;          
  100.      return 1;
  101. }
  102.      
  103. void Update()
  104. {
  105.      int i,m;
  106.  
  107.      m = t-36;
  108.      if(clearflg) for(i=0;i<36;i++) buffer[m++]='\0';
  109.      else {
  110.      if(line1flg) for(i=0;i<8;i++) buffer[m++]=Line1[i];
  111.      else m+=8;
  112.          if(name1flg) for(i=0;i<8;i++) buffer[m++]=Name1[i];
  113.      else m+=8;
  114.          if(host1flg) for(i=0;i<16;i++) buffer[m++]=Host1[i];
  115.      }
  116. }
  117.