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