X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Frun-program.c;h=64d9bdf355b582ccc6b647a2e38617272f0358ce;hb=f17e3d27d7ff599f9443d011d17017a2a858c81a;hp=61ad7617bd871f974c4a846654d21d79e85d19d4;hpb=7275aafca8c682f874161d92aa07662a53f056b7;p=sbcl.git diff --git a/src/runtime/run-program.c b/src/runtime/run-program.c index 61ad761..64d9bdf 100644 --- a/src/runtime/run-program.c +++ b/src/runtime/run-program.c @@ -29,6 +29,10 @@ #include #include +#ifdef LISP_FEATURE_OPENBSD +/* FIXME: there has to be a better way to avoid ./util.h here */ +#include +#endif /* borrowed from detachtty's detachtty.c, in turn borrowed from APUE * example code found at @@ -54,8 +58,48 @@ int set_noecho(int fd) return 1; } -int spawn(char *program, char *argv[], char *envp[], char *pty_name, - int stdin, int stdout, int stderr) +#if defined(LISP_FEATURE_OPENBSD) + +int +set_pty(char *pty_name) +{ + int fd; + + if ((fd = open(pty_name, O_RDWR, 0)) == -1 || + login_tty(fd) == -1) + return (0); + return (set_noecho(STDIN_FILENO)); +} + +#else /* !LISP_FEATURE_OPENBSD */ + +int +set_pty(char *pty_name) +{ + int fd; + +#if !defined(LISP_FEATURE_HPUX) && !defined(SVR4) + fd = open("/dev/tty", O_RDWR, 0); + if (fd >= 0) { + ioctl(fd, TIOCNOTTY, 0); + close(fd); + } +#endif + if ((fd = open(pty_name, O_RDWR, 0)) == -1) + return (-1); + dup2(fd, 0); + set_noecho(0); + dup2(fd, 1); + dup2(fd, 2); + close(fd); + return (0); +} + +#endif /* !LISP_FEATURE_OPENBSD */ + +extern char **environ; +int spawn(char *program, char *argv[], int sin, int sout, int serr, + int search, char *envp[], char *pty_name, int wait) { int pid = fork(); int fd; @@ -64,42 +108,38 @@ int spawn(char *program, char *argv[], char *envp[], char *pty_name, 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) || defined(LISP_FEATURE_OPENBSD) + setsid(); +#elif defined(LISP_FEATURE_DARWIN) + 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); sigprocmask(SIG_SETMASK, &sset, NULL); /* If we are supposed to be part of some other pty, go for it. */ - if (pty_name) { -#if !defined(hpux) && !defined(SVR4) - fd = open("/dev/tty", O_RDWR, 0); - if (fd >= 0) { - ioctl(fd, TIOCNOTTY, 0); - close(fd); - } -#endif - fd = open(pty_name, O_RDWR, 0); - dup2(fd, 0); - set_noecho(0); - dup2(fd, 1); - dup2(fd, 2); - close(fd); - } else{ + if (pty_name) + set_pty(pty_name); + 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 @@ -110,16 +150,14 @@ int spawn(char *program, char *argv[], char *envp[], char *pty_name, close(fd); #endif + environ = envp; /* Exec the program. */ - execve(program, argv, envp); - - /* It didn't work, so try /bin/sh. */ - argv[0] = program; - argv[-1] = "sh"; - execve("/bin/sh", argv-1, envp); + if (search) + execvp(program, argv); + else + execv(program, argv); - /* The exec didn't work, flame out. */ - exit(1); + exit (1); } #else /* !LISP_FEATURE_WIN32 */ @@ -147,6 +185,9 @@ HANDLE spawn ( int in, int out, int err, + int search, + char *envp, + char *ptyname, int wait ) { @@ -185,7 +226,10 @@ HANDLE spawn ( } /* Spawn process given on the command line*/ - hProcess = (HANDLE) spawnvp ( wait_mode, program, argv ); + if (search) + hProcess = (HANDLE) spawnvp ( wait_mode, program, argv ); + else + hProcess = (HANDLE) spawnv ( wait_mode, program, argv ); /* Now that the process is launched, replace the original * in/out/err handles and close the backups. */