Skip to content

Commit

Permalink
1.0.45.22: non-racy RUN-PROGRAM :PTY on OpenBSD
Browse files Browse the repository at this point in the history
  Patch by Josh Elsasser, lp#669485.

  Lifts out the pty-setting logic into its own function
  for clarity.
  • Loading branch information
nikodemus committed Feb 12, 2011
1 parent f821414 commit eb3a715
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 17 deletions.
1 change: 1 addition & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ changes relative to sbcl-1.0.45:
* bug fix: Solaris/x86-64 wasn't getting built with lutex support by
mistake. (lp#667297).
* bug fix: CONSTANTLY generated functions had bogus lambda-lists. (lp#713626)
* bug fix: RUN-PROGRAM :PTY option was racy on OpenBSD. (lp#669485)

changes in sbcl-1.0.45 relative to sbcl-1.0.44:
* enhancement: ~/ and ~user/ are treated specially in pathnames.
Expand Down
63 changes: 47 additions & 16 deletions src/runtime/run-program.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@
#include <sys/ioctl.h>
#include <termios.h>

#ifdef LISP_FEATURE_OPENBSD
/* FIXME: there has to be a better way to avoid ./util.h here */
#include </usr/include/util.h>
#endif

/* borrowed from detachtty's detachtty.c, in turn borrowed from APUE
* example code found at
Expand All @@ -54,6 +58,45 @@ int set_noecho(int fd)
return 1;
}

#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)
Expand All @@ -69,7 +112,7 @@ int spawn(char *program, char *argv[], int sin, int sout, int serr,
* share stdin with our parent. In the latter case we claim
* control of the terminal. */
if (sin >= 0) {
#if defined(LISP_FEATURE_HPUX)
#if defined(LISP_FEATURE_HPUX) || defined(LISP_FEATURE_OPENBSD)
setsid();
#elif defined(LISP_FEATURE_DARWIN)
setpgid(0, getpid());
Expand All @@ -87,21 +130,9 @@ int spawn(char *program, char *argv[], int sin, int sout, int serr,
sigprocmask(SIG_SETMASK, &sset, NULL);

/* If we are supposed to be part of some other pty, go for it. */
if (pty_name) {
#if !defined(LISP_FEATURE_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 (sin >= 0)
dup2(sin, 0);
Expand Down
2 changes: 1 addition & 1 deletion version.lisp-expr
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
"1.0.45.21"
"1.0.45.22"

0 comments on commit eb3a715

Please sign in to comment.