pipe: Set errno upon failure.
[gnulib.git] / m4 / pty.m4
index 1d8616d..d2f8110 100644 (file)
--- a/m4/pty.m4
+++ b/m4/pty.m4
-# pty.m4 serial 1
-dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+# pty.m4 serial 2
+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,
 dnl with or without modifications, as long as this notice is preserved.
 
-# gl_PTY
-# ------
-# Make sure that pty.h provides forkpty, or sets up a replacement header.
-# Also define automake variable PTY_LIB to the library needed (if any).
-AC_DEFUN([gl_PTY],
+# gl_PTY_LIB
+# ----------
+# Define automake variable PTY_LIB to the library needed (if any).
+AC_DEFUN([gl_PTY_LIB],
 [
-  PTY_H=''
-  PTY_LIB=''
-  # First make sure that pty.h provides forkpty, or setup the replacement.
-  AC_CHECK_HEADERS_ONCE([pty.h])
-  if test $ac_cv_header_pty_h != yes; then
-    AC_CHECK_DECL([forkpty],,, [[#include <util.h>]])
-    if test $ac_cv_have_decl_forkpty = no; then
-      AC_CHECK_DECL([forkpty],,, [[#include <libutil.h>]])
-      if test $ac_cv_have_decl_forkpty = no; then
-        AC_MSG_WARN([[Cannot find forkpty, build will likely fail]])
-      else
-        PTY_H='pty.h'
-        PTY_HEADER='libutil.h'
-      fi
-    else
-      PTY_H='pty.h'
-      PTY_HEADER='util.h'
-    fi
-  fi
-  # Second check for the library required for forkpty.
+  # Check for the library required for forkpty.
+  PTY_LIB=
   save_LIBS="$LIBS"
   AC_SEARCH_LIBS([forkpty], [util],
     [if test "$ac_cv_search_forkpty" != "none required"; then
        PTY_LIB="$ac_cv_search_forkpty"
      fi])
   LIBS="$save_LIBS"
-  AC_SUBST([PTY_H])
   AC_SUBST([PTY_LIB])
-  AC_SUBST([PTY_HEADER])
+])
+
+AC_DEFUN([gl_FORKPTY],
+[
+  AC_REQUIRE([gl_PTY_LIB])
+  AC_REQUIRE([gl_PTY])
+
+  AC_CHECK_DECLS([forkpty],,, [[
+#if HAVE_PTY_H
+# include <pty.h>
+#endif
+#if HAVE_UTIL_H
+# include <util.h>
+#endif
+#if HAVE_LIBUTIL_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 HAVE_PTY_H
+# include <pty.h>
+#endif
+#if HAVE_UTIL_H
+# include <util.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
+    AC_LIBOBJ([forkpty])
+  fi
+])
+
+AC_DEFUN([gl_OPENPTY],
+[
+  AC_REQUIRE([gl_PTY_LIB])
+  AC_REQUIRE([gl_PTY])
+
+  AC_CHECK_DECLS([openpty],,, [[
+#if HAVE_PTY_H
+# include <pty.h>
+#endif
+#if HAVE_UTIL_H
+# include <util.h>
+#endif
+#if HAVE_LIBUTIL_H
+# include <libutil.h>
+#endif
+]])
+  if test $ac_cv_have_decl_openpty = no; then
+    AC_MSG_WARN([[Cannot find openpty, build will likely fail]])
+  fi
+
+  dnl Prefer glibc's const-safe prototype, if available.
+  AC_CACHE_CHECK([for const-safe openpty signature],
+    [gl_cv_func_openpty_const],
+    [AC_COMPILE_IFELSE(
+      [AC_LANG_PROGRAM([[
+#if HAVE_PTY_H
+# include <pty.h>
+#endif
+#if HAVE_UTIL_H
+# include <util.h>
+#endif
+#if HAVE_LIBUTIL_H
+# include <libutil.h>
+#endif
+      ]], [[
+        int openpty (int *, int *, char *, struct termios const *,
+                     struct winsize const *);
+      ]])],
+      [gl_cv_func_openpty_const=yes], [gl_cv_func_openpty_const=no])])
+  if test $gl_cv_func_openpty_const != yes; then
+    REPLACE_OPENPTY=1
+    AC_LIBOBJ([openpty])
+  fi
 ])