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