From: William Harold Newman Date: Thu, 28 Sep 2000 15:28:07 +0000 (+0000) Subject: cleanup of previous CVS-check-in mistakes X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=d4aacd80215d0376af6f866a922854f83797ff59;p=sbcl.git cleanup of previous CVS-check-in mistakes I did "cvs add" for files which I'd overlooked in previous checkins. I miss pcl-cvs.:-( --- diff --git a/src/runtime/GNUmakefile b/src/runtime/GNUmakefile index a8c4e79..9f96cd5 100644 --- a/src/runtime/GNUmakefile +++ b/src/runtime/GNUmakefile @@ -25,7 +25,7 @@ include Config SRCS = alloc.c backtrace.c breakpoint.c coreparse.c \ dynbind.c globals.c interr.c interrupt.c \ monitor.c parse.c print.c purify.c \ - regnames.c runprog.c runtime.c save.c search.c \ + regnames.c run-program.c runtime.c save.c search.c \ time.c validate.c vars.c \ ${ARCH_SRC} ${ASSEM_SRC} ${OS_SRC} ${GC_SRC} diff --git a/src/runtime/run-program.c b/src/runtime/run-program.c new file mode 100644 index 0000000..a4bfbf1 --- /dev/null +++ b/src/runtime/run-program.c @@ -0,0 +1,89 @@ +/* + * support for the Lisp function RUN-PROGRAM and friends + */ + +/* + * This software is part of the SBCL system. See the README file for + * more information. + * + * This software is derived from the CMU CL system, which was + * written at Carnegie Mellon University and released into the + * public domain. The software is in the public domain and is + * provided with absolutely no warranty. See the COPYING and CREDITS + * files for more information. + */ + +/* + * $Header$ + */ + +#include +#include +#include +#ifdef SVR4 +#include +#endif + +int spawn(char *program, char *argv[], char *envp[], char *pty_name, + int stdin, int stdout, int stderr) +{ + int pid = fork(); + int fd; + + if (pid != 0) + return pid; + + /* Put us in our own process group. */ +#if defined(hpux) + setsid(); +#elif defined(SVR4) + setpgrp(); +#else + setpgrp(0, getpid()); +#endif + + /* 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); + dup2(fd, 1); + dup2(fd, 2); + close(fd); + } + + /* Set up stdin, stdout, and stderr */ + if (stdin >= 0) + dup2(stdin, 0); + if (stdout >= 0) + dup2(stdout, 1); + if (stderr >= 0) + dup2(stderr, 2); + + /* Close all other fds. */ +#ifdef SVR4 + for (fd = sysconf(_SC_OPEN_MAX)-1; fd >= 3; fd--) + close(fd); +#else + for (fd = getdtablesize()-1; fd >= 3; fd--) + close(fd); +#endif + + /* 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); + + /* The exec didn't work, flame out. */ + exit(1); +} diff --git a/version.lisp-expr b/version.lisp-expr index 7205a7a..f476b4c 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -15,4 +15,4 @@ ;;; versions, and a string a la "0.6.5.12" is used for versions which ;;; aren't released but correspond only to CVS tags or snapshots. -"0.6.7.4" +"0.6.7.5"