+2010-03-21 Bruno Haible <bruno@clisp.org>
+
+ 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 <bruno@clisp.org>
* modules/forkpty-tests: Use the common TEMPLATE-TESTS.
#$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
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
Portability problems not fixed by Gnulib:
@itemize
-On some systems (at least including Solaris and HP-UX) the function is
-missing.
@end itemize
-/* 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
/* Specification. */
#include <pty.h>
-#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,
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 <pty.h>
+# include <unistd.h>
+
+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
/* 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
-# 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,
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 <pty.h>
# include <libutil.h>
#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 <pty.h>
#endif
#if HAVE_LIBUTIL_H
# include <libutil.h>
#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
])
-# 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,
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])
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
Depends-on:
pty
+openpty
+login_tty
configure.ac:
gl_FORKPTY
-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' \