xref: /original-bsd/old/vpr/vprm.c (revision bac5051c)
1 #include <sys/types.h>
2 #include <dir.h>
3 #include <stat.h>
4 #include <stdio.h>
5 
6 char	line[128];
7 int	linel;
8 int	wide;
9 char	*spooldir;
10 FILE	*df;
11 FILE	*dfb;
12 extern	char _sobuf[];
13 
14 main(argc, argv)
15 	int argc;
16 	char *argv[];
17 {
18 	register int i;
19 	register char *ap, *cp;
20 	int cnt;
21 	int oldargc;
22 	char **oldargv;
23 
24 	setbuf(stdout, _sobuf);
25 	argc--, argv++;
26 	if (argc == 0) {
27 		fprintf(stderr, "usage: vprm [ id ... ] [ filename ... ] [ user ... ]\n");
28 		exit(1);
29 	}
30 
31 
32 	oldargc = argc; oldargv = argv;
33 
34 	printf("Varian - ");
35 	if (chdir("/usr/spool/vad") < 0)
36 		perror("/usr/spool/vad");
37 	else {
38 		df = fopen(".", "r");
39 		if (df == NULL)
40 			perror("/usr/spool/vad");
41 		else do {
42 			clobber(*oldargv++);
43 		} while (--oldargc);
44 	}
45 
46 	printf("Versatec - ");
47 	if (chdir("/usr/spool/vpd") < 0)
48 		perror("/usr/spool/vpd");
49 	else {
50 		df = fopen(".", "r");
51 		if (df == NULL)
52 			perror("/usr/spool/vpd");
53 		else do {
54 			clobber(*argv++);
55 		} while (--argc);
56 	}
57 }
58 
59 clobber(cp)
60 	char *cp;
61 {
62 	struct dir dirent;
63 	int did = 0;
64 
65 	rewind(df);
66 	while (fread(&dirent, sizeof dirent, 1, df) == 1) {
67 		if (dirent.d_ino == 0)
68 			continue;
69 		if (dirent.d_name[0] != 'd' || dirent.d_name[1] != 'f')
70 			continue;
71 		if (dirent.d_name[7] == 0 || dirent.d_name[8] != 0)
72 			continue;
73 		if (chkclob(cp, dirent.d_name)) {
74 			did++;
75 			printf("removing %s\n", dirent.d_name+3);
76 			unlink(dirent.d_name);
77 			dirent.d_name[0] = 'c'; unlink(dirent.d_name);
78 			dirent.d_name[2] = 'b'; unlink(dirent.d_name);
79 			dirent.d_name[2] = 'a';
80 			dirent.d_name[0] = 'l'; unlink(dirent.d_name);
81 			dirent.d_name[0] = 't'; unlink(dirent.d_name);
82 			dirent.d_name[0] = 'd';
83 		}
84 	}
85 	if (did == 0)
86 		printf("%s: nothing to remove\n", cp);
87 }
88 
89 chkclob(pattern, file)
90 	char *pattern, *file;
91 {
92 	register char *id = pattern;
93 
94 	/*
95 	 * Quick check for matching id
96 	 */
97 	if (any(id[0], "cd") && id[1] == 'f' && id[2] == 'a')
98 		id += 3;
99 	if (strcmp(file+3, id) == 0)
100 		return (1);
101 	/*
102 	 * Now check for matching filename 'B', 'F' or id 'L'
103 	 */
104 	dfb = fopen(file, "r");
105 	if (dfb == NULL)
106 		return (0);
107 	while (getline()) switch (line[0]) {
108 
109 	case 'L':
110 	case 'B':
111 	case 'F':
112 	case 'T':
113 		if (strcmp(line+1, pattern) == 0) {
114 			fclose(dfb);
115 			return (1);
116 		}
117 		continue;
118 	}
119 	fclose(dfb);
120 	return (0);
121 }
122 
123 any(c, cp)
124 	char c;
125 	register char *cp;
126 {
127 
128 	while (*cp)
129 		if (c == *cp++)
130 			return (1);
131 	return (0);
132 }
133 
134 getline()
135 {
136 	register int i, c;
137 
138 	i = 0;
139 	while ((c = getc(dfb)) != '\n') {
140 		if (c <= 0)
141 			return(0);
142 		if (i < 100)
143 			line[i++] = c;
144 	}
145 	line[i++] = 0;
146 	return (1);
147 }
148