From 3b50d1963aa9a19cf75a6fe8950d8647d1232105 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Thu, 20 Oct 2011 17:44:40 +0200 Subject: [PATCH] posix_openpt: Support for OpenBSD. * lib/posix_openpt.c [OpenBSD]: Include , . (posix_openpt) [OpenBSD]: New code. * lib/grantpt.c: Include . (grantpt) [OpenBSD]: Only test whether fd is valid, nothing else. * modules/grantpt (Depends-on): Add fcntl-h. --- ChangeLog | 9 +++++++++ lib/grantpt.c | 17 +++++++++++++---- lib/posix_openpt.c | 35 +++++++++++++++++++++++++++++++++-- modules/grantpt | 1 + 4 files changed, 56 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index fe3c52a8c..cbb2f2fbb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2011-10-20 Bruno Haible + posix_openpt: Support for OpenBSD. + * lib/posix_openpt.c [OpenBSD]: Include , . + (posix_openpt) [OpenBSD]: New code. + * lib/grantpt.c: Include . + (grantpt) [OpenBSD]: Only test whether fd is valid, nothing else. + * modules/grantpt (Depends-on): Add fcntl-h. + +2011-10-20 Bruno Haible + posix_openpt test: Coding style. * tests/test-posix_openpt.c: Use GNU coding style. diff --git a/lib/grantpt.c b/lib/grantpt.c index 985e31d5f..b757044ca 100644 --- a/lib/grantpt.c +++ b/lib/grantpt.c @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -46,6 +47,13 @@ int grantpt (int fd) { +#if defined __OpenBSD__ + /* On OpenBSD, master and slave of a pseudo-terminal are allocated together, + through an ioctl on /dev/ptm. There is no need for grantpt(). */ + if (fcntl (fd, F_GETFD) < 0) + return -1; + return 0; +#else /* This function is most often called from a process without 'root' credentials. Use the helper program. */ int retval = -1; @@ -56,20 +64,20 @@ grantpt (int fd) { /* This is executed in the child process. */ -#if HAVE_SETRLIMIT && defined RLIMIT_CORE +# if HAVE_SETRLIMIT && defined RLIMIT_CORE /* Disable core dumps. */ struct rlimit rl = { 0, 0 }; __setrlimit (RLIMIT_CORE, &rl); -#endif +# endif /* We pass the master pseudo terminal as file descriptor PTY_FILENO. */ if (fd != PTY_FILENO) if (__dup2 (fd, PTY_FILENO) < 0) _exit (FAIL_EBADF); -#ifdef CLOSE_ALL_FDS +# ifdef CLOSE_ALL_FDS CLOSE_ALL_FDS (); -#endif +# endif execle (_PATH_PT_CHOWN, strrchr (_PATH_PT_CHOWN, '/') + 1, NULL, NULL); _exit (FAIL_EXEC); @@ -111,4 +119,5 @@ grantpt (int fd) cleanup: return retval; +#endif } diff --git a/lib/posix_openpt.c b/lib/posix_openpt.c index 19cd0b6c2..d2e585a68 100644 --- a/lib/posix_openpt.c +++ b/lib/posix_openpt.c @@ -19,8 +19,12 @@ /* Specification. */ #include -#include #include +#include +#if defined __OpenBSD__ +# include +# include +#endif int posix_openpt (int flags) @@ -37,7 +41,34 @@ posix_openpt (int flags) master = -1; errno = ENOSYS; -#else /* MacOS, OpenBSD, HP-UX, IRIX, Solaris 9, Cygwin 1.5 */ +#elif defined __OpenBSD__ + + /* On OpenBSD, master and slave of a pseudo-terminal are allocated together, + by opening /dev/ptm and applying the PTMGET ioctl to it. */ + int fd; + struct ptmget data; + + fd = open (PATH_PTMDEV, O_RDWR); + if (fd >= 0) + { + if (ioctl (fd, PTMGET, &data) >= 0) + { + master = data.cfd; + close (data.sfd); + close (fd); + } + else + { + int saved_errno = errno; + close (fd); + errno = saved_errno; + master = -1; + } + } + else + master = -1; + +#else /* MacOS X, Minix, HP-UX, IRIX, OSF/1, Solaris 9, Cygwin 1.5 */ /* Most systems that lack posix_openpt() have /dev/ptmx. */ master = open ("/dev/ptmx", flags); diff --git a/modules/grantpt b/modules/grantpt index 2d63d2f77..77c7bc332 100644 --- a/modules/grantpt +++ b/modules/grantpt @@ -9,6 +9,7 @@ m4/grantpt.m4 Depends-on: stdlib extensions +fcntl-h [test $HAVE_GRANTPT = 0] pt_chown [test $HAVE_GRANTPT = 0] waitpid [test $HAVE_GRANTPT = 0] configmake [test $HAVE_GRANTPT = 0] -- 2.11.0