|
|
1.1 root 1: /*
2: * Line printer queue
3: */
4:
5: #include <sys/types.h>
6: #include <dir.h>
7: #include <stat.h>
8: #include <stdio.h>
9: #include <sccs.h>
10:
11: #define MAXJOBS 100
12:
13: struct dir dirent;
14: struct stat stbuf;
15: char lpddir[] = "/usr/spool/lpd";
16: int nextflag;
17: int linecnt;
18: FILE *df;
19: FILE *jf;
20: char line[100];
21: char username[10];
22: int cnt;
23: int isdown;
24:
25: main()
26: {
27:
28: if (access("/usr/bin/lpr", 1) && access("/bin/lpr", 1)
29: && access("/usr/ucb/lpr", 1))
30: isdown++;
31: if (chdir(lpddir) < 0) {
32: perror(lpddir);
33: exit(1);
34: }
35: oloop:
36: df = fopen(".", "r");
37: if (df == NULL) {
38: perror(lpddir);
39: exit(1);
40: }
41: loop:
42: fseek(df, 0l, 0);
43: linecnt = 0;
44: cnt = 0;
45: while (fread(&dirent, sizeof dirent, 1, df) == 1) {
46: if (dirent.d_ino == 0)
47: continue;
48: if (dirent.d_name[0] != 'd')
49: continue;
50: if (dirent.d_name[1] != 'f')
51: continue;
52: if (stat(dirent.d_name, &stbuf) < 0)
53: continue;
54: if (cnt == 0)
55: printf("Owner\t Id Chars Filename\n");
56: cnt++;
57: process();
58: }
59: if (cnt == 0) {
60: if (isdown)
61: printf("Line printer is down.\n");
62: else
63: printf("Line printer queue is empty.\n");
64: }
65: exit(0);
66: }
67:
68: process()
69: {
70:
71: jf = fopen(dirent.d_name, "r");
72: if (jf == NULL)
73: return;
74: while (getline()) {
75: switch (line[0]) {
76:
77: case 'L':
78: strcpy(username, line+1);
79: break;
80:
81: case 'B':
82: case 'F':
83: if (stat(line+1, &stbuf) < 0)
84: stbuf.st_size = 0;
85: printf("%-10s%5s%8d %s\n", username, dirent.d_name+3,
86: stbuf.st_size, line+1);
87: break;
88: }
89: }
90: close(jf);
91: }
92:
93: getline()
94: {
95: register int i, c;
96:
97: i = 0;
98: while ((c = getc(jf)) != '\n') {
99: if (c <= 0)
100: return(0);
101: if (i < 100)
102: line[i++] = c;
103: }
104: line[i++] = 0;
105: return (1);
106: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.