|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)uux.c 5.1 (Berkeley) 7/2/83";
3: #endif
4:
5: /*
6: * Grade option "-g<g>" added. See cbosgd.2611 (Mark Horton)
7: * no-copy option "-c" added. Suggested by Steve Bellovin
8: * "-l" is synonym for "-c".
9: * "X" files use local system name, avoids conflict. Steve Bellovin
10: */
11: #include "uucp.h"
12:
13: #define NOSYSPART 0
14: #define HASSYSPART 1
15:
16: #define APPCMD(d) {\
17: char *p;\
18: for (p = d; *p != '\0';) *cmdp++ = *p++;\
19: *cmdp++ = ' ';\
20: *cmdp = '\0';}
21:
22: #define GENSEND(f, a, b, c, d, e) {\
23: fprintf(f, "S %s %s %s -%s %s 0666\n", a, b, c, d, e);\
24: }
25: #define GENRCV(f, a, b, c) {\
26: fprintf(f, "R %s %s %s - \n", a, b, c);\
27: }
28:
29:
30: /*
31: *
32: */
33:
34: main(argc, argv)
35: char *argv[];
36: {
37: char cfile[NAMESIZE]; /* send commands for files from here */
38: char dfile[NAMESIZE]; /* used for all data files from here */
39: char rxfile[NAMESIZE]; /* to be sent to xqt file (X. ...) */
40: char tfile[NAMESIZE]; /* temporary file name */
41: char tcfile[NAMESIZE]; /* temporary file name */
42: char t2file[NAMESIZE]; /* temporary file name */
43: int cflag = 0; /* commands in C. file flag */
44: int rflag = 0; /* C. files for receiving flag */
45: int Copy = 1; /* Copy spool files */
46: char buf[BUFSIZ];
47: char inargs[BUFSIZ];
48: int pipein = 0;
49: int startjob = 1;
50: char Grade = 'A';
51: char path[MAXFULLNAME];
52: char cmd[BUFSIZ];
53: char *ap, *cmdp;
54: char prm[BUFSIZ];
55: char syspart[8], rest[MAXFULLNAME];
56: char xsys[8], local[8];
57: FILE *fprx, *fpc, *fpd, *fp;
58: extern char *getprm(), *lastpart();
59: extern FILE *ufopen();
60: int uid, ret;
61: char redir = '\0';
62: int nonoti = 0;
63: int nonzero = 0;
64: int orig_uid = getuid();
65:
66: strcpy(Progname, "uux");
67: uucpname(Myname);
68: umask(WFMASK);
69: Ofn = 1;
70: Ifn = 0;
71: while (argc>1 && argv[1][0] == '-') {
72: switch(argv[1][1]){
73: case 'p':
74: case '\0':
75: pipein = 1;
76: break;
77: case 'r':
78: startjob = 0;
79: break;
80: case 'c':
81: case 'l':
82: Copy = 0;
83: break;
84: case 'g':
85: Grade = argv[1][2];
86: break;
87: case 'x':
88: chkdebug(orig_uid);
89: Debug = atoi(&argv[1][2]);
90: if (Debug <= 0)
91: Debug = 1;
92: break;
93: case 'n':
94: nonoti = 1;
95: break;
96: case 'z':
97: nonzero = 1;
98: break;
99: default:
100: fprintf(stderr, "unknown flag %s\n", argv[1]);
101: break;
102: }
103: --argc; argv++;
104: }
105:
106: DEBUG(4, "\n\n** %s **\n", "START");
107:
108: inargs[0] = '\0';
109: for (argv++; argc > 1; argc--) {
110: DEBUG(4, "arg - %s:", *argv);
111: strcat(inargs, " ");
112: strcat(inargs, *argv++);
113: }
114: DEBUG(4, "arg - %s\n", inargs);
115: ret = gwd(Wrkdir);
116: if (ret != 0) {
117: fprintf(stderr, "can't get working directory; will try to continue\n");
118: strcpy(Wrkdir, "/UNKNOWN");
119: }
120: subchdir(Spool);
121: uid = getuid();
122: guinfo(uid, User, path);
123:
124: sprintf(local, "%.7s", Myname);
125: cmdp = cmd;
126: *cmdp = '\0';
127: gename(DATAPRE, local, 'X', rxfile);
128: fprx = ufopen(rxfile, "w");
129: ASSERT(fprx != NULL, "CAN'T OPEN", rxfile, 0);
130: gename(DATAPRE, local, 'T', tcfile);
131: fpc = ufopen(tcfile, "w");
132: ASSERT(fpc != NULL, "CAN'T OPEN", tcfile, 0);
133: fprintf(fprx, "%c %s %s\n", X_USER, User, local);
134: if (nonoti)
135: fprintf(fprx, "%c\n", X_NONOTI);
136: if (nonzero)
137: fprintf(fprx, "%c\n", X_NONZERO);
138:
139: /* find remote system name */
140: ap = inargs;
141: xsys[0] = '\0';
142: while ((ap = getprm(ap, prm)) != NULL) {
143: if (prm[0] == '>' || prm[0] == '<') {
144: ap = getprm(ap, prm);
145: continue;
146: }
147:
148:
149: split(prm, xsys, rest);
150: break;
151: }
152: if (xsys[0] == '\0')
153: strcpy(xsys, local);
154: sprintf(Rmtname, "%.7s", xsys);
155: DEBUG(4, "xsys %s\n", xsys);
156: if (versys(xsys) != 0) {
157: /* bad system name */
158: fprintf(stderr, "bad system name: %s\n", xsys);
159: fclose(fprx);
160: fclose(fpc);
161: cleanup(EX_NOHOST);
162: }
163:
164: if (pipein) {
165: gename(DATAPRE, local, 'B', dfile);
166: fpd = ufopen(dfile, "w");
167: ASSERT(fpd != NULL, "CAN'T OPEN", dfile, 0);
168: while (!feof(stdin)) {
169: ret = fread(buf, 1, BUFSIZ, stdin);
170: fwrite(buf, 1, ret, fpd);
171: }
172: fclose(fpd);
173: if (strcmp(local, xsys) != SAME) {
174: GENSEND(fpc, dfile, dfile, User, "", dfile);
175: cflag++;
176: }
177: fprintf(fprx, "%c %s\n", X_RQDFILE, dfile);
178: fprintf(fprx, "%c %s\n", X_STDIN, dfile);
179: }
180: /* parse command */
181: ap = inargs;
182: while ((ap = getprm(ap, prm)) != NULL) {
183: DEBUG(4, "prm - %s\n", prm);
184: if (prm[0] == '>' || prm[0] == '<') {
185: redir = prm[0];
186: continue;
187: }
188:
189: if (prm[0] == ';') {
190: APPCMD(prm);
191: continue;
192: }
193:
194: if (prm[0] == '|' || prm[0] == '^') {
195: if (cmdp != cmd)
196: APPCMD(prm);
197: continue;
198: }
199:
200: /* process command or file or option */
201: ret = split(prm, syspart, rest);
202: DEBUG(4, "s - %s, ", syspart);
203: DEBUG(4, "r - %s, ", rest);
204: DEBUG(4, "ret - %d\n", ret);
205: if (syspart[0] == '\0')
206: strcpy(syspart, local);
207:
208: if (cmdp == cmd && redir == '\0') {
209: /* command */
210: APPCMD(rest);
211: continue;
212: }
213:
214: /* process file or option */
215: DEBUG(4, "file s- %s, ", syspart);
216: DEBUG(4, "local - %s\n", local);
217: /* process file */
218: if (redir == '>') {
219: if (rest[0] != '~')
220: if (ckexpf(rest))
221: cleanup(EX_CANTCREAT);
222: fprintf(fprx, "%c %s %s\n", X_STDOUT, rest,
223: syspart);
224: redir = '\0';
225: continue;
226: }
227:
228: if (ret == NOSYSPART && redir == '\0') {
229: /* option */
230: APPCMD(rest);
231: continue;
232: }
233:
234: if (strcmp(xsys, local) == SAME
235: && strcmp(xsys, syspart) == SAME) {
236: if (ckexpf(rest))
237: cleanup(EX_CANTCREAT);
238: if (redir == '<')
239: fprintf(fprx, "%c %s\n", X_STDIN, rest);
240: else
241: APPCMD(rest);
242: redir = '\0';
243: continue;
244: }
245:
246: if (strcmp(syspart, local) == SAME) {
247: /* generate send file */
248: if (ckexpf(rest))
249: cleanup(EX_CANTCREAT);
250: gename(DATAPRE, local, 'A', dfile);
251: DEBUG(4, "rest %s\n", rest);
252: if ((chkpth(User, "", rest) || anyread(rest)) != 0) {
253: fprintf(stderr, "permission denied %s\n", rest);
254: cleanup(EX_NOINPUT);
255: }
256: if (Copy) {
257: if (xcp(rest, dfile) != 0) {
258: fprintf(stderr, "can't copy %s to %s\n", rest, dfile);
259: cleanup(EX_NOINPUT);
260: }
261: GENSEND(fpc, rest, dfile, User, "", dfile);
262: }
263: else {
264: GENSEND(fpc, rest, dfile, User, "c", "D.0");
265: }
266: cflag++;
267: if (redir == '<') {
268: fprintf(fprx, "%c %s\n", X_STDIN, dfile);
269: fprintf(fprx, "%c %s\n", X_RQDFILE, dfile);
270: }
271: else {
272: APPCMD(lastpart(rest));
273: fprintf(fprx, "%c %s %s\n", X_RQDFILE,
274: dfile, lastpart(rest));
275: }
276: redir = '\0';
277: continue;
278: }
279:
280: if (strcmp(local, xsys) == SAME) {
281: /* generate local receive */
282: gename(CMDPRE, syspart, 'R', tfile);
283: strcpy(dfile, tfile);
284: dfile[0] = DATAPRE;
285: fp = ufopen(tfile, "w");
286: ASSERT(fp != NULL, "CAN'T OPEN", tfile, 0);
287: if (ckexpf(rest))
288: cleanup(EX_CANTCREAT);
289: GENRCV(fp, rest, dfile, User);
290: fclose(fp);
291: rflag++;
292: if (rest[0] != '~')
293: if (ckexpf(rest))
294: cleanup(EX_CANTCREAT);
295: if (redir == '<') {
296: fprintf(fprx, "%c %s\n", X_RQDFILE, dfile);
297: fprintf(fprx, "%c %s\n", X_STDIN, dfile);
298: }
299: else {
300: fprintf(fprx, "%c %s %s\n", X_RQDFILE, dfile,
301: lastpart(rest));
302: APPCMD(lastpart(rest));
303: }
304:
305: redir = '\0';
306: continue;
307: }
308:
309: if (strcmp(syspart, xsys) != SAME) {
310: /* generate remote receives */
311: gename(DATAPRE, syspart, 'R', dfile);
312: strcpy(tfile, dfile);
313: tfile[0] = CMDPRE;
314: fpd = ufopen(dfile, "w");
315: ASSERT(fpd != NULL, "CAN'T OPEN", dfile, 0);
316: gename(DATAPRE, local, 'T', t2file);
317: GENRCV(fpd, rest, t2file, User);
318: fclose(fpd);
319: GENSEND(fpc, dfile, tfile, User, "", dfile);
320: cflag++;
321: if (redir == '<') {
322: fprintf(fprx, "%c %s\n", X_RQDFILE, t2file);
323: fprintf(fprx, "%c %s\n", X_STDIN, t2file);
324: }
325: else {
326: fprintf(fprx, "%c %s %s\n", X_RQDFILE, t2file,
327: lastpart(rest));
328: APPCMD(lastpart(rest));
329: }
330: redir = '\0';
331: continue;
332: }
333:
334: /* file on remote system */
335: if (rest[0] != '~')
336: if (ckexpf(rest))
337: cleanup(EX_CANTCREAT);
338: if (redir == '<')
339: fprintf(fprx, "%c %s\n", X_STDIN, rest);
340: else
341: APPCMD(rest);
342: redir = '\0';
343: continue;
344:
345: }
346:
347: fprintf(fprx, "%c %s\n", X_CMD, cmd);
348: logent(cmd, "XQT QUE'D");
349: fclose(fprx);
350:
351: strcpy(tfile, rxfile);
352: tfile[0] = XQTPRE;
353: if (strcmp(xsys, local) == SAME) {
354: /* rti!trt: xmv() works across filesystems, link(II) doesnt */
355: xmv(rxfile, tfile);
356: if (startjob)
357: if (rflag)
358: xuucico(xsys);
359: else
360: xuuxqt();
361: }
362: else {
363: GENSEND(fpc, rxfile, tfile, User, "", rxfile);
364: cflag++;
365: }
366:
367: fclose(fpc);
368: if (cflag) {
369: gename(CMDPRE, xsys, Grade, cfile);
370: /* rti!trt: use xmv() rather than link(II) */
371: xmv(tcfile, cfile);
372: if (startjob)
373: xuucico(xsys);
374: cleanup(0);
375: }
376: else
377: unlink(subfile(tcfile));
378: }
379:
380: #define FTABSIZE 30
381: char Fname[FTABSIZE][NAMESIZE];
382: int Fnamect = 0;
383:
384: /***
385: * cleanup - cleanup and unlink if error
386: *
387: * return - none - do exit()
388: */
389:
390: cleanup(code)
391: int code;
392: {
393: int i;
394:
395: logcls();
396: rmlock(CNULL);
397: if (code) {
398: for (i = 0; i < Fnamect; i++)
399: unlink(subfile(Fname[i]));
400: fprintf(stderr, "uux failed. code %d\n", code);
401: }
402: DEBUG(1, "exit code %d\n", code);
403: exit(code);
404: }
405:
406: /***
407: * ufopen - open file and record name
408: *
409: * return file pointer.
410: */
411:
412: FILE *ufopen(file, mode)
413: char *file, *mode;
414: {
415: if (Fnamect < FTABSIZE)
416: strcpy(Fname[Fnamect++], file);
417: else
418: logent("Fname", "TABLE OVERFLOW");
419: return(fopen(subfile(file), mode));
420: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.