|
|
1.1 root 1: #include <stdio.h>
2:
3: /*
4: * fget -- spooler to get file from GCOS
5: */
6:
7:
8: #define DPR 0
9: #define FGET 1
10: #define FSEND 0
11: #define GCAT 0
12: #define LPR 0
13:
14: #define NAME "fget"
15: #define MAXCOPY 204800L
16: #define FIRSTCHAR 't'-1
17: #define CARDSIZE 130
18:
19: char cfname[] = "/usr/spool/dpd/cfsXXXXX";
20: char dfname[] = "/usr/spool/dpd/dfsXXXXX";
21: char lfname[] = "/usr/spool/dpd/lfsXXXXX";
22: char tfname[] = "/usr/spool/dpd/tfsXXXXX";
23: char zfname[] = "/usr/spool/dpd/zfsXXXXX";
24:
25: char *fzf;
26: FILE *pfdes;
27: char wdir[BUFSIZ];
28: FILE *uff;
29: char fname[CARDSIZE] /* unix file name */;
30: char *fmode;
31:
32: #include "spool.c"
33: #include "gcos.c"
34:
35: main(agc, agv)
36: int agc;
37: char *agv[];
38: {
39: extern FILE *popen();
40: int fi, i, j, nslash, c;
41: int time;
42: int poff, foff;
43:
44: argc = agc;
45: argv = agv;
46: pidfn();
47: remotsw = TOSS; /*default is toss online output*/
48: wantmail = 1; /*default is send mail.*/
49: grade = '1';
50: fmode = "a";
51: fi = 0;
52: foff = 0;
53: poff = 0;
54:
55: while (argc>1 && (arg = argv[1])[0]=='-') {
56: if(!comopt(arg[1]))
57: switch (arg[1]) {
58:
59: case 'a':
60: fmode = "a";
61: break;
62:
63: case 'b':
64: fmode = "b";
65: break;
66:
67: case 'd':
68: arg = getarg('d');
69: while((fname[fi] = arg[fi])) ++fi;
70: fname[fi++] = '/';
71: break;
72:
73: case 'u':
74: arg = getarg('u');
75: i = 0;
76: while((gcosid[i] = arg[i]))
77: if(++i > 12) {
78: gcosid[i] = '\0';
79: break;
80: }
81: uidf = 1;
82: break;
83:
84: default:
85: fprintf(stderr, "%s: Unrecognized option: %s\n", NAME, arg);
86: break;
87: }
88: argc--;
89: argv++;
90: }
91:
92: spool1(); /*setup initial GCOS cards.*/
93: card('L',"$ select cc/unixsupport/access");
94: if(gcdebug)
95: card('L',"$ select cc/test/fget");
96: else
97: card('L',"$ select cc/unixsupport/fget");
98: card('L',fget_id);
99: while(--argc) {
100: arg = *++argv;
101: if(mailfile == 0)
102: mailfile = arg;
103: /* extract a unix file name */
104:
105: i = 0;
106: foff = fi;
107: nslash = 0;
108: while((c = argv[0][i++]) != '\0') {
109: if(c == '/') {
110: nslash++;
111: foff = fi;
112: continue;
113: }
114: fname[foff++] = c;
115: }
116: fname[foff++] = '\0';
117: fname[fi+12] = '\0';
118:
119: /* create the ultimate output file */
120:
121: if(debug == 0){
122: if((uff = fopen(fname, "w")) == NULL) {
123: fprintf(stderr, "%s: Cannot create %s\n", NAME,fname);
124: continue;
125: }
126: chmod(fname,0666); /*insure file writeable by daemon. MRW*/
127: }
128:
129: /* now make a link for the dpd */
130:
131: if(zfname[INCHAR] < 'z') /*don't create file names past 'z'. MRW*/
132: zfname[INCHAR]++;
133: fzf = zfname;
134: if(link(fname, fzf) != 0){
135: if( fi > 0 ) {
136: fzf = fname;
137: }
138:
139: else{
140: if(poff == 0){
141: if((pfdes = popen("pwd", "r")) != NULL){
142: int c;
143: while ((c = getc(pfdes)) != EOF)
144: wdir[poff++] = c;
145: pclose(pfdes);
146: wdir[poff-1] = '/';
147: }
148: }
149: if(wdir[0] != '/') {
150: fprintf(stderr, "%s: Cannot find directory pathname\n", NAME);
151: goto cleanup;
152: }
153: i = poff;
154: j = 0;
155: while ( wdir[i++] = fname[j++]);
156: if(link(wdir, fzf) != 0) fzf = wdir;
157: }
158: }
159:
160: card('L', sprintf(buf, "%s %s%s%s %s",
161: fmode,
162: (nslash == 0 || *arg == '/') ? gcosid : "",
163: (nslash == 0) ? "/" : "",
164: arg,
165: fzf ) );
166:
167: if(debug == 0){
168: i = 2;
169: while((putc(buf[i++], uff)) != '\0') ;
170: c = putc( '\n', uff );
171: if(c == EOF){
172: fprintf(stderr, "%s: Error writing %s\n", NAME, fname);
173: break;
174: }
175: fclose(uff);
176: }
177: nact++;
178:
179: }
180: if(fork() != 0){
181: spool2(); /*put out final cards, and spool job.*/
182: out();
183: }
184:
185: signal(SIGHUP, SIG_IGN);
186: signal(SIGINT, SIG_IGN);
187: signal(SIGQUIT, SIG_IGN);
188: dfname[INCHAR]++;
189: for( time = 4 ; time < 200 ; time += time ) {
190: sleep(time);
191: if(access(dfname, 0) != 0) break;
192: }
193:
194: execl("/usr/lib/fget.demon", "fget.demon", 0);
195: execl("/etc/fget.demon", "fget.demon", 0);
196: fprintf(stderr, "%s: Execl of fget.demon failed.\n", NAME);
197: exit(1);
198:
199: cleanup:
200: out();
201: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.