Research V7 development
[unix-history] / usr / src / cmd / uucp / uuxqt.c
CommitLineData
128be09c
N
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) {\
8char *p;\
9for (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
18char *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
35main(argc, argv)
36char *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
205cleanup(code)
206int 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
221gtxfile(file)
222char *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
255gotfiles(file)
256char *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
290rmxfiles(xfile)
291char *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
320mvxfiles(xfile)
321char *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
355cmdok(xc, cmd)
356char *xc, *cmd;
357{
358 char **ptr;
359
360 if (xc[0] != '\0')
361 return(0);
362 ptr = Cmds;
363 while(*ptr != NULL) {
364DEBUG(4, "cmd %s, ", cmd);
365DEBUG(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}