4BSD/usr/src/cmd/berknet/netrm.c

Compare this file to the similar file:
Show the results in this format:

# include "defs.h"

/*
 *	netrm - remove an entry from the network queue.
 *
 *	first does a creat to truncate the file to zero length in
 *	case it is being sent. (this stops the daemon!) Next the
 *	file is removed. 
 *	must be setuid root
 */

char	path[] =	NETRMPATH;
char	pathname[]=  	NETRMNAME;

int hisuid, hisgid;
static char visit[26];
static struct stat statbuf;
static struct direct dirbuf;

main(argc,argv)
char	*argv[];
{
	int cnt, mach, i, all = 0;

	if (argc < 2)
	{
		printf("usage: netrm [-] file1 file2 ... filen\n");
		exit(EX_USAGE);
	}

	hisuid = getuid();
	hisuid = uidmask(hisuid);
	hisgid = getgid();
	
	if(argv[1][0] == '-'){
		all++;
		argv++;
		argc--;
		}
	cnt = 0;

	while (++cnt < argc)rmfile(argv[cnt]);
	if(all){
		visit[local - 'a'] = 1;			/* skip this machine */
		for(i = 'a'; i <= 'z'; i++)
			if((mach = gothru(local,i)) && !visit[mach - 'a']){
				visit[mach - 'a'] = 1;
				senddir[strlen(senddir)-1] = mach;
				pdir(senddir);
				}
		}
	}
static pdir(str)
  char *str; {
	FILE *df;
	df = fopen(str,"r");
	if(df == NULL || chdir(str) < 0){
		perror(str);
		exit(EX_OSFILE);
		}
	while(fread(&dirbuf,1,sizeof dirbuf,df) == sizeof dirbuf){
		if(dirbuf.d_ino == 0
		|| dirbuf.d_name[0] != 'd'
		|| dirbuf.d_name[1] != 'f'
		|| stat(dirbuf.d_name,&statbuf) < 0)
			 continue;
		if(guid(statbuf.st_uid,statbuf.st_gid) != hisuid)
			continue;
		/* kludge in file name */
		dirbuf.d_name[3] = dirbuf.d_name[2];
		rmfile(dirbuf.d_name+3);
		}
	fclose(df);
	}
rmfile(str)
  char *str;
  {
	register char *ap, *cp;
	int tt;
	char *ostr,*rem,buf[20];
	ostr = str;
	if(str[0] != 'd' || str[1] != 'f' || str[3] != 'a'){
		strcpy(buf+3,str);
		buf[0] = 'd';
		buf[1] = 'f';
		buf[2] = str[0];
		buf[3] = 'a';
		str = buf;
		}
	cp = path;
	ap = pathname;
	while (*ap++ = *cp++);
	cp = pathname + strlen(pathname) - 10;
	while(*cp++ != 'f');
	cp--;
	cp--;
	rem = cp;
	ap = str;
	while(*cp != '\0' && (*cp++ = *ap++));
	pathname[strlen(pathname) - 11] = str[2];	/* set dir for mach */

	if (stat(pathname,&statbuf) < 0) {
		perror(ostr);
		return;
	}

	tt = guid(statbuf.st_uid,statbuf.st_gid);
	if(tt != hisuid && hisuid != 0) {
		printf("%s: Permission Denied\n",ostr);
		return;
	}

	printf("removing file %s\n",ostr);
	creat(pathname,0600);
	unlink(pathname);
	*rem = 'c';
	unlink(pathname);
}