BSD 4_1c_2 release
[unix-history] / usr / src / ucb / berknet / netrm.c
static char sccsid[] = "@(#)netrm.c 4.2 (Berkeley) 9/12/82";
# include "defs.h"
/* sccs id variable */
static char *netrm_sid = "@(#)netrm.c 1.2";
/*
* 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;
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[chtoinx(local)] = 1; /* skip this machine */
for(i = 0; i < MAXINX; i++)
if((mach = gothru(local,inxtoch(i)))
&& !visit[chtoinx(mach)]){
visit[chtoinx(mach)] = 1;
senddir[strlen(senddir)-1] = mach;
if(chdir(senddir) < 0)
continue;
pdir(senddir);
}
}
}
static pdir(str)
char *str; {
DIR *df;
register struct direct *dp;
df = opendir(str);
if(df == NULL){
perror(str);
exit(EX_OSFILE);
}
while((dp = readdir(df)) != NULL){
if(dp->d_name[0] != 'd'
|| dp->d_name[1] != 'f'
|| stat(dp->d_name,&statbuf) < 0)
continue;
if(guid(statbuf.st_uid,statbuf.st_gid) != hisuid)
continue;
/* kludge in file name */
dp->d_name[3] = dp->d_name[2];
rmfile(dp->d_name+3);
}
closedir(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);
}