|
|
1.1 root 1: #include <sys/types.h>
2: #include <dir.h>
3: #include <stat.h>
4: #include <stdio.h>
5: #include <sccs.h>
6:
7: SCCSID(@(#)lprm.c 1.2)
8:
9: char line[128];
10: int linel;
11: int all;
12: char lpddir[] = "/usr/spool/lpd";
13: FILE *df;
14: FILE *dfb;
15:
16: main(argc, argv)
17: int argc;
18: char *argv[];
19: {
20: register int i;
21: register char *ap, *cp;
22: int cnt;
23:
24: if (chdir(lpddir) < 0)
25: perror(lpddir), exit(1);
26: df = fopen(".", "r");
27: if (df == NULL)
28: perror(lpddir), exit(1);
29: argc--, argv++;
30: if (argc == 0) {
31: printf("usage: lprm [ id ... ] [ filename ... ] [ user ... ]\n");
32: exit(1);
33: }
34: do {
35: if (strcmp(*argv, "-a") == 0)
36: all++;
37: clobber(*argv++);
38: } while (--argc);
39: }
40:
41: clobber(cp)
42: char *cp;
43: {
44: struct dir dirent;
45: int did = 0;
46:
47: rewind(df);
48: while (fread(&dirent, sizeof dirent, 1, df) == 1) {
49: if (dirent.d_ino == 0)
50: continue;
51: if (dirent.d_name[0] != 'd' || dirent.d_name[1] != 'f')
52: continue;
53: if (dirent.d_name[7] == 0 || dirent.d_name[8] != 0)
54: continue;
55: if (chkclob(cp, dirent.d_name)) {
56: did++;
57: printf("removing %s\n", dirent.d_name+3);
58: unlink(dirent.d_name);
59: dirent.d_name[0] = 'c'; unlink(dirent.d_name);
60: dirent.d_name[0] = 'l'; unlink(dirent.d_name);
61: dirent.d_name[0] = 't'; unlink(dirent.d_name);
62: dirent.d_name[0] = 'd';
63: }
64: }
65: if (did == 0)
66: fprintf(stderr, "%s: nothing to remove\n", cp);
67: }
68:
69: chkclob(pattern, file)
70: char *pattern, *file;
71: {
72: register char *id = pattern;
73:
74: /*
75: * Quick check for matching id
76: */
77: if (any(id[0], "cd") && id[1] == 'f' && id[2] == 'a')
78: id += 3;
79: if (strcmp(file+3, id) == 0)
80: return (1);
81: /*
82: * Now check for matching filename 'B', 'F' or id 'L'
83: */
84: dfb = fopen(file, "r");
85: if (dfb == NULL)
86: return (0);
87: while (getline()) switch (line[0]) {
88:
89: case 'L':
90: case 'B':
91: case 'F':
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.