diff options
author | Christian Weisgerber <naddy@cvs.openbsd.org> | 2009-10-13 21:11:09 +0000 |
---|---|---|
committer | Christian Weisgerber <naddy@cvs.openbsd.org> | 2009-10-13 21:11:09 +0000 |
commit | 8dcc1f96e7b589ccc27e2f0c317723150df6afc1 (patch) | |
tree | bd738d3c4828b61f2bfc05cc399700fee9b406ee /app | |
parent | 0ad995d6c9b3ceb0708b81c39df85885794b8107 (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.in | 6 | ||||
-rw-r--r-- | app/luit/configure | 199 | ||||
-rw-r--r-- | app/luit/configure.ac | 6 | ||||
-rw-r--r-- | app/luit/sys.c | 39 |
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; |