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