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