|
|
1.1 root 1: #include <signal.h>
2: #include <sys/types.h>
3: #include <sys/stat.h>
4:
5: #define ONL 0
6: #define TOSS 1
7: int INCHAR = 0; /*index of incremented character in
8: temporary file names. */
9:
10: char version[] = "Version 2/6/79";
11:
12: char grade;
13: char remote[]= "$ remote **,onl";
14: char toss[] = "$ sysout toss";
15: int remotsw; /*toss-output flag*/
16: char *mailfile = 0;
17: char wantmail = 0;
18: char *pp = 0; /*recipient of mail*/
19: char *identf = 0; /*ident card info*/
20: int uidf = 0;
21: char gcosid[13]; /*gcos userid*/
22: char cpflag = 'l'; /*copy/link flag*/
23: int rmflag = 0; /*remove flag*/
24: int debug = 0;
25: int gcdebug = 0; /*GCOS debug switch*/
26: int archsw = 0; /*archive switch*/
27:
28: int argc;
29: char **argv;
30: char *arg;
31: char buf[80]; /*used by card */
32: int nact = 0; /*number of non-null files to process.*/
33: int gsize = 20; /*size of current file in GCOS blocks.*/
34: long usize = 20*1200; /*size of current file in bytes.*/
35: FILE *tff; /*temporary control card file*/
36: FILE *nfile();
37: char *getarg();
38: char *sprintf();
39:
40:
41: comopt(o) /*routine to test for common options.*/
42: char o;
43: {
44: switch (o){
45:
46: case 'c':
47: cpflag = 'c';
48: break;
49:
50: case 'i':
51: identf = getarg('i');
52: break;
53:
54: case 'm':
55: wantmail++;
56: if(arg[2])
57: pp = &arg[2];
58: break;
59:
60: case 'n': /*new option to suppress mail. MRW*/
61: wantmail = 0;
62: break;
63:
64: case 'o':
65: remotsw = ONL;
66: break;
67:
68: case 'r':
69: rmflag++;
70: break;
71:
72: case 's':
73: if(arg[2] < '1' || arg[2] > '3')
74: goto unknown;
75: grade = arg[2];
76: break;
77:
78: case 't':
79: if(arg[2])
80: goto unknown;
81: remotsw = TOSS;
82: break;
83:
84: case '#':
85: debug = 1;
86: break;
87:
88: case 'Z': /*GCOS debugging switch*/
89: gcdebug = 1;
90: break;
91:
92: unknown:
93: default:
94: return(0);
95: }
96: return(1);
97: }
98:
99:
100: #if LPR == 0
101:
102: spool1() /*set up common initial GCOS control cards.*/
103: {
104: if(debug)
105: tff = stdout;
106: else
107: if((tff = nfile(tfname)) == NULL){
108: fprintf(stderr, "%s: Can't create %s.\n", NAME, tfname);
109: out();
110: }
111: card('S', "");
112: card('L', sprintf(buf, "$ sgrade %c %s", grade, version ) );
113: if(ident())
114: out();
115: card('L', remote);
116: if(remotsw == TOSS)
117: card('L', toss);
118: }
119:
120:
121: spool2() /*add final control cards, and spool job.*/
122: {
123: if(wantmail)
124: card('N', mailfile);
125: card('L', "$ endjob");
126: if(debug)
127: out();
128: fclose(tff);
129: if(nact) {
130: dfname[INCHAR]++;
131: if(link(tfname, dfname) < 0){
132: fprintf(stderr, "%s: Cannot rename %s\n", NAME, tfname);
133: out();
134: }
135: unlink(tfname);
136: execl("/usr/lib/dpd", "dpd", 0);
137: execl("/etc/dpd", "dpd", 0);
138: fprintf(stderr, "%s: Can't find dpd.\nFiles left in spooling dir.\n", NAME);
139: exit(1);
140: }
141: }
142:
143: #endif
144:
145:
146: #if FGET == 0
147:
148: filargs() /*process file arguments for dpr, gcat, fsend, lpr.*/
149: {
150: int i;
151: FILE *f;
152:
153: if(argc == 1){
154: if(mailfile == 0)
155: mailfile = "pipe.end";
156: if(copy(stdin, mailfile, GCAT) == -1)
157: out();
158: if(archsw)
159: archive();
160: }
161: while(--argc) {
162: arg = *++argv;
163: switch(cpflag){
164:
165: case 'l':
166: if(lfname[INCHAR]++ >= 'z')
167: cpflag = rmflag ? 'c' : 'n';
168: else if(link(arg, lfname) == 0){
169: if(size(arg,arg) <= 0)
170: continue;
171: nuact(arg);
172: card(BF, lfname);
173: card('U', lfname);
174: break;
175: }
176:
177: case 'n':
178: if(*arg == '/' && !rmflag){
179: if(size(arg,arg) <= 0)
180: continue;
181: nuact(arg);
182: card(BF, arg);
183: break;
184: }
185:
186: case 'c':
187: f = fopen(arg, "r");
188: if(f == NULL){
189: fprintf(stderr, "%s: Cannot open %s\n", NAME, arg);
190: continue;
191: }
192: i = copy(f, arg, GCAT);
193: fclose(f);
194: if(i == -1)
195: continue;
196: break;
197: }
198: if(archsw)
199: archive();
200: if(rmflag){
201: if(unlink(arg) < 0)
202: fprintf(stderr, "%s: Cannot remove %s\n", NAME, arg);
203: }
204: if(mailfile == 0)
205: mailfile = arg;
206: }
207: }
208:
209: #endif
210:
211:
212: FILE *nfile(name) /*generate a new file name, and open file.*/
213: char *name;
214: {
215: FILE *f;
216:
217: if(name[INCHAR] >= 'z')
218: return(NULL);
219: name[INCHAR]++;
220: if(!access(name, 0) || (f = fopen(name, "w")) == NULL)
221: return(NULL);
222: return(f);
223: }
224:
225: #if FGET == 0
226:
227: copy(f, gname, gcatsw)
228: FILE *f;
229: char *gname;
230: int gcatsw;
231: {
232: int c;
233: FILE *ff;
234: long cnt;
235:
236: if((ff = nfile(cfname)) == NULL){
237: fprintf(stderr, "%s: Too many copy files; %s not copied\n", NAME, gname);
238: return(-1);
239: }
240: cnt = 0;
241: while((c = getc(f)) != EOF){
242: if(gcatsw)
243: if(c != 0){
244: fprintf(stderr, "%s: Bad input from %s.\n", NAME, gname);
245: out();
246: }else gcatsw = 0;
247: if((putc(c, ff) == EOF) && ferror(ff)){
248: fprintf(stderr, "%s: Write error on copy of %s.\n", NAME, gname);
249: break;
250: }
251: cnt++;
252: if(cnt > MAXCOPY){
253: fprintf(stderr, "%s: Copy file %s is too large\n", NAME, gname);
254: fprintf(ff, "\nFile too long, output truncated.\n\f");
255: break;
256: }
257: }
258: fclose(ff);
259: if(size(cfname,gname) <= 0)
260: return(-1);
261: nuact(gname);
262: card(BF, cfname);
263: card('U', cfname);
264: return(0);
265: }
266:
267: #endif
268:
269: card(c, s)
270: int c;
271: char *s;
272: {
273: putc( c, tff );
274:
275: while( (c = *s++) != '\0') putc( c, tff );
276:
277: c = putc( '\n', tff );
278:
279: if(c == EOF){
280: fprintf(stderr, "%s: Error writing control file.\n", NAME);
281: out();
282: }
283: }
284:
285: size(file, name)
286: char *file, *name;
287: {
288: struct stat stbuf;
289:
290: if(stat(file,&stbuf) < 0){
291: fprintf(stderr, "%s: Cannot open %s\n", NAME, file);
292: return(-1);
293: }
294: if(!stbuf.st_size){
295: fprintf(stderr, "%s: File %s is empty.\n", NAME, name);
296: return(0);
297: }
298: usize = stbuf.st_size;
299: gsize = usize / 1200;
300: gsize++;
301: nact++;
302: return(gsize);
303: }
304:
305:
306: char *
307: getarg(c) /*get modifier for complex options --
308: from either same or next argument. MRW
309: e.g. either "-ffile" or "-f file"*/
310: char c;
311: {
312:
313: if(arg[2])
314: return(&arg[2]);
315: else if(--argc>1)
316: return(arg = (++argv)[1]);
317: fprintf(stderr, "%s: Incomplete -%c option\n", NAME,c);
318: out();
319: }
320:
321: #include <pwd.h>
322: struct passwd *getpwuid();
323:
324: ident()
325: {
326: int c, i, j, n, test, jsave;
327: struct passwd *b1;
328: static char b2[100];
329:
330: if((b1 = getpwuid(getuid())) == NULL) {
331: fprintf(stderr, "%s: Invalid user id\n", NAME);
332: return(1);
333: }
334: j = 0;
335: #if LPR == 0
336: while(c = "$ ident "[j])
337: b2[j++] = c;
338:
339: i = 0;
340: if(identf)
341: while(c = identf[i++])
342: b2[j++] = c;
343: else{
344: jsave = j; /*use either usg or pwb-style passwd. MRW*/
345: while((c = b1->pw_gecos[i++]) && c != ':')
346: if(c == ')')
347: j = jsave;
348: else
349: b2[j++] = c;
350: }
351: b2[j++] = ',';
352: #endif
353:
354: i = 0;
355: if(!pp)
356: pp = &b2[j];
357: while(c = b1->pw_name[i++])
358: b2[j++] = c;
359: b2[j] = '\0';
360:
361: #if LPR == 0
362: i = 0;
363: n = 3;
364: while(--n) {
365: test = 0;
366: while((c=b2[i++]) && c != ',') {
367: if('0' <= c && c <= '9') test += c -'0';
368: else test = 0;
369: }
370: if(test == 0) {
371: b2[j] = '\0';
372: fprintf(stderr, "%s: Invalid IDENT information - %s\n", NAME, b2);
373: return (1);
374: }
375: }
376:
377: if(!uidf) {
378: n = 0;
379: while((c = b2[i++]) && c != ',') {
380: if(n >= 12) break;
381: gcosid[n++] = c;
382: }
383: gcosid[n++] = '\0';
384: }
385: #endif
386: card('L', b2);
387: if(wantmail){
388: card('M',pp);
389: if(identf)
390: card('Q', b2); /*mail back $IDENT card.*/
391: }
392: return (0);
393: }
394:
395: pidfn() /*rewrite using mktemp. MRW*/
396: {
397: int out();
398:
399: while(tfname[INCHAR] != 'X')
400: INCHAR++;
401: INCHAR--;
402: mktemp(cfname);
403: mktemp(dfname);
404: mktemp(lfname);
405: mktemp(tfname);
406: mktemp(zfname);
407: if(signal(SIGHUP, SIG_IGN) != SIG_IGN)
408: signal(SIGHUP, out);
409: if(signal(SIGINT, SIG_IGN) != SIG_IGN)
410: signal(SIGINT, out);
411: if(signal(SIGQUIT, SIG_IGN) != SIG_IGN)
412: signal(SIGQUIT, out);
413: if(signal(SIGTERM, SIG_IGN) != SIG_IGN)
414: signal(SIGTERM, out);
415: }
416:
417: out()
418: {
419: register i;
420:
421: signal(SIGHUP, SIG_IGN);
422: signal(SIGINT, SIG_IGN);
423: signal(SIGQUIT, SIG_IGN);
424: signal(SIGTERM, SIG_IGN);
425: i = INCHAR;
426: for(; cfname[i] != FIRSTCHAR; cfname[i]--)
427: unlink(cfname);
428: if(dfname[i] != FIRSTCHAR)
429: unlink(dfname);
430: for(; lfname[i] != FIRSTCHAR; lfname[i]--)
431: unlink(lfname);
432: if(tfname[i] != FIRSTCHAR)
433: unlink(tfname);
434: for(; zfname[i] != FIRSTCHAR; zfname[i]--)
435: unlink(zfname);
436: exit(1);
437: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.