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