|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)uucp.c 5.5 (Berkeley) 10/9/85";
3: #endif
4:
5: #include "uucp.h"
6: #include <sys/stat.h>
7: #include "uust.h"
8:
9: /*
10: * uucp
11: */
12: int Uid;
13: char *Ropt = " ";
14: char Path[100], Optns[10], Ename[MAXBASENAME+1];
15: char Grade = 'n';
16: #ifdef DONTCOPY
17: int Copy = 0;
18: #else !DONTCOPY
19: int Copy = 1;
20: #endif !DONTCOPY
21: char Nuser[32];
22: struct timeb Now;
23:
24: /* variables used to check if talking to more than one system. */
25: int xsflag = -1;
26: char xsys[MAXBASENAME+1] = 0;
27:
28: long Nbytes = 0;
29: #define MAXBYTES 50000 /* maximun number of bytes of data per C. file */
30: #define MAXCOUNT 15 /* maximun number of files per C. file */
31:
32: main(argc, argv)
33: char *argv[];
34: {
35: int ret;
36: char *sysfile1, *sysfl2;
37: register char *cp;
38: char file1[MAXFULLNAME], file2[MAXFULLNAME];
39: int avoidgwd = 0;
40:
41: strcpy(Progname, "uucp");
42: uucpname(Myname);
43: umask(WFMASK);
44: Optns[0] = '-';
45: Optns[1] = 'd';
46: #ifdef DONTCOPY
47: Optns[2] = 'c';
48: #else !DONTCOPY
49: Optns[2] = 'C';
50: #endif !DONTCOPY
51: Ename[0] = Nuser[0] = Optns[3] = '\0';
52: while(argc>1 && argv[1][0] == '-'){
53: switch(argv[1][1]){
54: case 'a':
55: /* efficiency hack; avoid gwd call */
56: avoidgwd = 1;
57: break;
58: case 'C':
59: Copy = 1;
60: Optns[2] = 'C';
61: break;
62: case 'c':
63: Copy = 0;
64: Optns[2] = 'c';
65: break;
66: case 'd':
67: break;
68: case 'f':
69: Optns[1] = 'f';
70: break;
71: case 'e':
72: strncpy(Ename, &argv[1][2], MAXBASENAME);
73: break;
74: case 'g':
75: Grade = argv[1][2];
76: break;
77: case 'm':
78: strcat(Optns, "m");
79: break;
80: case 'n':
81: sprintf(Nuser, "%.31s", &argv[1][2]);
82: break;
83: case 'r':
84: Ropt = argv[1];
85: break;
86: case 's':
87: Spool = &argv[1][2]; break;
88: case 'x':
89: chkdebug();
90: Debug = atoi(&argv[1][2]);
91: if (Debug <= 0)
92: Debug = 1;
93: break;
94: default:
95: printf("unknown flag %s\n", argv[1]); break;
96: }
97: --argc; argv++;
98: }
99: DEBUG(4, "\n\n** %s **\n", "START");
100: if (!avoidgwd) {
101: cp = getwd(Wrkdir);
102: ASSERT(cp != 0, "GETWD FAILED", Wrkdir, cp);
103: }
104: ret = subchdir(Spool);
105: ASSERT(ret >= 0, "CHDIR FAILED", Spool, ret);
106:
107: Uid = getuid();
108: ret = guinfo(Uid, User, Path);
109: ASSERT(ret == 0, "CAN NOT FIND UID", CNULL, Uid);
110: DEBUG(4, "UID %d, ", Uid);
111: DEBUG(4, "User %s,", User);
112: DEBUG(4, "Ename (%s) ", Ename);
113: DEBUG(4, "PATH %s\n", Path);
114: if (argc < 3) {
115: fprintf(stderr, "usage uucp from ... to\n");
116: cleanup(1);
117: }
118:
119:
120: /* set up "to" system and file names */
121: if ((cp = index(argv[argc - 1], '!')) != NULL) {
122: sysfl2 = argv[argc - 1];
123: *cp = '\0';
124: if (*sysfl2 == '\0')
125: sysfl2 = Myname;
126: else
127: strncpy(Rmtname, sysfl2, MAXBASENAME);
128: if (versys(&sysfl2) != 0) {
129: fprintf(stderr, "bad system name: %s\n", sysfl2);
130: cleanup(1);
131: }
132: if (Rmtname[0] != '\0')
133: strncpy(Rmtname, sysfl2, MAXBASENAME);
134: /* block multi-hop requests immediately */
135: if (index(cp+1, '!') != NULL) {
136: fprintf(stderr, "uucp handles only adjacent sites.\n");
137: fprintf(stderr, "Try uusend for multi-hop delivery.\n");
138: cleanup(1);
139: }
140: strcpy(file2, cp + 1);
141: }
142: else {
143: sysfl2 = Myname;
144: strcpy(file2, argv[argc - 1]);
145: }
146: if (strlen(sysfl2) > MAXBASENAME)
147: sysfl2[MAXBASENAME] = '\0';
148:
149:
150: /* do each from argument */
151: while (argc > 2) {
152: if ((cp = index(argv[1], '!')) != NULL) {
153: sysfile1 = argv[1];
154: *cp = '\0';
155: if (strlen(sysfile1) > MAXBASENAME)
156: sysfile1[MAXBASENAME] = '\0';
157: if (*sysfile1 == '\0')
158: sysfile1 = Myname;
159: else
160: strncpy(Rmtname, sysfile1, MAXBASENAME);
161: if (versys(&sysfile1) != 0) {
162: fprintf(stderr, "bad system name: %s\n", sysfile1);
163: cleanup(0);
164: }
165: if (Rmtname[0] != '\0')
166: strncpy(Rmtname, sysfl2, MAXBASENAME);
167: strcpy(file1, cp + 1);
168: }
169: else {
170: sysfile1 = Myname;
171: strcpy(file1, argv[1]);
172: }
173: DEBUG(4, "file1 - %s\n", file1);
174: copy(sysfile1, file1, sysfl2, file2);
175: --argc;
176: argv++;
177: }
178:
179: clscfile();
180: if (*Ropt != '-' && xsflag >= 0)
181: xuucico(xsys);
182: cleanup(0);
183: }
184:
185: cleanup(code)
186: int code;
187: {
188: logcls();
189: rmlock(CNULL);
190: if (code)
191: fprintf(stderr, "uucp failed. code %d\n", code);
192: exit(code);
193: }
194:
195:
196: /*
197: * generate copy files
198: *
199: * return codes 0 | FAIL
200: */
201:
202: copy(s1, f1, s2, f2)
203: register char *s1, *f1, *s2, *f2;
204: {
205: int type, statret;
206: struct stat stbuf, stbuf1;
207: char dfile[NAMESIZE];
208: char file1[MAXFULLNAME], file2[MAXFULLNAME];
209: FILE *cfp, *gtcfile();
210: char opts[100];
211:
212: type = 0;
213: opts[0] = '\0';
214: strcpy(file1, f1);
215: strcpy(file2, f2);
216: if (strcmp(s1, Myname) != SAME)
217: type = 1;
218: if (strcmp(s2, Myname) != SAME)
219: type += 2;
220: if (type & 01)
221: if ((index(f1, '*') != NULL
222: || index(f1, '?') != NULL
223: || index(f1, '[') != NULL))
224: type = 4;
225:
226: switch (type) {
227: case 0:
228: /* all work here */
229: DEBUG(4, "all work here %d\n", type);
230: if (ckexpf(file1))
231: return FAIL;
232: if (ckexpf(file2))
233: return FAIL;
234: if (stat(subfile(file1), &stbuf) != 0) {
235: fprintf(stderr, "can't get file status %s \n copy failed\n",
236: file1);
237: return SUCCESS;
238: }
239: statret = stat(subfile(file2), &stbuf1);
240: if (statret == 0
241: && stbuf.st_ino == stbuf1.st_ino
242: && stbuf.st_dev == stbuf1.st_dev) {
243: fprintf(stderr, "%s %s - same file; can't copy\n", file1, file2);
244: return SUCCESS;
245: }
246: if (chkpth(User, "", file1) != 0
247: || chkperm(file2, index(Optns, 'd'))
248: || chkpth(User, "", file2) != 0) {
249: fprintf(stderr, "permission denied\n");
250: cleanup(1);
251: }
252: if ((stbuf.st_mode & ANYREAD) == 0) {
253: fprintf(stderr, "can't read file (%s) mode (%o)\n",
254: file1, (int)stbuf.st_mode);
255: return FAIL;
256: }
257: if (statret == 0 && (stbuf1.st_mode & ANYWRITE) == 0) {
258: fprintf(stderr, "can't write file (%s) mode (%o)\n",
259: file2, (int)stbuf.st_mode);
260: return FAIL;
261: }
262: xcp(file1, file2);
263: logent("WORK HERE", "DONE");
264: return SUCCESS;
265: case 1:
266: /* receive file */
267: DEBUG(4, "receive file - %d\n", type);
268: chsys(s1);
269: if (file1[0] != '~')
270: if (ckexpf(file1))
271: return FAIL;
272: if (ckexpf(file2))
273: return FAIL;
274: if (chkpth(User, "", file2) != 0) {
275: fprintf(stderr, "permission denied\n");
276: return FAIL;
277: }
278: if (Ename[0] != '\0') {
279: /* execute uux - remote uucp */
280: xuux(Ename, s1, file1, s2, file2, opts);
281: return SUCCESS;
282: }
283:
284: cfp = gtcfile(s1);
285: fprintf(cfp, "R %s %s %s %s\n", file1, file2, User, Optns);
286: break;
287: case 2:
288: /* send file */
289: if (ckexpf(file1))
290: return FAIL;
291: if (file2[0] != '~')
292: if (ckexpf(file2))
293: return FAIL;
294: DEBUG(4, "send file - %d\n", type);
295: chsys(s2);
296:
297: if (chkpth(User, "", file1) != 0) {
298: fprintf(stderr, "permission denied %s\n", file1);
299: return FAIL;
300: }
301: if (stat(subfile(file1), &stbuf) != 0) {
302: fprintf(stderr, "can't get status for file %s\n", file1);
303: return FAIL;
304: }
305: if ((stbuf.st_mode & S_IFMT) == S_IFDIR) {
306: fprintf(stderr, "directory name illegal - %s\n",
307: file1);
308: return FAIL;
309: }
310: if ((stbuf.st_mode & ANYREAD) == 0) {
311: fprintf(stderr, "can't read file (%s) mode (%o)\n",
312: file1, (int)stbuf.st_mode);
313: return FAIL;
314: }
315: if ((Nuser[0] != '\0') && (index(Optns, 'n') == NULL))
316: strcat(Optns, "n");
317: if (Ename[0] != '\0') {
318: /* execute uux - remote uucp */
319: if (Nuser[0] != '\0')
320: sprintf(opts, "-n%s", Nuser);
321: xuux(Ename, s1, file1, s2, file2, opts);
322: return SUCCESS;
323: }
324: Nbytes += stbuf.st_size;
325: if (Copy) {
326: gename(DATAPRE, Myname, Grade, dfile);
327: if (xcp(file1, dfile) != 0) {
328: fprintf(stderr, "can't copy %s\n", file1);
329: return FAIL;
330: }
331: }
332: else {
333: /* make a dummy D. name */
334: /* cntrl.c knows names < 6 chars are dummy D. files */
335: strcpy(dfile, "D.0");
336: }
337: cfp = gtcfile(s2);
338: fprintf(cfp, "S %s %s %s %s %s %o %s\n", file1, file2,
339: User, Optns, dfile, (int)stbuf.st_mode & 0777, Nuser);
340: break;
341: case 3:
342: case 4:
343: /* send uucp command for execution on s1 */
344: DEBUG(4, "send uucp command - %d\n", type);
345: chsys(s1);
346: if (strcmp(s2, Myname) == SAME) {
347: if (ckexpf(file2))
348: return FAIL;
349: if (chkpth(User, "", file2) != 0) {
350: fprintf(stderr, "permission denied\n");
351: return FAIL;
352: }
353: }
354: if (Ename[0] != '\0') {
355: /* execute uux - remote uucp */
356: xuux(Ename, s1, file1, s2, file2, opts);
357: return SUCCESS;
358: }
359: cfp = gtcfile(s1);
360: fprintf(cfp, "X %s %s!%s %s %s\n", file1, s2, file2, User, Optns);
361: break;
362: }
363: return SUCCESS;
364: }
365:
366: /*
367: * execute uux for remote uucp
368: *
369: * return code - none
370: */
371:
372: xuux(ename, s1, f1, s2, f2, opts)
373: char *ename, *s1, *s2, *f1, *f2, *opts;
374: {
375: char cmd[200];
376:
377: DEBUG(4, "Ropt(%s) ", Ropt);
378: DEBUG(4, "ename(%s) ", ename);
379: DEBUG(4, "s1(%s) ", s1);
380: DEBUG(4, "f1(%s) ", f1);
381: DEBUG(4, "s2(%s) ", s2);
382: DEBUG(4, "f2(%s)\n", f2);
383: sprintf(cmd, "uux %s %s!uucp %s %s!%s \\(%s!%s\\)",
384: Ropt, ename, opts, s1, f1, s2, f2);
385: DEBUG(4, "cmd (%s)\n", cmd);
386: system(cmd);
387: return;
388: }
389:
390: FILE *Cfp = NULL;
391: char Cfile[NAMESIZE];
392:
393: /*
394: * get a Cfile descriptor
395: *
396: * return an open file descriptor
397: */
398:
399: FILE *
400: gtcfile(sys)
401: register char *sys;
402: {
403: static char presys[8] = "";
404: static int cmdcount = 0;
405: register int savemask;
406:
407: if (strcmp(presys, sys) != SAME /* this is !SAME on first call */
408: || Nbytes > MAXBYTES
409: || ++cmdcount > MAXCOUNT) {
410: cmdcount = 1;
411: Nbytes = 0;
412: if (presys[0] != '\0') {
413: clscfile();
414: }
415: gename(CMDPRE, sys, Grade, Cfile);
416: #ifdef VMS
417: savemask = umask(~0600); /* vms must have read permission */
418: #else !VMS
419: savemask = umask(~0200);
420: #endif !VMS
421: Cfp = fopen(subfile(Cfile), "w");
422: umask(savemask);
423: ASSERT(Cfp != NULL, CANTOPEN, Cfile, 0);
424: strcpy(presys, sys);
425: }
426: return Cfp;
427: }
428:
429: /*
430: * close cfile
431: *
432: * return code - none
433: */
434:
435: clscfile()
436: {
437: if (Cfp == NULL)
438: return;
439: fclose(Cfp);
440: chmod(subfile(Cfile), ~WFMASK & 0777);
441: logent(Cfile, "QUE'D");
442: US_CRS(Cfile);
443: Cfp = NULL;
444: }
445:
446: /*
447: * compile a list of all systems we are referencing
448: */
449: chsys(s1)
450: register char *s1;
451: {
452: if (xsflag < 0)
453: xsflag = 0;
454: else if (xsflag > 0)
455: return;
456:
457: if (xsys[0] == '\0') {
458: strncpy(xsys, s1, MAXBASENAME);
459: return;
460: }
461:
462: if (strncmp(xsys, s1, MAXBASENAME) == SAME)
463: return;
464:
465: xsflag++;
466: xsys[0] = '\0';
467: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.