1: # include "defs.h"
   2: 
   3: /*
   4:  *	netrm - remove an entry from the network queue.
   5:  *
   6:  *	first does a creat to truncate the file to zero length in
   7:  *	case it is being sent. (this stops the daemon!) Next the
   8:  *	file is removed.
   9:  *	must be setuid root
  10:  */
  11: 
  12: char    path[] =    NETRMPATH;
  13: char    pathname[]=     NETRMNAME;
  14: 
  15: int hisuid, hisgid;
  16: static char visit[26];
  17: static struct stat statbuf;
  18: static struct direct dirbuf;
  19: 
  20: main(argc,argv)
  21: char    *argv[];
  22: {
  23:     int cnt, mach, i, all = 0;
  24: 
  25:     if (argc < 2)
  26:     {
  27:         printf("usage: netrm [-] file1 file2 ... filen\n");
  28:         exit(EX_USAGE);
  29:     }
  30: 
  31:     hisuid = getuid();
  32:     hisuid = uidmask(hisuid);
  33:     hisgid = getgid();
  34: 
  35:     if(argv[1][0] == '-'){
  36:         all++;
  37:         argv++;
  38:         argc--;
  39:         }
  40:     cnt = 0;
  41: 
  42:     while (++cnt < argc)rmfile(argv[cnt]);
  43:     if(all){
  44:         visit[local - 'a'] = 1;         /* skip this machine */
  45:         for(i = 'a'; i <= 'z'; i++)
  46:             if((mach = gothru(local,i)) && !visit[mach - 'a']){
  47:                 visit[mach - 'a'] = 1;
  48:                 senddir[strlen(senddir)-1] = mach;
  49:                 pdir(senddir);
  50:                 }
  51:         }
  52:     }
  53: static pdir(str)
  54:   char *str; {
  55:     FILE *df;
  56:     df = fopen(str,"r");
  57:     if(df == NULL || chdir(str) < 0){
  58:         perror(str);
  59:         exit(EX_OSFILE);
  60:         }
  61:     while(fread(&dirbuf,1,sizeof dirbuf,df) == sizeof dirbuf){
  62:         if(dirbuf.d_ino == 0
  63:         || dirbuf.d_name[0] != 'd'
  64:         || dirbuf.d_name[1] != 'f'
  65:         || stat(dirbuf.d_name,&statbuf) < 0)
  66:              continue;
  67:         if(guid(statbuf.st_uid,statbuf.st_gid) != hisuid)
  68:             continue;
  69:         /* kludge in file name */
  70:         dirbuf.d_name[3] = dirbuf.d_name[2];
  71:         rmfile(dirbuf.d_name+3);
  72:         }
  73:     fclose(df);
  74:     }
  75: rmfile(str)
  76:   char *str;
  77:   {
  78:     register char *ap, *cp;
  79:     int tt;
  80:     char *ostr,*rem,buf[20];
  81:     ostr = str;
  82:     if(str[0] != 'd' || str[1] != 'f' || str[3] != 'a'){
  83:         strcpy(buf+3,str);
  84:         buf[0] = 'd';
  85:         buf[1] = 'f';
  86:         buf[2] = str[0];
  87:         buf[3] = 'a';
  88:         str = buf;
  89:         }
  90:     cp = path;
  91:     ap = pathname;
  92:     while (*ap++ = *cp++);
  93:     cp = pathname + strlen(pathname) - 10;
  94:     while(*cp++ != 'f');
  95:     cp--;
  96:     cp--;
  97:     rem = cp;
  98:     ap = str;
  99:     while(*cp != '\0' && (*cp++ = *ap++));
 100:     pathname[strlen(pathname) - 11] = str[2];   /* set dir for mach */
 101: 
 102:     if (stat(pathname,&statbuf) < 0) {
 103:         perror(ostr);
 104:         return;
 105:     }
 106: 
 107:     tt = guid(statbuf.st_uid,statbuf.st_gid);
 108:     if(tt != hisuid && hisuid != 0) {
 109:         printf("%s: Permission Denied\n",ostr);
 110:         return;
 111:     }
 112: 
 113:     printf("removing file %s\n",ostr);
 114:     creat(pathname,0600);
 115:     unlink(pathname);
 116:     *rem = 'c';
 117:     unlink(pathname);
 118: }

Defined functions

main defined in line 20; never used
pdir defined in line 53; used 1 times
  • in line 49
rmfile defined in line 75; used 2 times

Defined variables

dirbuf defined in line 18; used 10 times
hisgid defined in line 15; used 1 times
  • in line 33
hisuid defined in line 15; used 6 times
path defined in line 12; used 1 times
  • in line 90
pathname defined in line 13; used 9 times
statbuf defined in line 17; used 6 times
visit defined in line 16; used 3 times
Last modified: 1980-07-16
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 843
Valid CSS Valid XHTML 1.0 Strict