summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorChristian Weisgerber <naddy@cvs.openbsd.org>2009-10-13 21:11:09 +0000
committerChristian Weisgerber <naddy@cvs.openbsd.org>2009-10-13 21:11:09 +0000
commit8dcc1f96e7b589ccc27e2f0c317723150df6afc1 (patch)
treebd738d3c4828b61f2bfc05cc399700fee9b406ee /app
parent0ad995d6c9b3ceb0708b81c39df85885794b8107 (diff)
use openpty(3) to grab a pseudo-tty, patterned after xterm; ok matthieu@
Diffstat (limited to 'app')
-rw-r--r--app/luit/config.h.in6
-rw-r--r--app/luit/configure199
-rw-r--r--app/luit/configure.ac6
-rw-r--r--app/luit/sys.c39
4 files changed, 231 insertions, 19 deletions
diff --git a/app/luit/config.h.in b/app/luit/config.h.in
index f553cf46e..9a1a8c0d9 100644
--- a/app/luit/config.h.in
+++ b/app/luit/config.h.in
@@ -1,5 +1,11 @@
/* config.h.in. Generated from configure.ac by autoheader. */
+/* Define to 1 if you have the `grantpt' function. */
+#undef HAVE_GRANTPT
+
+/* Define to 1 if you have the `util' library (-lutil). */
+#undef HAVE_LIBUTIL
+
/* Define to 1 if you have the `z' library (-lz). */
#undef HAVE_LIBZ
diff --git a/app/luit/configure b/app/luit/configure
index c88288140..15a40d5c7 100644
--- a/app/luit/configure
+++ b/app/luit/configure
@@ -3644,6 +3644,185 @@ $as_echo "$as_me: error: zlib not found" >&2;}
fi
+# Check for openpty() in -lutil if the UNIX98-style pty functions are not
+# available. E.g. for GNU libc 2.0.
+
+for ac_func in grantpt
+do
+as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5
+$as_echo_n "checking for $ac_func... " >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ eval "$as_ac_var=yes"
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval 'as_val=${'$as_ac_var'}
+ $as_echo "$as_val"'`
+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if test `eval 'as_val=${'$as_ac_var'}
+ $as_echo "$as_val"'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+
+{ $as_echo "$as_me:$LINENO: checking for openpty in -lutil" >&5
+$as_echo_n "checking for openpty in -lutil... " >&6; }
+if test "${ac_cv_lib_util_openpty+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lutil $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char openpty ();
+int
+main ()
+{
+return openpty ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ ac_cv_lib_util_openpty=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_util_openpty=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_util_openpty" >&5
+$as_echo "$ac_cv_lib_util_openpty" >&6; }
+if test $ac_cv_lib_util_openpty = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBUTIL 1
+_ACEOF
+
+ LIBS="-lutil $LIBS"
+
+fi
+
+fi
+done
+
+
# Check whether --with-localealiasfile was given.
if test "${with_localealiasfile+set}" = set; then
@@ -3785,12 +3964,12 @@ if test -n "$PKG_CONFIG"; then
pkg_cv_LUIT_CFLAGS="$LUIT_CFLAGS"
else
if test -n "$PKG_CONFIG" && \
- { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"x11 fontenc\"") >&5
- ($PKG_CONFIG --exists --print-errors "x11 fontenc") 2>&5
+ { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"fontenc\"") >&5
+ ($PKG_CONFIG --exists --print-errors "fontenc") 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; then
- pkg_cv_LUIT_CFLAGS=`$PKG_CONFIG --cflags "x11 fontenc" 2>/dev/null`
+ pkg_cv_LUIT_CFLAGS=`$PKG_CONFIG --cflags "fontenc" 2>/dev/null`
else
pkg_failed=yes
fi
@@ -3803,12 +3982,12 @@ if test -n "$PKG_CONFIG"; then
pkg_cv_LUIT_LIBS="$LUIT_LIBS"
else
if test -n "$PKG_CONFIG" && \
- { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"x11 fontenc\"") >&5
- ($PKG_CONFIG --exists --print-errors "x11 fontenc") 2>&5
+ { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"fontenc\"") >&5
+ ($PKG_CONFIG --exists --print-errors "fontenc") 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; then
- pkg_cv_LUIT_LIBS=`$PKG_CONFIG --libs "x11 fontenc" 2>/dev/null`
+ pkg_cv_LUIT_LIBS=`$PKG_CONFIG --libs "fontenc" 2>/dev/null`
else
pkg_failed=yes
fi
@@ -3827,14 +4006,14 @@ else
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
- LUIT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "x11 fontenc"`
+ LUIT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fontenc"`
else
- LUIT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "x11 fontenc"`
+ LUIT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fontenc"`
fi
# Put the nasty error message in config.log where it belongs
echo "$LUIT_PKG_ERRORS" >&5
- { { $as_echo "$as_me:$LINENO: error: Package requirements (x11 fontenc) were not met:
+ { { $as_echo "$as_me:$LINENO: error: Package requirements (fontenc) were not met:
$LUIT_PKG_ERRORS
@@ -3845,7 +4024,7 @@ Alternatively, you may set the environment variables LUIT_CFLAGS
and LUIT_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
" >&5
-$as_echo "$as_me: error: Package requirements (x11 fontenc) were not met:
+$as_echo "$as_me: error: Package requirements (fontenc) were not met:
$LUIT_PKG_ERRORS
diff --git a/app/luit/configure.ac b/app/luit/configure.ac
index 2fb4fddc9..752618236 100644
--- a/app/luit/configure.ac
+++ b/app/luit/configure.ac
@@ -34,6 +34,10 @@ AC_CANONICAL_HOST
AC_CHECK_LIB(z, gzopen,, AC_MSG_ERROR([zlib not found]))
+# Check for openpty() in -lutil if the UNIX98-style pty functions are not
+# available. E.g. for GNU libc 2.0.
+AC_CHECK_FUNCS(grantpt, [], AC_CHECK_LIB(util,openpty))
+
AC_ARG_WITH(localealiasfile,
AC_HELP_STRING([--with-localealiasfile=<path>],
[The locale alias file (default: ${datadir}/X11/locale/locale.alias)]),
@@ -42,7 +46,7 @@ AC_ARG_WITH(localealiasfile,
AC_SUBST([LOCALEALIASFILE])
# Checks for pkg-config packages
-PKG_CHECK_MODULES(LUIT, x11 fontenc)
+PKG_CHECK_MODULES(LUIT, fontenc)
case $host_os in
linux*)
diff --git a/app/luit/sys.c b/app/luit/sys.c
index efec546af..070188235 100644
--- a/app/luit/sys.c
+++ b/app/luit/sys.c
@@ -34,6 +34,10 @@ THE SOFTWARE.
#include <signal.h>
#include <errno.h>
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
#ifdef SVR4
#define HAVE_POLL
#endif
@@ -54,16 +58,21 @@ THE SOFTWARE.
#endif
-#if (defined(__GLIBC__) && \
- (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1))) || \
- defined(SVR4)
-#define HAVE_GRANTPT
-#endif
-
#ifdef __GLIBC__
#include <pty.h>
#endif
+#ifdef HAVE_LIBUTIL
+#if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__)
+#include <util.h>
+#define HAVE_OPENPTY
+#endif
+#if defined(__FreeBSD__) || defined(__DragonFly__)
+#include <libutil.h>
+#define HAVE_OPENPTY
+#endif
+#endif
+
#ifdef SVR4
#include <stropts.h>
#endif
@@ -327,6 +336,10 @@ fix_pty_perms(char *line)
return 1;
}
+#ifdef HAVE_OPENPTY
+static int opened_tty = -1;
+#endif
+
int
allocatePty(int *pty_return, char **line_return)
{
@@ -372,10 +385,16 @@ allocatePty(int *pty_return, char **line_return)
*pty_return = pty;
*line_return = line;
return 0;
-
- bsd:
#endif /* HAVE_GRANTPT */
+#ifdef HAVE_OPENPTY
+ if(openpty(pty_return, &opened_tty, NULL, NULL, NULL) < 0)
+ return -1;
+ *line_return = NULL; /* unused, but free()ed */
+ return 0;
+#endif /* HAVE_OPENPTY */
+
+ bsd:
strcpy(name, "/dev/pty??");
for(p1 = name1; *p1; p1++) {
name[8] = *p1;
@@ -416,7 +435,11 @@ openTty(char *line)
int rc;
int tty = -1;
+#if !defined(HAVE_GRANTPT) && defined(HAVE_OPENPTY)
+ tty = opened_tty;
+#else
tty = open(line, O_RDWR | O_NOCTTY);
+#endif
if(tty < 0)
goto bail;