BSD 4 development
[unix-history] / usr / src / cmd / lpr / lpr.c
CommitLineData
a803098c
BJ
1#include <signal.h>
2#include <pagsiz.h>
3
4#define BUFSIZ BSIZE
5/*
6 * lpr -- on-line printer spooler
7 */
8
9char tfname[] = "/usr/spool/lpd/tfaXXXXX";
10char cfname[] = "/usr/spool/lpd/cfaXXXXX";
11char lfname[] = "/usr/spool/lpd/lfaXXXXX";
12char dfname[] = "/usr/spool/lpd/dfaXXXXX";
13int nact;
14int tff;
15int mailflg;
16char person[10];
17int inchar;
18int maxrec = 400;
19
20main(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
125copy(f)
126int 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
152card(c, s)
153int c;
154char 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
172ident()
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
203pidfn()
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
229nfile(name)
230char *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
243out()
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}