xref: /original-bsd/old/berknet/netrm.c (revision 264c46cb)
1 static char sccsid[] = "@(#)netrm.c	4.2	(Berkeley)	09/12/82";
2 
3 # include "defs.h"
4 /* sccs id variable */
5 static 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 
17 char	path[] =	NETRMPATH;
18 char	pathname[]=  	NETRMNAME;
19 
20 int hisuid, hisgid;
21 static char visit[26];
22 static struct stat statbuf;
23 
24 main(argc,argv)
25 char	*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 }
60 static pdir(str)
61   char *str; {
62 	DIR *df;
63 	register struct direct *dp;
64 	df = opendir(str);
65 	if(df == NULL){
66 		perror(str);
67 		exit(EX_OSFILE);
68 		}
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)
73 			 continue;
74 		if(guid(statbuf.st_uid,statbuf.st_gid) != hisuid)
75 			continue;
76 		/* kludge in file name */
77 		dp->d_name[3] = dp->d_name[2];
78 		rmfile(dp->d_name+3);
79 		}
80 	closedir(df);
81 	}
82 rmfile(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 }
126