PWB1/sys/source/s8/rmall.c

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

struct stbuf	{
	int dev;
	int inum;
	int mode;
	char nlink;
	char uid;
	};
int fflg, rflg, dflg;

main(argc, argv)
char *argv[];
{
	char *arg;

	if (ttyn(0) == 'x')
		fflg++;
	while(--argc > 0) {
		arg = *++argv;
		if(arg[0] == '-') switch(arg[1]) {
			case 'f':
				fflg++;
				continue;
			case 'd':
				dflg++;
			case 'r':
				rflg++;
				continue;
		}
		rm(arg);
	}
}

rm(arg)
char arg[];
{
	int buf[20];
	register i, b;

	if(stat(arg, buf)) {
		printf("%s: non existent\n", arg);
		return;
	}
	if((buf->mode & 060000) == 040000)	{
		if(rflg) {
			i = fork();
			if(i == -1) {
				printf("%s: try again\n", arg);
				return;
			}
			if(i) {
				while(wait(0) != i);
				return;
			}
			if(chdir(arg)) {
				printf("%s: cannot chdir\n", arg);
				exit(1);
			}
			close(3);
			if((i=open(".",0))<0) {
				printf("%s: cannot open\n", arg);
				exit(1);
			}
			buf[8] = 0;
			while(read(i,buf,16)==16) {
				if(buf[0]==0)
					continue;
				if(buf[1]=='.')
					continue;
				if((buf[1]=='..') && (buf[2]==0))
					continue;
				rm(&buf[1]);
			}
			if(dflg) {
				if(chdir("..")) {
					printf("..: cannot chdir\n");
					exit(1);
				}
				execl("/bin/rmdir","rmdir",arg,0);
				printf("%s: no rmdir\n", arg);
			}
			exit(1);
		}
		printf("%s: directory\n", arg);
		return;
	}
	if(!fflg) {
		if (access(arg, 02)<0) {
			printf("%s: %o mode ", arg, buf->mode);
			i = b = getchar();
			i = b;
			while(b != '\n' && b != '\0')
				b = getchar();
			if(i != 'y')
				return;
		}
	}
	if(unlink(arg))
		printf("%s: not removed\n", arg);
}

putchar(c)
{
	write(2, &c, 1);
}

getchar()
{
	char c;

	if(read(0, &c, 1) != 1) return(0);
	return(c);
}