xref: /original-bsd/usr.bin/uucp/shio.c (revision 3b6250d9)
1 #ifndef lint
2 static char sccsid[] = "@(#)shio.c	5.2 (Berkeley) 01/22/85";
3 #endif
4 
5 #include "uucp.h"
6 #include <signal.h>
7 
8 /*******
9  *	shio(cmd, fi, fo, user)	execute shell of command with
10  *	char *cmd, *fi, *fo;	fi and fo as standard input/output
11  *	char *user;		user name
12  *
13  *	return codes:
14  *		0  - ok
15  *		non zero -  failed  -  status from child
16  */
17 
18 shio(cmd, fi, fo, user)
19 char *cmd, *fi, *fo, *user;
20 {
21 	int status, f;
22 	int uid, pid, ret;
23 	char path[MAXFULLNAME];
24 	extern int errno;
25 
26 	if (fi == NULL)
27 		fi = DEVNULL;
28 	if (fo == NULL)
29 		fo = DEVNULL;
30 
31 	DEBUG(3, "shio - %s\n", cmd);
32 #ifdef SIGCHLD
33 	signal(SIGCHLD, SIG_IGN);
34 #endif SIGCHLD
35 	if ((pid = fork()) == 0) {
36 		signal(SIGINT, SIG_IGN);
37 		signal(SIGHUP, SIG_IGN);
38 		signal(SIGQUIT, SIG_IGN);
39 		signal(SIGKILL, SIG_IGN);
40 		close(Ifn);
41 		close(Ofn);
42 		close(0);
43 		if (user == NULL || (gninfo(user, &uid, path) != 0)
44 			|| setuid(uid))
45 			setuid(getuid());
46 		f = open(subfile(fi), 0);
47 		if (f != 0) {
48 			logent(fi, "CAN'T READ");
49 			exit(-errno);
50 		}
51 		close(1);
52 		f = creat(subfile(fo), 0666);
53 		if (f != 1) {
54 			logent(fo, "CAN'T WRITE");
55 			exit(-errno);
56 		}
57 		execl(SHELL, "sh", "-c", cmd, (char *)0);
58 		exit(100+errno);
59 	}
60 	while ((ret = wait(&status)) != pid && ret != -1)
61 		;
62 	DEBUG(3, "status %d\n", status);
63 	return status;
64 }
65