|
|
1.1 ! root 1: #include "uucp.h" ! 2: #include "uucpdefs.h" ! 3: #include <sys/types.h> ! 4: #include <sys/stat.h> ! 5: #include <sys/dir.h> ! 6: ! 7: #define APPCMD(d) {\ ! 8: char *p;\ ! 9: for (p = d; *p != '\0';) *cmdp++ = *p++;\ ! 10: *cmdp++ = ' ';\ ! 11: *cmdp = '\0';} ! 12: ! 13: /* ! 14: * uuxqt will execute commands set up by a uux command, ! 15: * usually from a remote machine - set by uucp. ! 16: */ ! 17: ! 18: char *Cmds[] = { ! 19: "rmail", ! 20: "rnews", ! 21: "vpr", ! 22: "w", ! 23: "fsend", ! 24: "fget", ! 25: "uusend", ! 26: "cp", ! 27: NULL ! 28: }; ! 29: #define PATH "PATH=/bin:/usr/bin;" ! 30: /* to remove restrictions from uuxqt ! 31: * define ALLOK 1 ! 32: * ! 33: * to add allowable commands, add to the list under Cmds[] ! 34: */ ! 35: ! 36: main(argc, argv) ! 37: char *argv[]; ! 38: { ! 39: char xcmd[100]; ! 40: int cmdnok; ! 41: char xfile[MAXFULLNAME], user[32], buf[BUFSIZ]; ! 42: char lbuf[30]; ! 43: char cfile[NAMESIZE], dfile[MAXFULLNAME]; ! 44: char file[NAMESIZE]; ! 45: char fin[MAXFULLNAME], sysout[NAMESIZE], fout[MAXFULLNAME]; ! 46: FILE *xfp, *dfp, *fp; ! 47: char path[MAXFULLNAME]; ! 48: char cmd[BUFSIZ]; ! 49: char *cmdp, prm[MAXFULLNAME], *ptr; ! 50: char *getprm(); ! 51: int uid, ret; ! 52: int stcico = 0; ! 53: char rnum[5]; ! 54: ! 55: uucpname(Myname); ! 56: Ofn = 1; ! 57: Ifn = 0; ! 58: while (argc>1 && argv[1][0] == '-') { ! 59: switch(argv[1][1]){ ! 60: case 'x': ! 61: Debug = atoi(&argv[1][2]); ! 62: if (Debug <= 0) ! 63: Debug = 1; ! 64: break; ! 65: default: ! 66: sprintf(stderr, "unknown flag %s\n", argv[1]); ! 67: break; ! 68: } ! 69: --argc; argv++; ! 70: } ! 71: ! 72: DEBUG(4, "\n\n** %s **\n", "START"); ! 73: chdir(Spool); ! 74: strcpy(Wrkdir, Spool); ! 75: uid = getuid(); ! 76: guinfo(uid, User, path); ! 77: DEBUG(4, "User - %s\n", User); ! 78: if (ulockf(X_LOCK, X_LOCKTIME) != 0) ! 79: exit(0); ! 80: ! 81: DEBUG(4, "process %s\n", ""); ! 82: while (gtxfile(xfile) > 0) { ! 83: DEBUG(4, "xfile - %s\n", xfile); ! 84: ! 85: xfp = fopen(xfile, "r"); ! 86: ASSERT(xfp != NULL, "CAN'T OPEN %s", xfile); ! 87: ! 88: /* initialize to default */ ! 89: strcpy(user, User); ! 90: strcpy(fin, "/dev/null"); ! 91: strcpy(fout, "/dev/null"); ! 92: sprintf(sysout, "%.7s", Myname); ! 93: while (fgets(buf, BUFSIZ, xfp) != NULL) { ! 94: switch (buf[0]) { ! 95: case X_USER: ! 96: sscanf(&buf[1], "%s%s", user, Rmtname); ! 97: break; ! 98: case X_STDIN: ! 99: sscanf(&buf[1], "%s", fin); ! 100: expfile(fin); ! 101: break; ! 102: case X_STDOUT: ! 103: sscanf(&buf[1], "%s%s", fout, sysout); ! 104: sysout[7] = '\0'; ! 105: if (fout[0] != '~' || prefix(sysout, Myname)) ! 106: expfile(fout); ! 107: break; ! 108: case X_CMD: ! 109: strcpy(cmd, &buf[2]); ! 110: if (*(cmd + strlen(cmd) - 1) == '\n') ! 111: *(cmd + strlen(cmd) - 1) = '\0'; ! 112: break; ! 113: default: ! 114: break; ! 115: } ! 116: } ! 117: ! 118: fclose(xfp); ! 119: DEBUG(4, "fin - %s, ", fin); ! 120: DEBUG(4, "fout - %s, ", fout); ! 121: DEBUG(4, "sysout - %s, ", sysout); ! 122: DEBUG(4, "user - %s\n", user); ! 123: DEBUG(4, "cmd - %s\n", cmd); ! 124: ! 125: /* command execution */ ! 126: if (strcmp(fout, "/dev/null") == SAME) ! 127: strcpy(dfile,"/dev/null"); ! 128: else ! 129: gename(DATAPRE, sysout, 'O', dfile); ! 130: ! 131: /* expand file names where necessary */ ! 132: expfile(dfile); ! 133: strcpy(buf, PATH); ! 134: cmdp = buf + strlen(buf); ! 135: ptr = cmd; ! 136: xcmd[0] = '\0'; ! 137: cmdnok = 0; ! 138: while ((ptr = getprm(ptr, prm)) != NULL) { ! 139: if (prm[0] == ';' || prm[0] == '^' ! 140: || prm[0] == '|') { ! 141: xcmd[0] = '\0'; ! 142: APPCMD(prm); ! 143: continue; ! 144: } ! 145: if ((cmdnok = cmdok(xcmd, prm)) != 0) ! 146: /* command not valid */ ! 147: break; ! 148: ! 149: if (prm[0] == '~') ! 150: expfile(prm); ! 151: APPCMD(prm); ! 152: } ! 153: if (cmdnok) { ! 154: sprintf(lbuf, "%s XQT DENIED", user); ! 155: logent(cmd, lbuf); ! 156: DEBUG(4, "bad command %s\n", prm); ! 157: notify(user, Rmtname, cmd, "DENIED"); ! 158: goto rmfiles; ! 159: } ! 160: sprintf(lbuf, "%s XQT", user); ! 161: logent(buf, lbuf); ! 162: DEBUG(4, "cmd %s\n", buf); ! 163: ! 164: mvxfiles(xfile); ! 165: chdir(XQTDIR); ! 166: ret = shio(buf, fin, dfile, user); ! 167: sprintf(rnum, "%d", ret); ! 168: if (ret != 0 ! 169: || strcmp(xcmd, "rmail") != SAME ! 170: && strcmp(xcmd, "rnews") != SAME) ! 171: notify(user, Rmtname, cmd, rnum); ! 172: DEBUG(4, "exit cmd - %d\n", ret); ! 173: chdir(Spool); ! 174: rmxfiles(xfile); ! 175: if (ret != 0) { ! 176: /* exit status not zero */ ! 177: dfp = fopen(dfile, "a"); ! 178: ASSERT(dfp != NULL, "CAN'T OPEN %s", dfile); ! 179: fprintf(dfp, "exit status %d", ret); ! 180: fclose(dfp); ! 181: } ! 182: if (strcmp(fout, "/dev/null") != SAME) { ! 183: if (prefix(sysout, Myname)) { ! 184: xmv(dfile, fout); ! 185: } ! 186: else { ! 187: gename(CMDPRE, sysout, 'O', cfile); ! 188: fp = fopen(cfile, "w"); ! 189: ASSERT(fp != NULL, "OPEN %s", cfile); ! 190: chmod(cfile, 0666); ! 191: fprintf(fp, "S %s %s %s - %s 0666\n", ! 192: dfile, fout, user, lastpart(dfile)); ! 193: fclose(fp); ! 194: } ! 195: } ! 196: rmfiles: ! 197: xfp = fopen(xfile, "r"); ! 198: ASSERT(xfp != NULL, "CAN'T OPEN %s", xfile); ! 199: while (fgets(buf, BUFSIZ, xfp) != NULL) { ! 200: if (buf[0] != X_RQDFILE) ! 201: continue; ! 202: sscanf(&buf[1], "%s", file); ! 203: unlink(file); ! 204: } ! 205: unlink(xfile); ! 206: } ! 207: ! 208: if (stcico) ! 209: xuucico(""); ! 210: cleanup(0); ! 211: } ! 212: ! 213: ! 214: cleanup(code) ! 215: int code; ! 216: { ! 217: logcls(); ! 218: rmlock(NULL); ! 219: exit(code); ! 220: } ! 221: ! 222: ! 223: /******* ! 224: * gtxfile(file) get a file to execute ! 225: * char *file; ! 226: * ! 227: * return codes: 0 - no file | 1 - file to execute ! 228: */ ! 229: ! 230: gtxfile(file) ! 231: char *file; ! 232: { ! 233: static FILE *pdir; ! 234: char pre[2]; ! 235: ! 236: if (pdir == NULL) { ! 237: pdir = fopen(Spool, "r"); ! 238: ASSERT(pdir != NULL, "GTXFILE CAN'T OPEN %s", Spool); ! 239: } ! 240: ! 241: pre[0] = XQTPRE; ! 242: pre[1] = '\0'; ! 243: while (gnamef(pdir, file) != 0) { ! 244: DEBUG(4, "file - %s\n", file); ! 245: if (!prefix(pre, file)) ! 246: continue; ! 247: if (gotfiles(file)) ! 248: /* return file to execute */ ! 249: return(1); ! 250: } ! 251: ! 252: fclose(pdir); ! 253: return(0); ! 254: } ! 255: ! 256: ! 257: /*** ! 258: * gotfiles(file) check for needed files ! 259: * char *file; ! 260: * ! 261: * return codes: 0 - not ready | 1 - all files ready ! 262: */ ! 263: ! 264: gotfiles(file) ! 265: char *file; ! 266: { ! 267: struct stat stbuf; ! 268: FILE *fp; ! 269: char buf[BUFSIZ], rqfile[MAXFULLNAME]; ! 270: ! 271: fp = fopen(file, "r"); ! 272: if (fp == NULL) ! 273: return(0); ! 274: ! 275: while (fgets(buf, BUFSIZ, fp) != NULL) { ! 276: DEBUG(4, "%s\n", buf); ! 277: if (buf[0] != X_RQDFILE) ! 278: continue; ! 279: sscanf(&buf[1], "%s", rqfile); ! 280: expfile(rqfile); ! 281: if (stat(rqfile, &stbuf) == -1) { ! 282: fclose(fp); ! 283: return(0); ! 284: } ! 285: } ! 286: ! 287: fclose(fp); ! 288: return(1); ! 289: } ! 290: ! 291: ! 292: /*** ! 293: * rmxfiles(xfile) remove execute files to x-directory ! 294: * char *xfile; ! 295: * ! 296: * return codes - none ! 297: */ ! 298: ! 299: rmxfiles(xfile) ! 300: char *xfile; ! 301: { ! 302: FILE *fp; ! 303: char buf[BUFSIZ], file[NAMESIZE], tfile[NAMESIZE]; ! 304: char tfull[MAXFULLNAME]; ! 305: ! 306: if((fp = fopen(xfile, "r")) == NULL) ! 307: return; ! 308: ! 309: while (fgets(buf, BUFSIZ, fp) != NULL) { ! 310: if (buf[0] != X_RQDFILE) ! 311: continue; ! 312: if (sscanf(&buf[1], "%s%s", file, tfile) < 2) ! 313: continue; ! 314: sprintf(tfull, "%s/%s", XQTDIR, tfile); ! 315: unlink(tfull); ! 316: } ! 317: fclose(fp); ! 318: return; ! 319: } ! 320: ! 321: ! 322: /*** ! 323: * mvxfiles(xfile) move execute files to x-directory ! 324: * char *xfile; ! 325: * ! 326: * return codes - none ! 327: */ ! 328: ! 329: mvxfiles(xfile) ! 330: char *xfile; ! 331: { ! 332: FILE *fp; ! 333: char buf[BUFSIZ], ffile[MAXFULLNAME], tfile[NAMESIZE]; ! 334: char tfull[MAXFULLNAME]; ! 335: int ret; ! 336: ! 337: if((fp = fopen(xfile, "r")) == NULL) ! 338: return; ! 339: ! 340: while (fgets(buf, BUFSIZ, fp) != NULL) { ! 341: if (buf[0] != X_RQDFILE) ! 342: continue; ! 343: if (sscanf(&buf[1], "%s%s", ffile, tfile) < 2) ! 344: continue; ! 345: expfile(ffile); ! 346: sprintf(tfull, "%s/%s", XQTDIR, tfile); ! 347: unlink(tfull); ! 348: ret = link(ffile, tfull); ! 349: ASSERT(ret == 0, "LINK RET-%d", ret); ! 350: unlink(ffile); ! 351: } ! 352: fclose(fp); ! 353: return; ! 354: } ! 355: ! 356: ! 357: /*** ! 358: * cmdok(xc, cmd) check for valid command ! 359: * *NOTE - side effect is to set xc to the ! 360: * command to be executed. ! 361: * char *xc, *cmd; ! 362: * ! 363: * return 0 - ok | 1 nok ! 364: */ ! 365: ! 366: cmdok(xc, cmd) ! 367: char *xc, *cmd; ! 368: { ! 369: char **ptr; ! 370: ! 371: if (xc[0] != '\0') ! 372: return(0); ! 373: #ifndef ALLOK ! 374: ptr = Cmds; ! 375: while(*ptr != NULL) { ! 376: if (strcmp(cmd, *ptr) == SAME) ! 377: break; ! 378: ptr++; ! 379: } ! 380: if (*ptr == NULL) ! 381: return(1); ! 382: #endif ! 383: strcpy(xc, cmd); ! 384: return(0); ! 385: } ! 386: ! 387: ! 388: /*** ! 389: * notify send mail to user giving execution results ! 390: * return code - none ! 391: * This program assumes new mail command - send remote mail ! 392: */ ! 393: ! 394: notify(user, rmt, cmd, str) ! 395: char *user, *rmt, *cmd, *str; ! 396: { ! 397: char text[100]; ! 398: char ruser[100]; ! 399: ! 400: sprintf(text, "uuxqt cmd (%s) status (%s)", cmd, str); ! 401: if (prefix(rmt, Myname)) ! 402: strcpy(ruser, user); ! 403: else ! 404: sprintf(ruser, "%s!%s", rmt, user); ! 405: mailst(ruser, text); ! 406: return; ! 407: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.