|
|
1.1 ! root 1: /* /sccs/src/cmd/uucp/s.shio.c ! 2: shio.c 1.1 8/30/84 17:37:41 ! 3: */ ! 4: #include "uucp.h" ! 5: ! 6: VERSION(@(#)shio.c 1.1); ! 7: ! 8: /* ! 9: * use shell to execute command with ! 10: * fi, fo, and fe as standard input/output/error ! 11: * cmd -> command to execute ! 12: * fi -> standard input ! 13: * fo -> standard output ! 14: * fe -> standard error ! 15: * return: ! 16: * 0 -> success ! 17: * non zero -> failure - status from child ! 18: (Note - -1 means the fork failed) ! 19: */ ! 20: shio(cmd, fi, fo, fe) ! 21: char *cmd, *fi, *fo, *fe; ! 22: { ! 23: register int pid, ret; ! 24: int status; ! 25: ! 26: if (fi == NULL) ! 27: fi = "/dev/null"; ! 28: if (fo == NULL) ! 29: fo = "/dev/null"; ! 30: if (fe == NULL) ! 31: fe = "/dev/null"; ! 32: ! 33: DEBUG(3, "shio - %s\n", cmd); ! 34: if ((pid = fork()) == 0) { ! 35: (void) signal(SIGINT, SIG_IGN); ! 36: (void) signal(SIGHUP, SIG_IGN); ! 37: (void) signal(SIGQUIT, SIG_IGN); ! 38: closelog(); ! 39: (void) close(Ifn); /* close connection fd's */ ! 40: (void) close(Ofn); ! 41: (void) close(0); /* get stdin from file fi */ ! 42: if (open(fi, 0) != 0) ! 43: exit(errno); ! 44: (void) close(1); /* divert stdout to fo */ ! 45: if (creat(fo, 0666) != 1) ! 46: exit(errno); ! 47: (void) close(2); /* divert stderr to fe */ ! 48: if (creat(fe, 0666) != 2) ! 49: exit(errno); ! 50: #ifdef V8 ! 51: close(3); /* get rid of /dev/tty */ ! 52: #endif ! 53: (void) execle(SHELL, "sh", "-c", cmd, 0, Env); ! 54: exit(100); ! 55: } ! 56: ! 57: /* ! 58: * the status returned from wait can never be -1 ! 59: * see man page wait(2) ! 60: * So we use the -1 value to indicate fork failed ! 61: */ ! 62: if (pid == -1) ! 63: return(-1); ! 64: ! 65: ! 66: while ((ret = wait(&status)) != pid && ret != -1); ! 67: DEBUG(3, "status %d\n", status); ! 68: return(status); ! 69: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.