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: }