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