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