From: Bruno Haible Date: Mon, 22 Mar 2010 01:46:57 +0000 (+0100) Subject: forkpty: Provide replacement on AIX, HP-UX, IRIX, Solaris. X-Git-Tag: v0.1~4447 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=eb8d73f9107decfddc7de65c4d3ba55b85850b8e;p=gnulib.git forkpty: Provide replacement on AIX, HP-UX, IRIX, Solaris. --- diff --git a/ChangeLog b/ChangeLog index dd31e8980..78de306a7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,19 @@ 2010-03-21 Bruno Haible + forkpty: Provide replacement on AIX, HP-UX, IRIX, Solaris. + * lib/forkpty.c (forkpty): New replacement function, from glibc with + modifications. + * lib/pty.in.h (forkpty): Update declaration. Add comments. + * m4/pty.m4 (gl_FORKPTY): If forkpty is not declared, arrange to + provide the replacement. + * modules/forkpty (Depends-on): Add openpty, login_tty. + * m4/pty_h.m4 (gl_PTY_H_DEFAULTS): Initialize HAVE_FORKPTY. + * modules/pty (Makefile.am): Substitute HAVE_FORKPTY. + * doc/glibc-functions/forkpty.texi: More supported platforms. + * config/srclist.txt: Add forkpty.c (commented). + +2010-03-21 Bruno Haible + * modules/forkpty-tests: Use the common TEMPLATE-TESTS. (Makefile.am): Verify that PTY_LIB is defined. diff --git a/config/srclist.txt b/config/srclist.txt index 41a65b0a1..3cb0d95f0 100644 --- a/config/srclist.txt +++ b/config/srclist.txt @@ -174,6 +174,7 @@ $LIBCSRC/stdlib/strtoul.c lib gpl #$LIBCSRC/locale/programs/xmalloc.c lib gpl #$LIBCSRC/locale/programs/xstrdup.c lib gpl # +#$LIBCSRC/login/forkpty.c lib gpl #$LIBCSRC/login/programs/pt_chown.c lib gpl # # http://sources.redhat.com/bugzilla/show_bug.cgi?id=321 diff --git a/doc/glibc-functions/forkpty.texi b/doc/glibc-functions/forkpty.texi index aecc2329e..d12eaaa1b 100644 --- a/doc/glibc-functions/forkpty.texi +++ b/doc/glibc-functions/forkpty.texi @@ -7,6 +7,9 @@ Gnulib module: forkpty Portability problems fixed by Gnulib: @itemize @item +This function is missing on some platforms: +AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, mingw. +@item One some systems (at least including Cygwin, Interix, OSF/1 4 and 5, and Mac OS X) linking with @code{-lutil} is not required. @item @@ -24,6 +27,4 @@ FreeBSD, Cygwin 1.7.1. Portability problems not fixed by Gnulib: @itemize -On some systems (at least including Solaris and HP-UX) the function is -missing. @end itemize diff --git a/lib/forkpty.c b/lib/forkpty.c index adbc3d551..942aa5477 100644 --- a/lib/forkpty.c +++ b/lib/forkpty.c @@ -1,4 +1,4 @@ -/* Fork a child attached to a pseudo-terminal descriptor. +/* Fork a child process attached to the slave of a pseudo-terminal. Copyright (C) 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify @@ -19,7 +19,9 @@ /* Specification. */ #include -#if HAVE_DECL_FORKPTY +#if HAVE_FORKPTY + +/* Provider a wrapper with the precise POSIX prototype. */ # undef forkpty int rpl_forkpty (int *amaster, char *name, struct termios const *termp, @@ -29,7 +31,43 @@ rpl_forkpty (int *amaster, char *name, struct termios const *termp, return forkpty (amaster, name, (struct termios *) termp, (struct winsize *) winp); } -#else -# error forkpty has not been ported to your system; \ - report this to bug-gnulib@gnu.org for help + +#else /* AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, mingw */ + +# include +# include + +extern int login_tty (int slave_fd); + +int +forkpty (int *amaster, char *name, + const struct termios *termp, const struct winsize *winp) +{ + int master, slave, pid; + + if (openpty (&master, &slave, name, termp, winp) == -1) + return -1; + + switch (pid = fork ()) + { + case -1: + close (master); + close (slave); + return -1; + + case 0: + /* Child. */ + close (master); + if (login_tty (slave)) + _exit (1); + return 0; + + default: + /* Parent. */ + *amaster = master; + close (slave); + return pid; + } +} + #endif diff --git a/lib/pty.in.h b/lib/pty.in.h index bec0a51d4..af98dfe2a 100644 --- a/lib/pty.in.h +++ b/lib/pty.in.h @@ -48,21 +48,30 @@ /* Declare overridden functions. */ #if @GNULIB_FORKPTY@ +/* Create pseudo tty master slave pair and set terminal attributes + according to TERMP and WINP. Fork a child process attached to the + slave end. Return a handle for the master end in *AMASTER, and + return the name of the slave end in NAME. */ # if @REPLACE_FORKPTY@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef forkpty # define forkpty rpl_forkpty # endif _GL_FUNCDECL_RPL (forkpty, int, - (int *, char *, struct termios const *, - struct winsize const *)); + (int *amaster, char *name, + struct termios const *termp, struct winsize const *winp)); _GL_CXXALIAS_RPL (forkpty, int, - (int *, char *, struct termios const *, - struct winsize const *)); + (int *amaster, char *name, + struct termios const *termp, struct winsize const *winp)); # else +# if !@HAVE_FORKPTY@ +_GL_FUNCDECL_SYS (forkpty, int, + (int *amaster, char *name, + struct termios const *termp, struct winsize const *winp)); +# endif _GL_CXXALIAS_SYS (forkpty, int, - (int *, char *, struct termios const *, - struct winsize const *)); + (int *amaster, char *name, + struct termios const *termp, struct winsize const *winp)); # endif _GL_CXXALIASWARN (forkpty); #elif defined GNULIB_POSIXCHECK diff --git a/m4/pty.m4 b/m4/pty.m4 index f795792e1..60bd73f5e 100644 --- a/m4/pty.m4 +++ b/m4/pty.m4 @@ -1,4 +1,4 @@ -# pty.m4 serial 4 +# pty.m4 serial 5 dnl Copyright (C) 2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -25,6 +25,8 @@ AC_DEFUN([gl_FORKPTY], AC_REQUIRE([gl_PTY_LIB]) AC_REQUIRE([gl_PTY_H]) + dnl We assume that forkpty exists (possibly in libc, possibly in libutil) + dnl if and only if it is declared. AC_CHECK_DECLS([forkpty],,, [[ #if HAVE_PTY_H # include @@ -36,15 +38,13 @@ AC_DEFUN([gl_FORKPTY], # include #endif ]]) - if test $ac_cv_have_decl_forkpty = no; then - AC_MSG_WARN([[Cannot find forkpty, build will likely fail]]) - fi - - dnl Prefer glibc's const-safe prototype, if available. - AC_CACHE_CHECK([for const-safe forkpty signature], - [gl_cv_func_forkpty_const], - [AC_COMPILE_IFELSE( - [AC_LANG_PROGRAM([[ + if test $ac_cv_have_decl_forkpty = yes; then + dnl The system has forkpty. + dnl Prefer glibc's const-safe prototype, if available. + AC_CACHE_CHECK([for const-safe forkpty signature], + [gl_cv_func_forkpty_const], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[ #if HAVE_PTY_H # include #endif @@ -54,13 +54,20 @@ AC_DEFUN([gl_FORKPTY], #if HAVE_LIBUTIL_H # include #endif - ]], [[ - int forkpty (int *, char *, struct termios const *, - struct winsize const *); - ]])], - [gl_cv_func_forkpty_const=yes], [gl_cv_func_forkpty_const=no])]) - if test $gl_cv_func_forkpty_const != yes; then - REPLACE_FORKPTY=1 + ]], [[ + int forkpty (int *, char *, struct termios const *, + struct winsize const *); + ]]) + ], + [gl_cv_func_forkpty_const=yes], [gl_cv_func_forkpty_const=no]) + ]) + if test $gl_cv_func_forkpty_const != yes; then + REPLACE_FORKPTY=1 + AC_LIBOBJ([forkpty]) + fi + else + dnl The system does not have forkpty. + HAVE_FORKPTY=0 AC_LIBOBJ([forkpty]) fi ]) diff --git a/m4/pty_h.m4 b/m4/pty_h.m4 index 33cb43c4f..655170d35 100644 --- a/m4/pty_h.m4 +++ b/m4/pty_h.m4 @@ -1,4 +1,4 @@ -# pty_h.m4 serial 7 +# pty_h.m4 serial 8 dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -60,6 +60,7 @@ AC_DEFUN([gl_PTY_H_DEFAULTS], dnl Assume proper GNU behavior unless another module says otherwise. HAVE_UTIL_H=0; AC_SUBST([HAVE_UTIL_H]) HAVE_LIBUTIL_H=0; AC_SUBST([HAVE_LIBUTIL_H]) + HAVE_FORKPTY=1; AC_SUBST([HAVE_FORKPTY]) HAVE_OPENPTY=1; AC_SUBST([HAVE_OPENPTY]) REPLACE_FORKPTY=0; AC_SUBST([REPLACE_FORKPTY]) REPLACE_OPENPTY=0; AC_SUBST([REPLACE_OPENPTY]) diff --git a/modules/forkpty b/modules/forkpty index 8fcb38219..6df3cb471 100644 --- a/modules/forkpty +++ b/modules/forkpty @@ -1,5 +1,6 @@ Description: -Provide the forkpty() function. +forkpty() function: Open a pseudo-terminal, fork, and connect the child process +to the pseudo-terminal's slave. Files: lib/forkpty.c @@ -7,6 +8,8 @@ m4/pty.m4 Depends-on: pty +openpty +login_tty configure.ac: gl_FORKPTY diff --git a/modules/pty b/modules/pty index aed240647..bc83a29f4 100644 --- a/modules/pty +++ b/modules/pty @@ -29,6 +29,7 @@ pty.h: pty.in.h $(CXXDEFS_H) $(WARN_ON_USE_H) -e 's|@''GNULIB_OPENPTY''@|$(GNULIB_OPENPTY)|g' \ -e 's|@''HAVE_UTIL_H''@|$(HAVE_UTIL_H)|g' \ -e 's|@''HAVE_LIBUTIL_H''@|$(HAVE_LIBUTIL_H)|g' \ + -e 's|@''HAVE_FORKPTY''@|$(HAVE_FORKPTY)|g' \ -e 's|@''HAVE_OPENPTY''@|$(HAVE_OPENPTY)|g' \ -e 's|@''REPLACE_FORKPTY''@|$(REPLACE_FORKPTY)|g' \ -e 's|@''REPLACE_OPENPTY''@|$(REPLACE_OPENPTY)|g' \