|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)uux.c 5.6 (Berkeley) 1/24/86"; ! 3: #endif ! 4: ! 5: #include "uucp.h" ! 6: ! 7: #define NOSYSPART 0 ! 8: #define HASSYSPART 1 ! 9: ! 10: #define LQUOTE '(' ! 11: #define RQUOTE ')' ! 12: ! 13: #define APPCMD(d) {\ ! 14: register char *p; for (p = d; *p != '\0';)\ ! 15: {*cmdp++ = *p++;\ ! 16: if(cmdp>(sizeof(cmd)+&cmd[0])){\ ! 17: fprintf(stderr,"argument list too long\n");\ ! 18: cleanup(EX_SOFTWARE);\ ! 19: }\ ! 20: }\ ! 21: *cmdp++ = ' '; *cmdp = '\0';} ! 22: ! 23: #define GENSEND(f, a, b, c, d, e) {\ ! 24: fprintf(f, "S %s %s %s -%s %s 0666\n", a, b, c, d, e); } ! 25: #define GENRCV(f, a, b, c) {fprintf(f, "R %s %s %s - \n", a, b, c);} ! 26: ! 27: struct timeb Now; ! 28: ! 29: main(argc, argv) ! 30: char *argv[]; ! 31: { ! 32: char cfile[NAMESIZE]; /* send commands for files from here */ ! 33: char dfile[NAMESIZE]; /* used for all data files from here */ ! 34: char rxfile[NAMESIZE]; /* to be sent to xqt file (X. ...) */ ! 35: char tfile[NAMESIZE]; /* temporary file name */ ! 36: char tcfile[NAMESIZE]; /* temporary file name */ ! 37: char t2file[NAMESIZE]; /* temporary file name */ ! 38: int cflag = 0; /* commands in C. file flag */ ! 39: int rflag = 0; /* C. files for receiving flag */ ! 40: #ifdef DONTCOPY ! 41: int Copy = 0; /* Don't Copy spool files */ ! 42: #else !DONTCOPY ! 43: int Copy = 1; /* Copy spool files */ ! 44: #endif !DONTCOPY ! 45: int Linkit = 0; /* Try link before copy */ ! 46: char buf[2*BUFSIZ]; ! 47: char inargs[2*BUFSIZ]; ! 48: int pipein = 0; ! 49: int startjob = 1; ! 50: char Grade = 'A'; ! 51: char path[MAXFULLNAME]; ! 52: char cmd[2*BUFSIZ]; ! 53: char *ap, *cmdp; ! 54: char prm[2*BUFSIZ]; ! 55: char syspart[MAXBASENAME+1], rest[MAXFULLNAME]; ! 56: char Xsys[MAXBASENAME+1], local[MAXBASENAME+1]; ! 57: char *xsys = Xsys; ! 58: FILE *fprx, *fpc, *fpd, *fp; ! 59: extern char *getprm(), *lastpart(); ! 60: extern FILE *ufopen(); ! 61: int uid, ret; ! 62: char redir = '\0'; ! 63: int nonoti = 0; ! 64: int nonzero = 0; ! 65: int link_failed; ! 66: char *ReturnTo = NULL; ! 67: extern int LocalOnly; ! 68: ! 69: strcpy(Progname, "uux"); ! 70: uucpname(Myname); ! 71: umask(WFMASK); ! 72: Ofn = 1; ! 73: Ifn = 0; ! 74: #ifdef VMS ! 75: arg_fix(argc, argv); ! 76: #endif ! 77: while (argc>1 && argv[1][0] == '-') { ! 78: switch(argv[1][1]){ ! 79: case 'p': ! 80: case '\0': ! 81: pipein = 1; ! 82: break; ! 83: case 'r': ! 84: startjob = 0; ! 85: break; ! 86: case 'c': ! 87: Copy = 0; ! 88: Linkit = 0; ! 89: break; ! 90: case 'l': ! 91: Copy = 0; ! 92: Linkit = 1; ! 93: break; ! 94: case 'C': ! 95: Copy = 1; ! 96: Linkit = 0; ! 97: break; ! 98: case 'g': ! 99: Grade = argv[1][2]; ! 100: break; ! 101: case 'x': ! 102: chkdebug(); ! 103: Debug = atoi(&argv[1][2]); ! 104: if (Debug <= 0) ! 105: Debug = 1; ! 106: break; ! 107: case 'n': ! 108: nonoti = 1; ! 109: break; ! 110: case 'z': ! 111: nonzero = 1; ! 112: break; ! 113: case 'L': ! 114: LocalOnly++; ! 115: break; ! 116: case 'a': ! 117: ReturnTo = &argv[1][2]; ! 118: if (prefix(Myname, ReturnTo) && ReturnTo[strlen(Myname)] == '!') ! 119: ReturnTo = index(ReturnTo, '!') + 1; ! 120: break; ! 121: default: ! 122: fprintf(stderr, "unknown flag %s\n", argv[1]); ! 123: break; ! 124: } ! 125: --argc; argv++; ! 126: } ! 127: ap = getwd(Wrkdir); ! 128: if (ap == 0) { ! 129: fprintf(stderr, "can't get working directory; will try to continue\n"); ! 130: strcpy(Wrkdir, "/UNKNOWN"); ! 131: } ! 132: ! 133: DEBUG(4, "\n\n** %s **\n", "START"); ! 134: ! 135: inargs[0] = '\0'; ! 136: for (argv++; argc > 1; argc--) { ! 137: DEBUG(4, "arg - %s:", *argv); ! 138: strcat(inargs, " "); ! 139: strcat(inargs, *argv++); ! 140: } ! 141: DEBUG(4, "arg - %s\n", inargs); ! 142: ret = subchdir(Spool); ! 143: ASSERT(ret >= 0, "CHDIR FAILED", Spool, ret); ! 144: uid = getuid(); ! 145: guinfo(uid, User, path); ! 146: ! 147: strncpy(local, Myname, MAXBASENAME); ! 148: cmdp = cmd; ! 149: *cmdp = '\0'; ! 150: gename(DATAPRE, local, 'X', rxfile); ! 151: fprx = ufopen(rxfile, "w"); ! 152: ASSERT(fprx != NULL, "CAN'T OPEN", rxfile, 0); ! 153: gename(DATAPRE, local, 'T', tcfile); ! 154: fpc = ufopen(tcfile, "w"); ! 155: ASSERT(fpc != NULL, "CAN'T OPEN", tcfile, 0); ! 156: fprintf(fprx, "%c %s %s\n", X_USER, User, local); ! 157: if (nonoti) ! 158: fprintf(fprx, "%c\n", X_NONOTI); ! 159: if (nonzero) ! 160: fprintf(fprx, "%c\n", X_NONZERO); ! 161: if (ReturnTo == NULL || *ReturnTo == '\0') ! 162: ReturnTo = User; ! 163: fprintf(fprx, "%c %s\n", X_RETURNTO, ReturnTo); ! 164: ! 165: /* find remote system name */ ! 166: ap = inargs; ! 167: xsys[0] = '\0'; ! 168: while ((ap = getprm(ap, prm)) != NULL) { ! 169: if (prm[0] == '>' || prm[0] == '<') { ! 170: ap = getprm(ap, prm); ! 171: continue; ! 172: } ! 173: ! 174: split(prm, xsys, rest); ! 175: break; ! 176: } ! 177: if (xsys[0] == '\0') ! 178: strcpy(xsys, local); ! 179: if (versys(&xsys) != 0) { ! 180: /* bad system name */ ! 181: fprintf(stderr, "bad system name: %s\n", xsys); ! 182: fclose(fprx); ! 183: fclose(fpc); ! 184: cleanup(EX_NOHOST); ! 185: } ! 186: ! 187: strncpy(Rmtname, xsys, MAXBASENAME); ! 188: DEBUG(4, "xsys %s\n", xsys); ! 189: ! 190: if (pipein) { ! 191: gename(DATAPRE, local, 'B', dfile); ! 192: fpd = ufopen(dfile, "w"); ! 193: ASSERT(fpd != NULL, "CAN'T OPEN", dfile, 0); ! 194: while (!feof(stdin)) { ! 195: ret = fread(buf, 1, BUFSIZ, stdin); ! 196: fwrite(buf, 1, ret, fpd); ! 197: if (ferror(stdin)) { ! 198: perror("stdin"); ! 199: cleanup(EX_IOERR); ! 200: } ! 201: if (ferror(fpd)) { ! 202: perror(dfile); ! 203: cleanup(EX_IOERR); ! 204: } ! 205: } ! 206: fclose(fpd); ! 207: strcpy(tfile, dfile); ! 208: if (strcmp(local, xsys) != SAME) { ! 209: register int Len = strlen(local); ! 210: if (Len > SYSNSIZE) ! 211: Len = SYSNSIZE; ! 212: tfile[Len + 2] = 'S'; ! 213: GENSEND(fpc, dfile, tfile, User, "", dfile); ! 214: cflag++; ! 215: } ! 216: fprintf(fprx, "%c %s\n", X_RQDFILE, tfile); ! 217: fprintf(fprx, "%c %s\n", X_STDIN, tfile); ! 218: } ! 219: /* parse command */ ! 220: ap = inargs; ! 221: while ((ap = getprm(ap, prm)) != NULL) { ! 222: DEBUG(4, "prm - %s\n", prm); ! 223: if (prm[0] == '>' || prm[0] == '<') { ! 224: redir = prm[0]; ! 225: continue; ! 226: } ! 227: ! 228: if (prm[0] == ';') { ! 229: APPCMD(prm); ! 230: continue; ! 231: } ! 232: ! 233: if (prm[0] == '|' || prm[0] == '^') { ! 234: if (cmdp != cmd) ! 235: APPCMD(prm); ! 236: continue; ! 237: } ! 238: ! 239: /* process command or file or option */ ! 240: ret = split(prm, syspart, rest); ! 241: DEBUG(4, "s - %s, ", syspart); ! 242: DEBUG(4, "r - %s, ", rest); ! 243: DEBUG(4, "ret - %d\n", ret); ! 244: if (syspart[0] == '\0') ! 245: strcpy(syspart, local); ! 246: ! 247: if (cmdp == cmd && redir == '\0') { ! 248: /* command */ ! 249: APPCMD(rest); ! 250: continue; ! 251: } ! 252: ! 253: /* process file or option */ ! 254: DEBUG(4, "file s- %s, ", syspart); ! 255: DEBUG(4, "local - %s\n", local); ! 256: /* process file */ ! 257: if (redir == '>') { ! 258: if (rest[0] != '~') ! 259: if (ckexpf(rest)) ! 260: cleanup(EX_CANTCREAT); ! 261: fprintf(fprx, "%c %s %s\n", X_STDOUT, rest, ! 262: syspart); ! 263: redir = '\0'; ! 264: continue; ! 265: } ! 266: ! 267: if (ret == NOSYSPART && redir == '\0') { ! 268: /* option */ ! 269: APPCMD(rest); ! 270: continue; ! 271: } ! 272: ! 273: if (strcmp(xsys, local) == SAME ! 274: && strcmp(xsys, syspart) == SAME) { ! 275: if (ckexpf(rest)) ! 276: cleanup(EX_CANTCREAT); ! 277: if (redir == '<') ! 278: fprintf(fprx, "%c %s\n", X_STDIN, rest); ! 279: else ! 280: APPCMD(rest); ! 281: redir = '\0'; ! 282: continue; ! 283: } ! 284: ! 285: if (strcmp(syspart, local) == SAME) { ! 286: /* generate send file */ ! 287: if (ckexpf(rest)) ! 288: cleanup(EX_CANTCREAT); ! 289: gename(DATAPRE, local, 'A', dfile); ! 290: DEBUG(4, "rest %s\n", rest); ! 291: if ((chkpth(User, "", rest) || anyread(rest)) != 0) { ! 292: fprintf(stderr, "permission denied %s\n", rest); ! 293: cleanup(EX_NOINPUT); ! 294: } ! 295: link_failed = 0; ! 296: if (Linkit) { ! 297: if (link(subfile(rest), subfile(dfile)) != 0) ! 298: link_failed++; ! 299: else ! 300: GENSEND(fpc, rest, dfile, User, "", dfile); ! 301: } ! 302: if (Copy || link_failed) { ! 303: if (xcp(rest, dfile) != 0) { ! 304: fprintf(stderr, "can't copy %s to %s\n", rest, dfile); ! 305: cleanup(EX_NOINPUT); ! 306: } ! 307: GENSEND(fpc, rest, dfile, User, "", dfile); ! 308: } ! 309: if (!Copy && !Linkit) { ! 310: GENSEND(fpc, rest, dfile, User, "c", "D.0"); ! 311: } ! 312: cflag++; ! 313: if (redir == '<') { ! 314: fprintf(fprx, "%c %s\n", X_STDIN, dfile); ! 315: fprintf(fprx, "%c %s\n", X_RQDFILE, dfile); ! 316: } else { ! 317: APPCMD(lastpart(rest)); ! 318: fprintf(fprx, "%c %s %s\n", X_RQDFILE, ! 319: dfile, lastpart(rest)); ! 320: } ! 321: redir = '\0'; ! 322: continue; ! 323: } ! 324: ! 325: if (strcmp(local, xsys) == SAME) { ! 326: /* generate local receive */ ! 327: gename(CMDPRE, syspart, 'R', tfile); ! 328: strcpy(dfile, tfile); ! 329: dfile[0] = DATAPRE; ! 330: fp = ufopen(tfile, "w"); ! 331: ASSERT(fp != NULL, "CAN'T OPEN", tfile, 0); ! 332: if (ckexpf(rest)) ! 333: cleanup(EX_CANTCREAT); ! 334: GENRCV(fp, rest, dfile, User); ! 335: fclose(fp); ! 336: rflag++; ! 337: if (rest[0] != '~') ! 338: if (ckexpf(rest)) ! 339: cleanup(EX_CANTCREAT); ! 340: if (redir == '<') { ! 341: fprintf(fprx, "%c %s\n", X_RQDFILE, dfile); ! 342: fprintf(fprx, "%c %s\n", X_STDIN, dfile); ! 343: } else { ! 344: fprintf(fprx, "%c %s %s\n", X_RQDFILE, dfile, ! 345: lastpart(rest)); ! 346: APPCMD(lastpart(rest)); ! 347: } ! 348: ! 349: redir = '\0'; ! 350: continue; ! 351: } ! 352: ! 353: if (strcmp(syspart, xsys) != SAME) { ! 354: /* generate remote receives */ ! 355: gename(DATAPRE, syspart, 'R', dfile); ! 356: strcpy(tfile, dfile); ! 357: tfile[0] = CMDPRE; ! 358: fpd = ufopen(dfile, "w"); ! 359: ASSERT(fpd != NULL, "CAN'T OPEN", dfile, 0); ! 360: gename(DATAPRE, local, 'T', t2file); ! 361: GENRCV(fpd, rest, t2file, User); ! 362: fclose(fpd); ! 363: GENSEND(fpc, dfile, tfile, User, "", dfile); ! 364: cflag++; ! 365: if (redir == '<') { ! 366: fprintf(fprx, "%c %s\n", X_RQDFILE, t2file); ! 367: fprintf(fprx, "%c %s\n", X_STDIN, t2file); ! 368: } else { ! 369: fprintf(fprx, "%c %s %s\n", X_RQDFILE, t2file, ! 370: lastpart(rest)); ! 371: APPCMD(lastpart(rest)); ! 372: } ! 373: redir = '\0'; ! 374: continue; ! 375: } ! 376: ! 377: /* file on remote system */ ! 378: if (rest[0] != '~') ! 379: if (ckexpf(rest)) ! 380: cleanup(EX_CANTCREAT); ! 381: if (redir == '<') ! 382: fprintf(fprx, "%c %s\n", X_STDIN, rest); ! 383: else ! 384: APPCMD(rest); ! 385: redir = '\0'; ! 386: continue; ! 387: ! 388: } ! 389: /* ! 390: * clean up trailing ' ' in command. ! 391: */ ! 392: if (cmdp > cmd && cmdp[0] == '\0' && cmdp[-1] == ' ') ! 393: *--cmdp = '\0'; ! 394: /* block multi-hop uux, which doesn't work */ ! 395: for (ap = cmd; *ap && *ap != ' '; ap++) ! 396: if (*ap == '!') { ! 397: fprintf(stderr, "uux handles only adjacent sites.\n"); ! 398: fprintf(stderr, "Try uusend for multi-hop delivery.\n"); ! 399: cleanup(EX_USAGE); ! 400: } ! 401: ! 402: fprintf(fprx, "%c %s\n", X_CMD, cmd); ! 403: if (ferror(fprx)) { ! 404: logent(cmd, "COULD NOT QUEUE XQT"); ! 405: cleanup(EX_IOERR); ! 406: } else ! 407: logent(cmd, "XQT QUE'D"); ! 408: fclose(fprx); ! 409: ! 410: gename(XQTPRE, local, Grade, tfile); ! 411: if (strcmp(xsys, local) == SAME) { ! 412: /* rti!trt: xmv() works across filesystems, link(II) doesnt */ ! 413: xmv(rxfile, tfile); ! 414: if (startjob) ! 415: if (rflag) ! 416: xuucico(xsys); ! 417: else ! 418: xuuxqt(); ! 419: } ! 420: else { ! 421: GENSEND(fpc, rxfile, tfile, User, "", rxfile); ! 422: cflag++; ! 423: } ! 424: ! 425: if (ferror(fpc)) ! 426: cleanup(EX_IOERR); ! 427: fclose(fpc); ! 428: if (cflag) { ! 429: gename(CMDPRE, xsys, Grade, cfile); ! 430: /* rti!trt: use xmv() rather than link(II) */ ! 431: xmv(tcfile, cfile); ! 432: if (startjob) ! 433: xuucico(xsys); ! 434: cleanup(0); ! 435: } ! 436: else ! 437: unlink(subfile(tcfile)); ! 438: exit(0); ! 439: } ! 440: ! 441: #define FTABSIZE 30 ! 442: char Fname[FTABSIZE][NAMESIZE]; ! 443: int Fnamect = 0; ! 444: ! 445: /* ! 446: * cleanup and unlink if error ! 447: * ! 448: * return - none - do exit() ! 449: */ ! 450: ! 451: cleanup(code) ! 452: int code; ! 453: { ! 454: int i; ! 455: ! 456: logcls(); ! 457: rmlock(CNULL); ! 458: if (code) { ! 459: for (i = 0; i < Fnamect; i++) ! 460: unlink(subfile(Fname[i])); ! 461: fprintf(stderr, "uux failed. code %d\n", code); ! 462: } ! 463: DEBUG(1, "exit code %d\n", code); ! 464: exit(code); ! 465: } ! 466: ! 467: /* ! 468: * open file and record name ! 469: * ! 470: * return file pointer. ! 471: */ ! 472: ! 473: FILE *ufopen(file, mode) ! 474: char *file, *mode; ! 475: { ! 476: if (Fnamect < FTABSIZE) ! 477: strcpy(Fname[Fnamect++], file); ! 478: else ! 479: logent("Fname", "TABLE OVERFLOW"); ! 480: return fopen(subfile(file), mode); ! 481: } ! 482: #ifdef VMS ! 483: /* ! 484: * EUNICE bug: ! 485: * quotes are not stripped from DCL. Do it here. ! 486: * Note if we are running under Unix shell we don't ! 487: * do the right thing. ! 488: */ ! 489: arg_fix(argc, argv) ! 490: char **argv; ! 491: { ! 492: register char *cp, *tp; ! 493: ! 494: for (; argc > 0; --argc, argv++) { ! 495: cp = *argv; ! 496: if (cp == (char *)0 || *cp++ != '"') ! 497: continue; ! 498: tp = cp; ! 499: while (*tp++) ; ! 500: tp -= 2; ! 501: if (*tp == '"') { ! 502: *tp = '\0'; ! 503: *argv = cp; ! 504: } ! 505: } ! 506: } ! 507: #endif VMS ! 508: ! 509: /* ! 510: * split into system and file part ! 511: * ! 512: * return codes: ! 513: * NOSYSPART ! 514: * HASSYSPART ! 515: */ ! 516: ! 517: split(name, sys, rest) ! 518: register char *name, *rest; ! 519: char *sys; ! 520: { ! 521: register char *c; ! 522: register int i; ! 523: ! 524: if (*name == LQUOTE) { ! 525: if ((c = index(name + 1, RQUOTE)) != NULL) { ! 526: /* strip off quotes */ ! 527: name++; ! 528: while (c != name) ! 529: *rest++ = *name++; ! 530: *rest = '\0'; ! 531: *sys = '\0'; ! 532: return NOSYSPART; ! 533: } ! 534: } ! 535: ! 536: if ((c = index(name, '!')) == NULL) { ! 537: strcpy(rest, name); ! 538: *sys = '\0'; ! 539: return NOSYSPART; ! 540: } ! 541: ! 542: *c++ = '\0'; ! 543: strncpy(sys, name, MAXBASENAME); ! 544: sys[MAXBASENAME] = '\0'; ! 545: ! 546: strcpy(rest, c); ! 547: return HASSYSPART; ! 548: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.