Bell 32V development
[unix-history] / usr / src / cmd / dpr.c
CommitLineData
3b600ead
TL
1#include <signal.h>
2/*
3 * dpr -- off line print via dataphone daemon to GCOS
4 * normally invoked through opr
5 */
6
7char tfname[] = "/usr/dpd/tfaXXXXX";
8char cfname[] = "/usr/dpd/cfaXXXXX";
9char lfname[] = "/usr/dpd/lfaXXXXX";
10char dfname[] = "/usr/dpd/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 card('S', "");
65 card('L', "$ sgrade 2");
66 ident();
67 card('L', remote);
68 card('L', "$ select ken/mh322");
69 card('L', "$ data i*,ncksum,copy");
70
71 if(argc == 1)
72 copy(0);
73 while(--argc) {
74 arg = *++argv;
75 if(flag == '+')
76 goto cf;
77 if(*arg == '/' && flag != '-') {
78 card('F', arg);
79 nact++;
80 continue;
81 }
82 if(link(arg, lfname) < 0)
83 goto cf;
84 card('F', lfname);
85 card('U', lfname);
86 lfname[inchar]++;
87 nact++;
88 goto df;
89
90 cf:
91 f = open(arg, 0);
92 if(f < 0) {
93 printf("Cannot open %s\n", arg);
94 continue;
95 }
96 copy(f);
97 close(f);
98
99 df:
100 if(flag == '-') {
101 f = unlink(arg);
102 if(f < 0)
103 printf("Cannot remove %s\n", arg);
104 }
105 }
106
107 card('L', "$ endcopy");
108 card('L', "$ endjob");
109 if(nact) {
110 tfname[inchar]--;
111 f = link(tfname, dfname);
112 if(f < 0) {
113 printf("Cannot rename %s\n", dfname);
114 tfname[inchar]++;
115 out();
116 }
117 unlink(tfname);
118 execl("/etc/dpd", "dpd", 0);
119 dfname[inchar]++;
120 }
121 out();
122}
123
124copy(f)
125int f;
126{
127 int ff, i, nr, nc;
128 static int buf[256];
129
130 card('F', cfname);
131 card('U', cfname);
132 ff = nfile(cfname);
133 nc = 0;
134 nr = 0;
135 while((i = read(f, buf, 512)) > 0) {
136 write(ff, buf, i);
137 nc += i;
138 if(nc >= 512) {
139 nc -= 512;
140 nr++;
141 if(nr > maxrec) {
142 printf("Copy file is too large\n");
143 break;
144 }
145 }
146 }
147 close(ff);
148 nact++;
149}
150
151card(c, s)
152int c;
153char s[];
154{
155 char *p1, *p2;
156 static char buf[512];
157 int col;
158
159 p1 = buf;
160 p2 = s;
161 col = 0;
162 *p1++ = c;
163 while((c = *p2++) != '\0') {
164 *p1++ = c;
165 col++;
166 }
167 *p1++ = '\n';
168 write(tff, buf, col+2);
169}
170
171ident()
172{
173 int c, n;
174 register char *b1p, *pp, *b2p;
175 static char b1[100], b2[100];
176
177 b1p = b1;
178 if(getpw(getuid(), b1p)) {
179 b1p = "pdp::::m0000,m000:";
180 }
181 n = 0;
182 b2p = b2;
183 while(*b2p++ = "$ ident "[n++]);
184 b2p--;
185 n = 5;
186 while(--n) while(*b1p++ != ':');
187 while((*b2p++ = *b1p++) != ':');
188 b2p[-1] = ',';
189 b1p = b1;
190 pp = person;
191 while((c = *b1p++) != ':') {
192 *b2p++ = c;
193 *pp++ = c;
194 }
195 *b2p++ = 0;
196 *pp++ = 0;
197 card('L', b2);
198 if (mailflg)
199 card('M', person);
200}
201
202pidfn()
203{
204 register i, j, c;
205 int s;
206 int p;
207
208 s = p = getpid();
209 p &= 077777;
210 i = 0;
211 while(tfname[i] != 'X')
212 i++;
213 i += 4;
214 for(j=0; j<5; j++) {
215 c = (p%10) + '0';
216 if(s<0 && j==4)
217 c += 4;
218 p /= 10;
219 tfname[i] = c;
220 cfname[i] = c;
221 lfname[i] = c;
222 dfname[i] = c;
223 i--;
224 }
225 inchar = i;
226}
227
228nfile(name)
229char *name;
230{
231 register f;
232
233 f = creat(name, 0666);
234 if(f < 0) {
235 printf("Cannot create %s\n", name);
236 out();
237 }
238 name[inchar]++;
239 return(f);
240}
241
242out()
243{
244 register i;
245
246 signal(SIGHUP, SIG_IGN);
247 signal(SIGINT, SIG_IGN);
248 signal(SIGQUIT, SIG_IGN);
249 i = inchar;
250 while(tfname[i] != 'a') {
251 tfname[i]--;
252 unlink(tfname);
253 }
254 while(cfname[i] != 'a') {
255 cfname[i]--;
256 unlink(cfname);
257 }
258 while(lfname[i] != 'a') {
259 lfname[i]--;
260 unlink(lfname);
261 }
262 while(dfname[i] != 'a') {
263 dfname[i]--;
264 unlink(dfname);
265 }
266 exit(0);
267}