use openpty(3) to grab a pseudo-tty, patterned after xterm; ok matthieu@

This commit is contained in:
naddy 2009-10-13 21:11:08 +00:00
parent 819b350709
commit e0924b72dd
4 changed files with 231 additions and 19 deletions

View File

@ -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

199
app/luit/configure vendored
View File

@ -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

View File

@ -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*)

View File

@ -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;