|
|
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.