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:     "mail",
  20:     "rmail",
  21:     "lpr",
  22:     "opr",
  23:     "fsend",
  24:     "fget",
  25:     NULL
  26:     };
  27: #define CMDOK(a, b) cmdok(a,b)
  28: #define PATH    "PATH=/bin:/usr/bin;"
  29: /*  to remove restrictions from uuxqt
  30:  *  redefine CMDOK 0
  31:  *
  32:  *  to add allowable commands, add to the list under Cmds[]
  33:  */
  34: 
  35: main(argc, argv)
  36: char *argv[];
  37: {
  38:     char xcmd[100];
  39:     int cmdnok;
  40:     char xfile[MAXFULLNAME], user[10], buf[BUFSIZ];
  41:     char lbuf[30];
  42:     char cfile[NAMESIZE], dfile[MAXFULLNAME];
  43:     char file[NAMESIZE];
  44:     char fin[MAXFULLNAME], sysout[NAMESIZE], fout[MAXFULLNAME];
  45:     FILE *xfp, *dfp, *fp;
  46:     char path[MAXFULLNAME];
  47:     char cmd[BUFSIZ];
  48:     char *cmdp, prm[MAXFULLNAME], *ptr;
  49:     char *getprm();
  50:     int uid, ret;
  51:     int stcico = 0;
  52:     Debug = 0;
  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:             goto rmfiles;
 155:         }
 156:         sprintf(lbuf, "%s XQT", user);
 157:         logent(buf, lbuf);
 158:         DEBUG(4, "cmd %s\n", buf);
 159: 
 160:         mvxfiles(xfile);
 161:         chdir(XQTDIR);
 162:         ret = shio(buf, fin, dfile, user);
 163:         DEBUG(4, "exit cmd - %d\n", ret);
 164:         chdir(Spool);
 165:         rmxfiles(xfile);
 166:         if (ret != 0) {
 167:             /*  exit status not zero */
 168:             dfp = fopen(dfile, "a");
 169:             ASSERT(dfp != NULL, "CAN'T OPEN %s", dfile);
 170:             fprintf(dfp, "exit status %d", ret);
 171:             fclose(dfp);
 172:         }
 173:         if (strcmp(fout, "/dev/null") != SAME) {
 174:             if (prefix(sysout, Myname)) {
 175:                 xmv(dfile, fout);
 176:             }
 177:             else {
 178:                 gename(CMDPRE, sysout, 'O', cfile);
 179:                 fp = fopen(cfile, "w");
 180:                 ASSERT(fp != NULL, "OPEN %s", cfile);
 181:                 chmod(cfile, 0666);
 182:                 fprintf(fp, "S %s %s %s - %s 0666\n",
 183:                 dfile, fout, user, lastpart(dfile));
 184:                 fclose(fp);
 185:             }
 186:         }
 187:     rmfiles:
 188:         xfp = fopen(xfile, "r");
 189:         ASSERT(xfp != NULL, "CAN'T OPEN %s", xfile);
 190:         while (fgets(buf, BUFSIZ, xfp) != NULL) {
 191:             if (buf[0] != X_RQDFILE)
 192:                 continue;
 193:             sscanf(&buf[1], "%s", file);
 194:             unlink(file);
 195:         }
 196:         unlink(xfile);
 197:     }
 198: 
 199:     if (stcico)
 200:         xuucico("");
 201:     cleanup(0);
 202: }
 203: 
 204: 
 205: cleanup(code)
 206: int code;
 207: {
 208:     logcls();
 209:     rmlock(NULL);
 210:     exit(code);
 211: }
 212: 
 213: 
 214: /*******
 215:  *	gtxfile(file)	get a file to execute
 216:  *	char *file;
 217:  *
 218:  *	return codes:  0 - no file  |  1 - file to execute
 219:  */
 220: 
 221: gtxfile(file)
 222: char *file;
 223: {
 224:     static FILE *pdir;
 225:     char pre[2];
 226: 
 227:     if (pdir == NULL) {
 228:         pdir = fopen(Spool, "r");
 229:         ASSERT(pdir != NULL, "GTXFILE CAN'T OPEN %s", Spool);
 230:     }
 231: 
 232:     pre[0] = XQTPRE;
 233:     pre[1] = '\0';
 234:     while (gnamef(pdir, file) != 0) {
 235:         DEBUG(4, "file - %s\n", file);
 236:         if (!prefix(pre, file))
 237:             continue;
 238:         if (gotfiles(file))
 239:             /*  return file to execute */
 240:             return(1);
 241:     }
 242: 
 243:     fclose(pdir);
 244:     return(0);
 245: }
 246: 
 247: 
 248: /***
 249:  *	gotfiles(file)		check for needed files
 250:  *	char *file;
 251:  *
 252:  *	return codes:  0 - not ready  |  1 - all files ready
 253:  */
 254: 
 255: gotfiles(file)
 256: char *file;
 257: {
 258:     struct stat stbuf;
 259:     FILE *fp;
 260:     char buf[BUFSIZ], rqfile[MAXFULLNAME];
 261: 
 262:     fp = fopen(file, "r");
 263:     if (fp == NULL)
 264:         return(0);
 265: 
 266:     while (fgets(buf, BUFSIZ, fp) != NULL) {
 267:         DEBUG(4, "%s\n", buf);
 268:         if (buf[0] != X_RQDFILE)
 269:             continue;
 270:         sscanf(&buf[1], "%s", rqfile);
 271:         expfile(rqfile);
 272:         if (stat(rqfile, &stbuf) == -1) {
 273:             fclose(fp);
 274:             return(0);
 275:         }
 276:     }
 277: 
 278:     fclose(fp);
 279:     return(1);
 280: }
 281: 
 282: 
 283: /***
 284:  *	rmxfiles(xfile)		remove execute files to x-directory
 285:  *	char *xfile;
 286:  *
 287:  *	return codes - none
 288:  */
 289: 
 290: rmxfiles(xfile)
 291: char *xfile;
 292: {
 293:     FILE *fp;
 294:     char buf[BUFSIZ], file[NAMESIZE], tfile[NAMESIZE];
 295:     char tfull[MAXFULLNAME];
 296: 
 297:     if((fp = fopen(xfile, "r")) == NULL)
 298:         return;
 299: 
 300:     while (fgets(buf, BUFSIZ, fp) != NULL) {
 301:         if (buf[0] != X_RQDFILE)
 302:             continue;
 303:         if (sscanf(&buf[1], "%s%s", file, tfile) < 2)
 304:             continue;
 305:         sprintf(tfull, "%s/%s", XQTDIR, tfile);
 306:         unlink(tfull);
 307:     }
 308:     fclose(fp);
 309:     return;
 310: }
 311: 
 312: 
 313: /***
 314:  *	mvxfiles(xfile)		move execute files to x-directory
 315:  *	char *xfile;
 316:  *
 317:  *	return codes - none
 318:  */
 319: 
 320: mvxfiles(xfile)
 321: char *xfile;
 322: {
 323:     FILE *fp;
 324:     char buf[BUFSIZ], ffile[MAXFULLNAME], tfile[NAMESIZE];
 325:     char tfull[MAXFULLNAME];
 326:     int ret;
 327: 
 328:     if((fp = fopen(xfile, "r")) == NULL)
 329:         return;
 330: 
 331:     while (fgets(buf, BUFSIZ, fp) != NULL) {
 332:         if (buf[0] != X_RQDFILE)
 333:             continue;
 334:         if (sscanf(&buf[1], "%s%s", ffile, tfile) < 2)
 335:             continue;
 336:         expfile(ffile);
 337:         sprintf(tfull, "%s/%s", XQTDIR, tfile);
 338:         unlink(tfull);
 339:         ret = link(ffile, tfull);
 340:         ASSERT(ret == 0, "LINK RET-%d", ret);
 341:         unlink(ffile);
 342:     }
 343:     fclose(fp);
 344:     return;
 345: }
 346: 
 347: 
 348: /***
 349:  *	cmdok(xc, cmd)		check for valid command
 350:  *	char *xc, *cmd;
 351:  *
 352:  *	return 0 - ok | 1 nok
 353:  */
 354: 
 355: cmdok(xc, cmd)
 356: char *xc, *cmd;
 357: {
 358:     char **ptr;
 359: 
 360:     if (xc[0] != '\0')
 361:         return(0);
 362:     ptr = Cmds;
 363:     while(*ptr != NULL) {
 364: DEBUG(4, "cmd %s, ", cmd);
 365: DEBUG(4, "ptr %s\n", *ptr);
 366:         if (strcmp(cmd, *ptr) == SAME)
 367:             break;
 368:     ptr++;
 369:     }
 370:     if (*ptr == NULL)
 371:         return(1);
 372:     strcpy(xc, cmd);
 373:     return(0);
 374: }

Defined functions

cleanup defined in line 205; used 1 times
cmdok defined in line 355; used 1 times
  • in line 27
gotfiles defined in line 255; used 1 times
gtxfile defined in line 221; used 1 times
  • in line 79
main defined in line 35; never used
mvxfiles defined in line 320; used 1 times
rmxfiles defined in line 290; used 1 times

Defined variables

Cmds defined in line 18; used 1 times

Defined macros

APPCMD defined in line 7; used 2 times
CMDOK defined in line 27; used 1 times
PATH defined in line 28; used 1 times
Last modified: 1979-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1144
Valid CSS Valid XHTML 1.0 Strict