|
|
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 lpddir[] = "/usr/spool/lpd";
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(lpddir) < 0)
22: perror(lpddir), exit(1);
23: df = fopen(".", "r");
24: if (df == NULL)
25: perror(lpddir), exit(1);
26: argc--, argv++;
27: if (argc == 0) {
28: printf("usage: lprm [ 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[0] = 'l'; unlink(dirent.d_name);
58: dirent.d_name[0] = 't'; unlink(dirent.d_name);
59: dirent.d_name[0] = 'd';
60: }
61: }
62: if (did == 0)
63: fprintf(stderr, "%s: nothing to remove\n", cp);
64: }
65:
66: chkclob(pattern, file)
67: char *pattern, *file;
68: {
69: register char *id = pattern;
70:
71: /*
72: * Quick check for matching id
73: */
74: if (any(id[0], "cd") && id[1] == 'f' && id[2] == 'a')
75: id += 3;
76: if (strcmp(file+3, id) == 0)
77: return (1);
78: /*
79: * Now check for matching filename 'B', 'F' or id 'L'
80: */
81: dfb = fopen(file, "r");
82: if (dfb == NULL)
83: return (0);
84: while (getline()) switch (line[0]) {
85:
86: case 'L':
87: case 'B':
88: case 'F':
89: if (strcmp(line+1, pattern) == 0) {
90: fclose(dfb);
91: return (1);
92: }
93: continue;
94: }
95: fclose(dfb);
96: return (0);
97: }
98:
99: any(c, cp)
100: char c;
101: register char *cp;
102: {
103:
104: while (*cp)
105: if (c == *cp++)
106: return (1);
107: return (0);
108: }
109:
110: getline()
111: {
112: register int i, c;
113:
114: i = 0;
115: while ((c = getc(dfb)) != '\n') {
116: if (c <= 0)
117: return(0);
118: if (i < 100)
119: line[i++] = c;
120: }
121: line[i++] = 0;
122: return (1);
123: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.