|
|
1.1 root 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 all;
9: char vpddir[] = "/usr/vpd";
10: FILE *df;
11: FILE *dfb;
12:
13: main(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:
38: clobber(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:
68: chkclob(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:
102: any(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:
113: getline()
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.