X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Frun-program.c;h=d1d98e63503ed0057ab3c3a9e79cad0c66818803;hb=2dfaffe8bdce30dac9b5baa4d2645d074a176b4f;hp=303b28028c45002103134cfee83b7e1738ff638d;hpb=2a1151093b4562726e6be51aeec690bb6b1f7d79;p=sbcl.git diff --git a/src/runtime/run-program.c b/src/runtime/run-program.c index 303b280..d1d98e6 100644 --- a/src/runtime/run-program.c +++ b/src/runtime/run-program.c @@ -55,7 +55,7 @@ int set_noecho(int fd) } extern char **environ; -int spawn(char *program, char *argv[], int stdin, int stdout, int stderr, +int spawn(char *program, char *argv[], int sin, int sout, int serr, int search, char *envp[], char *pty_name, int wait) { int pid = fork(); @@ -65,16 +65,22 @@ int spawn(char *program, char *argv[], int stdin, int stdout, int stderr, if (pid != 0) return pid; - /* Put us in our own process group. */ -#if defined(hpux) - setsid(); + /* Put us in our own process group, but only if we need not + * share stdin with our parent. In the latter case we claim + * control of the terminal. */ + if (sin >= 0) { +#if defined(LISP_FEATURE_HPUX) + setsid(); #elif defined(LISP_FEATURE_DARWIN) - setpgid(0, getpid()); + setpgid(0, getpid()); #elif defined(SVR4) || defined(__linux__) || defined(__osf__) - setpgrp(); + setpgrp(); #else - setpgrp(0, getpid()); + setpgrp(0, getpid()); #endif + } else { + tcsetpgrp(0, getpgrp()); + } /* unblock signals */ sigemptyset(&sset); @@ -82,7 +88,7 @@ int spawn(char *program, char *argv[], int stdin, int stdout, int stderr, /* If we are supposed to be part of some other pty, go for it. */ if (pty_name) { -#if !defined(hpux) && !defined(SVR4) +#if !defined(LISP_FEATURE_HPUX) && !defined(SVR4) fd = open("/dev/tty", O_RDWR, 0); if (fd >= 0) { ioctl(fd, TIOCNOTTY, 0); @@ -97,12 +103,12 @@ int spawn(char *program, char *argv[], int stdin, int stdout, int stderr, close(fd); } else{ /* Set up stdin, stdout, and stderr */ - if (stdin >= 0) - dup2(stdin, 0); - if (stdout >= 0) - dup2(stdout, 1); - if (stderr >= 0) - dup2(stderr, 2); + if (sin >= 0) + dup2(sin, 0); + if (sout >= 0) + dup2(sout, 1); + if (serr >= 0) + dup2(serr, 2); } /* Close all other fds. */ #ifdef SVR4 @@ -190,9 +196,9 @@ HANDLE spawn ( /* Spawn process given on the command line*/ if (search) - hProcess = (HANDLE) spawnvp ( wait_mode, program, argv ); + hProcess = (HANDLE) spawnvp ( wait_mode, program, argv ); else - hProcess = (HANDLE) spawnv ( wait_mode, program, argv ); + hProcess = (HANDLE) spawnv ( wait_mode, program, argv ); /* Now that the process is launched, replace the original * in/out/err handles and close the backups. */