|
|
1.1 root 1: #include <signal.h>
2: #include <pagsiz.h>
3:
4: #define BUFSIZ BSIZE
5: /*
6: * lpr -- on-line printer spooler
7: */
8:
9: char tfname[] = "/usr/spool/lpd/tfaXXXXX";
10: char cfname[] = "/usr/spool/lpd/cfaXXXXX";
11: char lfname[] = "/usr/spool/lpd/lfaXXXXX";
12: char dfname[] = "/usr/spool/lpd/dfaXXXXX";
13: int nact;
14: int tff;
15: int mailflg;
16: char person[10];
17: int inchar;
18: int maxrec = 400;
19:
20: main(argc, argv)
21: int argc;
22: char *argv[];
23: {
24: register char *arg, *remote;
25: int c, f, flag;
26: int out();
27:
28: pidfn();
29: if (signal(SIGINT, SIG_IGN) == SIG_DFL)
30: signal(SIGINT, out);
31: if (signal(SIGQUIT, SIG_IGN) == SIG_DFL)
32: signal(SIGQUIT, out);
33: if (signal(SIGHUP, SIG_IGN) == SIG_DFL)
34: signal(SIGHUP, out);
35: if (signal(SIGTERM, SIG_IGN) == SIG_DFL)
36: signal(SIGTERM, out);
37: remote = "$ remote **,onl";
38: flag = 0;
39: tff = nfile(tfname);
40: while (argc>1 && (arg = argv[1])[0]=='-') {
41: if (arg[1] && arg[2]) {
42: remote[12] = arg[1];
43: remote[13] = arg[2];
44: remote[14] = 0;
45: } else switch (arg[1]) {
46:
47: case '-':
48: remote[12] = 'r';
49: remote[13] = '1';
50: remote[14] = '\0';
51: break;
52:
53: case 'c':
54: flag = '+';
55: break;
56:
57: case 'r':
58: flag = '-';
59: break;
60:
61: case 'm':
62: mailflg = 1;
63: break;
64: }
65: argc--;
66: argv++;
67: }
68: ident();
69: if(argc == 1)
70: copy(0);
71: while(--argc) {
72: arg = *++argv;
73: if(flag == '+')
74: goto cf;
75: /*
76: * This may not work because the daemon runs as someone else, so don't bother
77: if(*arg == '/' && flag != '-') {
78: card('F', arg);
79: nact++;
80: continue;
81: }
82: */
83: if(link(arg, lfname) < 0)
84: goto cf;
85: card('F', lfname);
86: card('U', lfname);
87: lfname[inchar]++;
88: nact++;
89: goto df;
90:
91: cf:
92: f = open(arg, 0);
93: if(f < 0) {
94: printf("Cannot open %s\n", arg);
95: continue;
96: }
97: copy(f);
98: close(f);
99:
100: df:
101: if(flag == '-') {
102: f = unlink(arg);
103: if(f < 0)
104: printf("Cannot remove %s\n", arg);
105: }
106: }
107:
108: if(nact) {
109: tfname[inchar]--;
110: f = link(tfname, dfname);
111: if(f < 0) {
112: printf("Cannot rename %s\n", dfname);
113: tfname[inchar]++;
114: out();
115: }
116: unlink(tfname);
117: execl("/usr/lib/lpd", "lpd", 0);
118: dfname[inchar]++;
119: printf("Daemon doesn't exist\n");
120: exit(0);
121: }
122: out();
123: }
124:
125: copy(f)
126: int f;
127: {
128: int ff, i, nr, nc;
129: static char buf[BUFSIZ];
130:
131: card('F', cfname);
132: card('U', cfname);
133: ff = nfile(cfname);
134: nc = 0;
135: nr = 0;
136: while((i = read(f, buf, BUFSIZ)) > 0) {
137: write(ff, buf, i);
138: nc += i;
139: if(nc >= BUFSIZ) {
140: nc -= BUFSIZ;
141: nr++;
142: if(nr > maxrec) {
143: printf("Copy file is too large\n");
144: break;
145: }
146: }
147: }
148: close(ff);
149: nact++;
150: }
151:
152: card(c, s)
153: int c;
154: char s[];
155: {
156: char *p1, *p2;
157: static char buf[BUFSIZ];
158: int col;
159:
160: p1 = buf;
161: p2 = s;
162: col = 0;
163: *p1++ = c;
164: while((c = *p2++) != '\0') {
165: *p1++ = c;
166: col++;
167: }
168: *p1++ = '\n';
169: write(tff, buf, col+2);
170: }
171:
172: ident()
173: {
174: int c, n;
175: register char *b1p, *pp, *b2p;
176: static char b1[100], b2[100];
177:
178: b1p = b1;
179: if(getpw(getuid(), b1p)) {
180: b1p = "pdp::::m0000,m000:";
181: }
182: n = 0;
183: b2p = b2;
184: while(*b2p++ = "$ ident "[n++]);
185: b2p--;
186: n = 5;
187: while(--n) while(*b1p++ != ':');
188: while((*b2p++ = *b1p++) != ':');
189: b2p[-1] = ',';
190: b1p = b1;
191: pp = person;
192: while((c = *b1p++) != ':') {
193: *b2p++ = c;
194: *pp++ = c;
195: }
196: *b2p++ = 0;
197: *pp++ = 0;
198: card('L', person);
199: if (mailflg)
200: card('M', person);
201: }
202:
203: pidfn()
204: {
205: register i, j, c;
206: int s;
207: int p;
208:
209: s = p = getpid();
210: p &= 077777;
211: i = 0;
212: while(tfname[i] != 'X')
213: i++;
214: i += 4;
215: for(j=0; j<5; j++) {
216: c = (p%10) + '0';
217: if(s<0 && j==4)
218: c += 4;
219: p /= 10;
220: tfname[i] = c;
221: cfname[i] = c;
222: lfname[i] = c;
223: dfname[i] = c;
224: i--;
225: }
226: inchar = i;
227: }
228:
229: nfile(name)
230: char *name;
231: {
232: register f;
233:
234: f = creat(name, 0644);
235: if(f < 0) {
236: printf("Cannot create %s\n", name);
237: out();
238: }
239: name[inchar]++;
240: return(f);
241: }
242:
243: out()
244: {
245: register i;
246:
247: signal(SIGINT, SIG_IGN);
248: signal(SIGQUIT, SIG_IGN);
249: signal(SIGHUP, SIG_IGN);
250: signal(SIGTERM, SIG_IGN);
251: i = inchar;
252: while(tfname[i] != 'a') {
253: tfname[i]--;
254: unlink(tfname);
255: }
256: while(cfname[i] != 'a') {
257: cfname[i]--;
258: unlink(cfname);
259: }
260: while(lfname[i] != 'a') {
261: lfname[i]--;
262: unlink(lfname);
263: }
264: while(dfname[i] != 'a') {
265: dfname[i]--;
266: unlink(dfname);
267: }
268: exit(0);
269: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.