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