From bb9b3acd1f56ad7196fc8fd8432990918dd681c2 Mon Sep 17 00:00:00 2001 From: ayin Date: Sat, 21 Jan 2006 18:14:57 +0000 Subject: [PATCH] *** empty log message *** --- aclocal.m4 | 404 ++++++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 422 +-------------------------------------------------- src/ptytty.C | 166 ++++++-------------- src/ptytty.h | 7 +- 4 files changed, 452 insertions(+), 547 deletions(-) diff --git a/aclocal.m4 b/aclocal.m4 index 661621e2..5aefb94b 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -229,3 +229,407 @@ dnl XXX Shouldn't this really use AC_TRY_LINK to be portable & robust?? done]) fi ]) + +AC_DEFUN([PTY_CHECK], +[ +AC_CHECK_HEADERS( \ + pty.h \ + util.h \ + libutil.h \ + sys/ioctl.h \ + sys/stropts.h \ +) + +AC_CHECK_FUNCS( \ + revoke \ + _getpty \ + getpt \ + posix_openpt \ + isastream \ +) + +have_clone=no + +AC_MSG_CHECKING(for /dev/ptym/clone) +if test -e /dev/ptym/clone; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_DEV_CLONE, 1, [Define to 1 if you have /dev/ptym/clone]) + AC_DEFINE(CLONE_DEVICE, "/dev/ptym/clone", [clone device filename]) + have_clone=yes +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(for /dev/ptc) +if test -e /dev/ptc; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_DEV_PTC, 1, [Define to 1 if you have /dev/ptc]) + AC_DEFINE(CLONE_DEVICE, "/dev/ptc", [clone device filename]) + have_clone=yes +else + AC_MSG_RESULT(no) +fi + +case $host in + *-*-cygwin*) + have_clone=yes + AC_DEFINE(CLONE_DEVICE, "/dev/ptmx", [clone device filename]) + ;; + *) + AC_MSG_CHECKING(for /dev/ptmx) + if test -e /dev/ptmx; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_DEV_PTMX, 1, [Define to 1 if you have /dev/ptmx]) + AC_DEFINE(CLONE_DEVICE, "/dev/ptmx", [clone device filename]) + have_clone=yes + else + AC_MSG_RESULT(no) + fi + ;; +esac + +if test x$ac_cv_func_getpt = xyes -o x$ac_cv_func_posix_openpt = xyes -o x$have_clone = xyes; then + AC_MSG_CHECKING(for UNIX98 ptys) + AC_TRY_LINK([#include ], + [grantpt(0);unlockpt(0);ptsname(0);], + [unix98_pty=yes + AC_DEFINE(UNIX98_PTY, 1, "") + AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no)]) +fi + +if test -z "$unix98_pty"; then + AC_CHECK_FUNCS(openpty, [], [AC_CHECK_LIB(util, openpty, [AC_DEFINE(HAVE_OPENPTY) LIBS="$LIBS -lutil"])]) +fi +]) + +AC_DEFUN([UTMP_CHECK], +[ +AC_CHECK_FUNCS( \ + ttyslot \ + updwtmp \ + updwtmpx \ +) + +AC_CHECK_HEADERS( \ + utmp.h \ + utmpx.h \ + lastlog.h \ +) + +dnl# -------------------------------------------------------------------------- +dnl# DO ALL UTMP AND WTMP CHECKING +dnl# -------------------------------------------------------------------------- +dnl# check for host field in utmp structure + +dnl# -------------------------------------------- +AC_CHECK_HEADER(utmp.h, +[AC_CACHE_CHECK([for struct utmp], rxvt_cv_struct_utmp, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include +#include ]], [[struct utmp ut;]])],[rxvt_cv_struct_utmp=yes],[rxvt_cv_struct_utmp=no])]) +if test x$rxvt_cv_struct_utmp = xyes; then + AC_DEFINE(HAVE_STRUCT_UTMP, 1, Define if utmp.h has struct utmp) +fi +] + +AC_CACHE_CHECK(for ut_host in utmp struct, rxvt_cv_struct_utmp_host, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include +#include ]], [[struct utmp ut; ut.ut_host;]])],[rxvt_cv_struct_utmp_host=yes],[rxvt_cv_struct_utmp_host=no])]) +if test x$rxvt_cv_struct_utmp_host = xyes; then + AC_DEFINE(HAVE_UTMP_HOST, 1, Define if struct utmp contains ut_host) +fi + +AC_CACHE_CHECK(for ut_pid in utmp struct, rxvt_cv_struct_utmp_pid, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include +#include ]], [[struct utmp ut; ut.ut_pid;]])],[rxvt_cv_struct_utmp_pid=yes],[rxvt_cv_struct_utmp_pid=no])]) +if test x$rxvt_cv_struct_utmp_pid = xyes; then + AC_DEFINE(HAVE_UTMP_PID, 1, Define if struct utmp contains ut_pid) +fi +) dnl# AC_CHECK_HEADER(utmp.h + +dnl# -------------------------------------------- + +AC_CHECK_HEADER(utmpx.h, +[AC_CACHE_CHECK([for struct utmpx], rxvt_cv_struct_utmpx, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include +#include ]], [[struct utmpx ut;]])],[rxvt_cv_struct_utmpx=yes],[rxvt_cv_struct_utmpx=no])]) +if test x$rxvt_cv_struct_utmpx = xyes; then + AC_DEFINE(HAVE_STRUCT_UTMPX, 1, Define if utmpx.h has struct utmpx) +fi +] + +AC_CACHE_CHECK(for host in utmpx struct, rxvt_cv_struct_utmpx_host, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include +#include ]], [[struct utmpx utx; utx.ut_host;]])],[rxvt_cv_struct_utmpx_host=yes],[rxvt_cv_struct_utmpx_host=no])]) +if test x$rxvt_cv_struct_utmpx_host = xyes; then + AC_DEFINE(HAVE_UTMPX_HOST, 1, Define if struct utmpx contains ut_host) +fi + +AC_CACHE_CHECK(for session in utmpx struct, rxvt_cv_struct_utmpx_session, +[AC_TRY_COMPILE([#include +#include ], +[struct utmpx utx; utx.ut_session;], +rxvt_cv_struct_utmpx_session=yes, rxvt_cv_struct_utmpx_session=no)]) +if test x$rxvt_cv_struct_utmpx_session = xyes; then + AC_DEFINE(HAVE_UTMPX_SESSION, 1, Define if struct utmpx contains ut_session) +fi +) dnl# AC_CHECK_HEADER(utmpx.h + +dnl# -------------------------------------------------------------------------- +dnl# check for struct lastlog +AC_CACHE_CHECK(for struct lastlog, rxvt_cv_struct_lastlog, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include +#include +#ifdef HAVE_LASTLOG_H +#include +#endif +]], [[struct lastlog ll;]])],[rxvt_cv_struct_lastlog=yes],[rxvt_cv_struct_lastlog=no])]) +if test x$rxvt_cv_struct_lastlog = xyes; then + AC_DEFINE(HAVE_STRUCT_LASTLOG, 1, Define if utmp.h or lastlog.h has struct lastlog) +fi + +dnl# check for struct lastlogx +AC_CACHE_CHECK(for struct lastlogx, rxvt_cv_struct_lastlogx, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include +#include +#ifdef HAVE_LASTLOG_H +#include +#endif +]], [[struct lastlogx ll;]])],[rxvt_cv_struct_lastlogx=yes],[rxvt_cv_struct_lastlogx=no])]) +if test x$rxvt_cv_struct_lastlogx = xyes; then + AC_DEFINE(HAVE_STRUCT_LASTLOGX, 1, Define if utmpx.h or lastlog.h has struct lastlogx) +fi + +dnl# -------------------------------------------------------------------------- +dnl# FIND FILES +dnl# -------------------------------------------------------------------------- + +dnl# find utmp +AC_CACHE_CHECK(where utmp is located, rxvt_cv_path_utmp, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include +#include +#include +#include +main() +{ + char **u, *utmplist[] = { + "/var/run/utmp", "/var/adm/utmp", "/etc/utmp", "/usr/etc/utmp", "/usr/adm/utmp", NULL }; + FILE *a, *f=fopen("conftestval", "w"); + if (!f) exit(1); +#ifdef UTMP_FILE + fprintf(f, "%s\n", UTMP_FILE); + exit(0); +#endif +#ifdef _PATH_UTMP + fprintf(f, "%s\n", _PATH_UTMP); + exit(0); +#endif + for (u = utmplist; *u; u++) { + if ((a = fopen(*u, "r")) != NULL || errno == EACCES) { + fprintf(f, "%s\n", *u); + exit(0); + } + } + exit(0); +}]])],[rxvt_cv_path_utmp=`cat conftestval`],[rxvt_cv_path_utmp=],[dnl + AC_MSG_WARN(Define RXVT_UTMP_FILE in config.h manually)])]) +if test x$rxvt_cv_path_utmp != x; then + AC_DEFINE_UNQUOTED(RXVT_UTMP_FILE, "$rxvt_cv_path_utmp", Define location of utmp) +fi + +dnl# -------------------------------------------------------------------------- + +dnl# find utmpx - if a utmp file exists at the same location and is more than +dnl# a day newer, then dump the utmpx. People leave lots of junk around. +AC_CACHE_CHECK(where utmpx is located, rxvt_cv_path_utmpx, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include +#include +#include +#include +#include +#ifdef HAVE_STRING_H +#include +#endif +main() +{ + char **u, *p, *utmplist[] = { +#ifdef UTMPX_FILE + UTMPX_FILE, +#endif +#ifdef _PATH_UTMPX + _PATH_UTMPX, +#endif + "/var/adm/utmpx", "/etc/utmpx", NULL }; + FILE *a, *f=fopen("conftestval", "w"); + struct stat statu, statux; + if (!f) exit(1); + for (u = utmplist; *u; u++) { + if ((a = fopen(*u, "r")) != NULL || errno == EACCES) { + if (stat(*u, &statux) < 0) + continue; + p = strdup(*u); + p[strlen(p) - 1] = '\0'; + if (stat(p, &statu) >= 0 + && (statu.st_mtime - statux.st_mtime > 86400)) + continue; + fprintf(f, "%s\n", *u); + exit(0); + } + } + exit(0); +}]])],[rxvt_cv_path_utmpx=`cat conftestval`],[rxvt_cv_path_utmpx=],[dnl + AC_MSG_WARN(Define RXVT_UTMPX_FILE in config.h manually)])]) +if test x$rxvt_cv_path_utmpx != x; then + AC_DEFINE_UNQUOTED(RXVT_UTMPX_FILE, "$rxvt_cv_path_utmpx", Define location of utmpx) +fi + +dnl# -------------------------------------------------------------------------- + +dnl# find wtmp +AC_CACHE_CHECK(where wtmp is located, rxvt_cv_path_wtmp, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include +#include +#ifdef HAVE_UTMP_H +#include +#endif +#include +main() +{ + char **w, *wtmplist[] = { + "/var/log/wtmp", "/var/adm/wtmp", "/etc/wtmp", "/usr/etc/wtmp", "/usr/adm/wtmp", NULL }; + FILE *a, *f=fopen("conftestval", "w"); + if (!f) exit(1); +#ifdef WTMP_FILE + fprintf(f, "%s\n", WTMP_FILE); + exit(0); +#endif +#ifdef _PATH_WTMP + fprintf(f, "%s\n", _PATH_WTMP); + exit(0); +#endif + for (w = wtmplist; *w; w++) { + if ((a = fopen(*w, "r")) != NULL || errno == EACCES) { + fprintf(f, "%s\n", *w); + exit(0); + } + } + exit(0); +}]])],[rxvt_cv_path_wtmp=`cat conftestval`],[rxvt_cv_path_wtmp=],[dnl + AC_MSG_WARN(Define RXVT_WTMP_FILE in config.h manually)])]) +if test x$rxvt_cv_path_wtmp != x; then + AC_DEFINE_UNQUOTED(RXVT_WTMP_FILE, "$rxvt_cv_path_wtmp", Define location of wtmp) +fi +dnl# -------------------------------------------------------------------------- + +dnl# find wtmpx +AC_CACHE_CHECK(where wtmpx is located, rxvt_cv_path_wtmpx, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include +#ifdef HAVE_UTMPX_H +#include +#endif +#include +main() +{ + char **w, *wtmplist[] = { + "/var/log/wtmpx", "/var/adm/wtmpx", NULL }; + FILE *a, *f=fopen("conftestval", "w"); + if (!f) exit(1); +#ifdef WTMPX_FILE + fprintf(f, "%s\n", WTMPX_FILE); + exit(0); +#endif +#ifdef _PATH_WTMPX + fprintf(f, "%s\n", _PATH_WTMPX); + exit(0); +#endif + for (w = wtmplist; *w; w++) { + if ((a = fopen(*w, "r")) != NULL || errno == EACCES) { + fprintf(f, "%s\n", *w); + exit(0); + } + } + exit(0); +}]])],[rxvt_cv_path_wtmpx=`cat conftestval`],[rxvt_cv_path_wtmpx=],[dnl + AC_MSG_WARN(Define RXVT_WTMPX_FILE in config.h manually)])]) +if test x$rxvt_cv_path_wtmpx != x; then + AC_DEFINE_UNQUOTED(RXVT_WTMPX_FILE, "$rxvt_cv_path_wtmpx", Define location of wtmpx) +fi +dnl# -------------------------------------------------------------------------- + +dnl# find lastlog +AC_CACHE_CHECK(where lastlog is located, rxvt_cv_path_lastlog, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include +#include +#ifdef HAVE_UTMPX_H +#include +#elif defined(HAVE_UTMP_H) +#include +#endif +#ifdef HAVE_LASTLOG_H +#include +#endif +#include +main() +{ + char **w, *lastloglist[] = { "/var/log/lastlog", NULL }; + FILE *a, *f=fopen("conftestval", "w"); + if (!f) exit(1); +#ifdef LASTLOG_FILE + fprintf(f, "%s\n", LASTLOG_FILE); + exit(0); +#endif +#ifdef _PATH_LASTLOG + fprintf(f, "%s\n", _PATH_LASTLOG); + exit(0); +#endif + for (w = lastloglist; *w; w++) { + if ((a = fopen(*w, "r")) != NULL || errno == EACCES) { + fprintf(f, "%s\n", *w); + exit(0); + } + } + exit(0); +}]])],[rxvt_cv_path_lastlog=`cat conftestval`],[rxvt_cv_path_lastlog=],[dnl + AC_MSG_WARN(Define RXVT_LASTLOG_FILE in config.h manually)])]) +if test x$rxvt_cv_path_lastlog != x; then + AC_DEFINE_UNQUOTED(RXVT_LASTLOG_FILE, "$rxvt_cv_path_lastlog", Define location of lastlog) + if test -d "$rxvt_cv_path_lastlog"; then + AC_DEFINE(LASTLOG_IS_DIR, 1, Define if lastlog is provided via a directory) + fi +fi +dnl# -------------------------------------------------------------------------- + +dnl# find lastlogx +AC_CACHE_CHECK(where lastlogx is located, rxvt_cv_path_lastlogx, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include +#ifdef HAVE_UTMPX_H +#include +#endif +#include +main() +{ + char **w, *wtmplist[] = { "/var/log/lastlogx", "/var/adm/lastlogx", NULL }; + FILE *a, *f=fopen("conftestval", "w"); + if (!f) exit(1); +#ifdef LASTLOGX_FILE + fprintf(f, "%s\n", LASTLOGX_FILE); + exit(0); +#endif +#ifdef _PATH_LASTLOGX + fprintf(f, "%s\n", _PATH_LASTLOGX); + exit(0); +#endif + for (w = wtmplist; *w; w++) { + if ((a = fopen(*w, "r")) != NULL || errno == EACCES) { + fprintf(f, "%s\n", *w); + exit(0); + } + } + exit(0); +}]])],[rxvt_cv_path_lastlogx=`cat conftestval`],[rxvt_cv_path_lastlogx=],[dnl + AC_MSG_WARN(Define RXVT_LASTLOGX_FILE in config.h manually)])]) +if test x$rxvt_cv_path_lastlogx != x; then + AC_DEFINE_UNQUOTED(RXVT_LASTLOGX_FILE, "$rxvt_cv_path_lastlogx", Define location of lastlogx) +fi +]) + diff --git a/configure.ac b/configure.ac index 28744fc2..1d7b7d40 100644 --- a/configure.ac +++ b/configure.ac @@ -520,9 +520,6 @@ AC_HEADER_SYS_WAIT AC_CHECK_HEADERS( \ assert.h \ fcntl.h \ - grp.h \ - libc.h \ - lastlog.h \ stdarg.h \ stdlib.h \ string.h \ @@ -533,14 +530,8 @@ AC_CHECK_HEADERS( \ sys/select.h \ sys/sockio.h \ sys/strredir.h \ - sys/stropts.h \ sys/time.h \ - utmp.h \ - utmpx.h \ stdint.h \ - pty.h \ - util.h \ - libutil.h \ wchar.h \ cwchar \ clocale \ @@ -707,339 +698,16 @@ AC_TYPE_SIGNAL dnl> AC_FUNC_VPRINTF AC_CHECK_FUNCS( \ - revoke \ unsetenv \ setutent \ seteuid \ setresuid \ setreuid \ - _getpty \ - getpt \ - posix_openpt \ - grantpt \ - unlockpt \ - isastream \ on_exit \ nanosleep \ - updwtmp \ - updwtmpx \ - ttyslot \ ) -dnl# -------------------------------------------------------------------------- -dnl# DO ALL UTMP AND WTMP CHECKING -dnl# -------------------------------------------------------------------------- -dnl# check for host field in utmp structure - -dnl# -------------------------------------------- -AC_CHECK_HEADER(utmp.h, -[AC_CACHE_CHECK([for struct utmp], rxvt_cv_struct_utmp, -[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include -#include ]], [[struct utmp ut;]])],[rxvt_cv_struct_utmp=yes],[rxvt_cv_struct_utmp=no])]) -if test x$rxvt_cv_struct_utmp = xyes; then - AC_DEFINE(HAVE_STRUCT_UTMP, 1, Define if utmp.h has struct utmp) -fi -] - -AC_CACHE_CHECK(for ut_host in utmp struct, rxvt_cv_struct_utmp_host, -[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include -#include ]], [[struct utmp ut; ut.ut_host;]])],[rxvt_cv_struct_utmp_host=yes],[rxvt_cv_struct_utmp_host=no])]) -if test x$rxvt_cv_struct_utmp_host = xyes; then - AC_DEFINE(HAVE_UTMP_HOST, 1, Define if struct utmp contains ut_host) -fi - -AC_CACHE_CHECK(for ut_pid in utmp struct, rxvt_cv_struct_utmp_pid, -[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include -#include ]], [[struct utmp ut; ut.ut_pid;]])],[rxvt_cv_struct_utmp_pid=yes],[rxvt_cv_struct_utmp_pid=no])]) -if test x$rxvt_cv_struct_utmp_pid = xyes; then - AC_DEFINE(HAVE_UTMP_PID, 1, Define if struct utmp contains ut_pid) -fi -) dnl# AC_CHECK_HEADER(utmp.h - -dnl# -------------------------------------------- - -AC_CHECK_HEADER(utmpx.h, -[AC_CACHE_CHECK([for struct utmpx], rxvt_cv_struct_utmpx, -[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include -#include ]], [[struct utmpx ut;]])],[rxvt_cv_struct_utmpx=yes],[rxvt_cv_struct_utmpx=no])]) -if test x$rxvt_cv_struct_utmpx = xyes; then - AC_DEFINE(HAVE_STRUCT_UTMPX, 1, Define if utmpx.h has struct utmpx) -fi -] - -AC_CACHE_CHECK(for host in utmpx struct, rxvt_cv_struct_utmpx_host, -[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include -#include ]], [[struct utmpx utx; utx.ut_host;]])],[rxvt_cv_struct_utmpx_host=yes],[rxvt_cv_struct_utmpx_host=no])]) -if test x$rxvt_cv_struct_utmpx_host = xyes; then - AC_DEFINE(HAVE_UTMPX_HOST, 1, Define if struct utmpx contains ut_host) -fi - -AC_CACHE_CHECK(for session in utmpx struct, rxvt_cv_struct_utmpx_session, -[AC_TRY_COMPILE([#include -#include ], -[struct utmpx utx; utx.ut_session;], -rxvt_cv_struct_utmpx_session=yes, rxvt_cv_struct_utmpx_session=no)]) -if test x$rxvt_cv_struct_utmpx_session = xyes; then - AC_DEFINE(HAVE_UTMPX_SESSION, 1, Define if struct utmpx contains ut_session) -fi -) dnl# AC_CHECK_HEADER(utmpx.h - -dnl# -------------------------------------------------------------------------- -dnl# check for struct lastlog -AC_CACHE_CHECK(for struct lastlog, rxvt_cv_struct_lastlog, -[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include -#include -#ifdef HAVE_LASTLOG_H -#include -#endif -]], [[struct lastlog ll;]])],[rxvt_cv_struct_lastlog=yes],[rxvt_cv_struct_lastlog=no])]) -if test x$rxvt_cv_struct_lastlog = xyes; then - AC_DEFINE(HAVE_STRUCT_LASTLOG, 1, Define if utmp.h or lastlog.h has struct lastlog) -fi - -dnl# check for struct lastlogx -AC_CACHE_CHECK(for struct lastlogx, rxvt_cv_struct_lastlogx, -[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include -#include -#ifdef HAVE_LASTLOG_H -#include -#endif -]], [[struct lastlogx ll;]])],[rxvt_cv_struct_lastlogx=yes],[rxvt_cv_struct_lastlogx=no])]) -if test x$rxvt_cv_struct_lastlogx = xyes; then - AC_DEFINE(HAVE_STRUCT_LASTLOGX, 1, Define if utmpx.h or lastlog.h has struct lastlogx) -fi - -dnl# -------------------------------------------------------------------------- -dnl# FIND FILES -dnl# -------------------------------------------------------------------------- - -dnl# find utmp -AC_CACHE_CHECK(where utmp is located, rxvt_cv_path_utmp, -[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include -#include -#include -#include -main() -{ - char **u, *utmplist[] = { - "/var/run/utmp", "/var/adm/utmp", "/etc/utmp", "/usr/etc/utmp", "/usr/adm/utmp", NULL }; - FILE *a, *f=fopen("conftestval", "w"); - if (!f) exit(1); -#ifdef UTMP_FILE - fprintf(f, "%s\n", UTMP_FILE); - exit(0); -#endif -#ifdef _PATH_UTMP - fprintf(f, "%s\n", _PATH_UTMP); - exit(0); -#endif - for (u = utmplist; *u; u++) { - if ((a = fopen(*u, "r")) != NULL || errno == EACCES) { - fprintf(f, "%s\n", *u); - exit(0); - } - } - exit(0); -}]])],[rxvt_cv_path_utmp=`cat conftestval`],[rxvt_cv_path_utmp=],[dnl - AC_MSG_WARN(Define RXVT_UTMP_FILE in config.h manually)])]) -if test x$rxvt_cv_path_utmp != x; then - AC_DEFINE_UNQUOTED(RXVT_UTMP_FILE, "$rxvt_cv_path_utmp", Define location of utmp) -fi - -dnl# -------------------------------------------------------------------------- - -dnl# find utmpx - if a utmp file exists at the same location and is more than -dnl# a day newer, then dump the utmpx. People leave lots of junk around. -AC_CACHE_CHECK(where utmpx is located, rxvt_cv_path_utmpx, -[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include -#include -#include -#include -#include -#ifdef HAVE_STRING_H -#include -#endif -main() -{ - char **u, *p, *utmplist[] = { -#ifdef UTMPX_FILE - UTMPX_FILE, -#endif -#ifdef _PATH_UTMPX - _PATH_UTMPX, -#endif - "/var/adm/utmpx", "/etc/utmpx", NULL }; - FILE *a, *f=fopen("conftestval", "w"); - struct stat statu, statux; - if (!f) exit(1); - for (u = utmplist; *u; u++) { - if ((a = fopen(*u, "r")) != NULL || errno == EACCES) { - if (stat(*u, &statux) < 0) - continue; - p = strdup(*u); - p[strlen(p) - 1] = '\0'; - if (stat(p, &statu) >= 0 - && (statu.st_mtime - statux.st_mtime > 86400)) - continue; - fprintf(f, "%s\n", *u); - exit(0); - } - } - exit(0); -}]])],[rxvt_cv_path_utmpx=`cat conftestval`],[rxvt_cv_path_utmpx=],[dnl - AC_MSG_WARN(Define RXVT_UTMPX_FILE in config.h manually)])]) -if test x$rxvt_cv_path_utmpx != x; then - AC_DEFINE_UNQUOTED(RXVT_UTMPX_FILE, "$rxvt_cv_path_utmpx", Define location of utmpx) -fi - -dnl# -------------------------------------------------------------------------- - -dnl# find wtmp -AC_CACHE_CHECK(where wtmp is located, rxvt_cv_path_wtmp, -[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include -#include -#ifdef HAVE_UTMP_H -#include -#endif -#include -main() -{ - char **w, *wtmplist[] = { - "/var/log/wtmp", "/var/adm/wtmp", "/etc/wtmp", "/usr/etc/wtmp", "/usr/adm/wtmp", NULL }; - FILE *a, *f=fopen("conftestval", "w"); - if (!f) exit(1); -#ifdef WTMP_FILE - fprintf(f, "%s\n", WTMP_FILE); - exit(0); -#endif -#ifdef _PATH_WTMP - fprintf(f, "%s\n", _PATH_WTMP); - exit(0); -#endif - for (w = wtmplist; *w; w++) { - if ((a = fopen(*w, "r")) != NULL || errno == EACCES) { - fprintf(f, "%s\n", *w); - exit(0); - } - } - exit(0); -}]])],[rxvt_cv_path_wtmp=`cat conftestval`],[rxvt_cv_path_wtmp=],[dnl - AC_MSG_WARN(Define RXVT_WTMP_FILE in config.h manually)])]) -if test x$rxvt_cv_path_wtmp != x; then - AC_DEFINE_UNQUOTED(RXVT_WTMP_FILE, "$rxvt_cv_path_wtmp", Define location of wtmp) -fi -dnl# -------------------------------------------------------------------------- - -dnl# find wtmpx -AC_CACHE_CHECK(where wtmpx is located, rxvt_cv_path_wtmpx, -[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include -#ifdef HAVE_UTMPX_H -#include -#endif -#include -main() -{ - char **w, *wtmplist[] = { - "/var/log/wtmpx", "/var/adm/wtmpx", NULL }; - FILE *a, *f=fopen("conftestval", "w"); - if (!f) exit(1); -#ifdef WTMPX_FILE - fprintf(f, "%s\n", WTMPX_FILE); - exit(0); -#endif -#ifdef _PATH_WTMPX - fprintf(f, "%s\n", _PATH_WTMPX); - exit(0); -#endif - for (w = wtmplist; *w; w++) { - if ((a = fopen(*w, "r")) != NULL || errno == EACCES) { - fprintf(f, "%s\n", *w); - exit(0); - } - } - exit(0); -}]])],[rxvt_cv_path_wtmpx=`cat conftestval`],[rxvt_cv_path_wtmpx=],[dnl - AC_MSG_WARN(Define RXVT_WTMPX_FILE in config.h manually)])]) -if test x$rxvt_cv_path_wtmpx != x; then - AC_DEFINE_UNQUOTED(RXVT_WTMPX_FILE, "$rxvt_cv_path_wtmpx", Define location of wtmpx) -fi -dnl# -------------------------------------------------------------------------- - -dnl# find lastlog -AC_CACHE_CHECK(where lastlog is located, rxvt_cv_path_lastlog, -[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include -#include -#ifdef HAVE_UTMPX_H -#include -#elif defined(HAVE_UTMP_H) -#include -#endif -#ifdef HAVE_LASTLOG_H -#include -#endif -#include -main() -{ - char **w, *lastloglist[] = { "/var/log/lastlog", NULL }; - FILE *a, *f=fopen("conftestval", "w"); - if (!f) exit(1); -#ifdef LASTLOG_FILE - fprintf(f, "%s\n", LASTLOG_FILE); - exit(0); -#endif -#ifdef _PATH_LASTLOG - fprintf(f, "%s\n", _PATH_LASTLOG); - exit(0); -#endif - for (w = lastloglist; *w; w++) { - if ((a = fopen(*w, "r")) != NULL || errno == EACCES) { - fprintf(f, "%s\n", *w); - exit(0); - } - } - exit(0); -}]])],[rxvt_cv_path_lastlog=`cat conftestval`],[rxvt_cv_path_lastlog=],[dnl - AC_MSG_WARN(Define RXVT_LASTLOG_FILE in config.h manually)])]) -if test x$rxvt_cv_path_lastlog != x; then - AC_DEFINE_UNQUOTED(RXVT_LASTLOG_FILE, "$rxvt_cv_path_lastlog", Define location of lastlog) - if test -d "$rxvt_cv_path_lastlog"; then - AC_DEFINE(LASTLOG_IS_DIR, 1, Define if lastlog is provided via a directory) - fi -fi -dnl# -------------------------------------------------------------------------- - -dnl# find lastlogx -AC_CACHE_CHECK(where lastlogx is located, rxvt_cv_path_lastlogx, -[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include -#ifdef HAVE_UTMPX_H -#include -#endif -#include -main() -{ - char **w, *wtmplist[] = { "/var/log/lastlogx", "/var/adm/lastlogx", NULL }; - FILE *a, *f=fopen("conftestval", "w"); - if (!f) exit(1); -#ifdef LASTLOGX_FILE - fprintf(f, "%s\n", LASTLOGX_FILE); - exit(0); -#endif -#ifdef _PATH_LASTLOGX - fprintf(f, "%s\n", _PATH_LASTLOGX); - exit(0); -#endif - for (w = wtmplist; *w; w++) { - if ((a = fopen(*w, "r")) != NULL || errno == EACCES) { - fprintf(f, "%s\n", *w); - exit(0); - } - } - exit(0); -}]])],[rxvt_cv_path_lastlogx=`cat conftestval`],[rxvt_cv_path_lastlogx=],[dnl - AC_MSG_WARN(Define RXVT_LASTLOGX_FILE in config.h manually)])]) -if test x$rxvt_cv_path_lastlogx != x; then - AC_DEFINE_UNQUOTED(RXVT_LASTLOGX_FILE, "$rxvt_cv_path_lastlogx", Define location of lastlogx) -fi +UTMP_CHECK dnl# -------------------------------------------------------------------------- @@ -1155,86 +823,7 @@ if test x$rxvt_broken_ximcb = xyes; then AC_DEFINE(XIMCB_PROTO_BROKEN, 1, Define if your XIMCallback specifies XIC as first type.) fi -if test x$ac_cv_func_getpt = xno -a x$ac_cv_func_posix_openpt = xno; then - AC_CHECK_FUNC(openpty, [], [AC_CHECK_LIB(util, openpty, [LIBS="$LIBS -lutil"])]) -fi - -dnl# if we don't guess right then it's up to the user -AC_CACHE_CHECK(for pty/tty type, rxvt_cv_ptys, -[if test x$ac_cv_func_openpty = xyes -o x$ac_cv_lib_util_openpty = xyes; then - rxvt_cv_ptys=OPENPTY - else if test x$ac_cv_func_getpt = xyes; then - rxvt_cv_ptys=GLIBC - else if test x$ac_cv_func_posix_openpt = xyes; then - rxvt_cv_ptys=POSIX - else if test x$ac_cv_func__getpty = xyes; then - rxvt_cv_ptys=SGI4 - else if test -c /dev/ttyp20; then - rxvt_cv_ptys=SCO - else if test -c /dev/ptym/clone; then - rxvt_cv_ptys=HPUX - else if test -c /dev/ptc -a -c /dev/pts; then - rxvt_cv_ptys=PTC - else if test -c /dev/ptc -a -d /dev/pts; then - rxvt_cv_ptys=PTC - else if test -c /dev/ptmx -a -c /dev/pts/0; then - rxvt_cv_ptys=STREAMS - else if test x$ac_cv_func_grantpt = xyes && test x$ac_cv_func_unlockpt = xyes; then -dnl# catch CYGWIN - rxvt_cv_ptys=STREAMS - else - rxvt_cv_ptys=BSD -fi -fi -fi -fi -fi -fi -fi -fi -fi -fi -]) - -if test x$rxvt_cv_ptys = xGLIBC; then - AC_DEFINE(PTYS_ARE_GETPT, 1, Define for this pty type) -fi -if test x$rxvt_cv_ptys = xPOSIX; then - AC_DEFINE(PTYS_ARE_POSIX, 1, Define for this pty type) -fi -if test x$rxvt_cv_ptys = xOPENPTY; then - AC_DEFINE(PTYS_ARE_OPENPTY, 1, Define for this pty type) -fi -if test x$rxvt_cv_ptys = xSCO; then - AC_DEFINE(PTYS_ARE_NUMERIC, 1, Define for this pty type) -fi -if test x$rxvt_cv_ptys = xSTREAMS; then - AC_DEFINE(PTYS_ARE_PTMX, 1, Define for this pty type) -fi -if test x$rxvt_cv_ptys = xPTC; then - AC_DEFINE(PTYS_ARE_PTC, 1, Define for this pty type) -fi -if test x$rxvt_cv_ptys = xSGI4; then - AC_DEFINE(PTYS_ARE__GETPTY, 1, Define for this pty type) -fi -if test x$rxvt_cv_ptys = xHPUX; then - AC_DEFINE(PTYS_ARE_CLONE, 1, Define for this pty type) -fi -if test x$rxvt_cv_ptys = xBSD -o x$rxvt_cv_ptys = xHPUX -o x$rxvt_cv_ptys = xPOSIX; then - AC_DEFINE(PTYS_ARE_SEARCHED, 1, Define for this pty type) -fi - - -AS_MESSAGE(checking for pty ranges...) -ptys=`echo /dev/pty??` -pch1=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\).$/\1/g' | sort -u | tr -d '\012'` -pch2=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\)$/\1/g' | sort -u | tr -d '\012'` -if test x$pch1 != x; then - AC_DEFINE_UNQUOTED(PTYCHAR1, "$pch1", Define for first char in devptyXX) -fi -if test x$pch2 != x; then - AC_DEFINE_UNQUOTED(PTYCHAR2, "$pch2", Define for second char in devptyXX) -fi +PTY_CHECK dnl# -------------------------------------------------------------------------- dnl# now add and remove other stuff @@ -1480,7 +1069,6 @@ fi echo " The following are set in config.h " -echo " pty/tty type: "$rxvt_cv_ptys if test x$support_utmp != xyes; then echo " utmp support: disabled" echo @@ -1507,12 +1095,6 @@ if test x$RESFALLBACK != x; then echo " resource class fallback: $RESFALLBACK" fi echo -if test x$rxvt_cv_ptys = xUNKNOWN; then - echo ".----------------------------------------------------------------." - echo ". WARNING: could not determine pty/tty type. Do not build until ." - echo ". the appropriate PTYS_ARE_* is defined in config.h ." - echo ".----------------------------------------------------------------." -fi if test x$support_xpm = xneedsmanualspecification; then echo ".----------------------------------------------------------------." echo ". WARNING: --enable-xpm-background was specified however the ." diff --git a/src/ptytty.C b/src/ptytty.C index 0b1fe870..18f738c2 100644 --- a/src/ptytty.C +++ b/src/ptytty.C @@ -35,7 +35,7 @@ #ifdef HAVE_SYS_IOCTL_H # include #endif -#if defined(PTYS_ARE_PTMX) && defined(HAVE_SYS_STROPTS_H) +#if defined(HAVE_DEV_PTMX) && defined(HAVE_SYS_STROPTS_H) # include /* for I_PUSH */ #endif #ifdef HAVE_ISASTREAM @@ -48,9 +48,11 @@ #elif defined(HAVE_UTIL_H) # include #endif +#ifdef TTY_GID_SUPPORT +#include +#endif #include -#include #include "rxvtutil.h" #include "fdpass.h" @@ -66,19 +68,18 @@ * If successful, ttydev is set to the name of the slave device. * fd_tty _may_ also be set to an open fd to the slave device */ -static inline int -get_pty_streams (int *fd_tty, char **ttydev) +#if defined(UNIX98_PTY) +static int +get_pty (int *fd_tty, char **ttydev) { -#if defined(HAVE_GRANTPT) && defined(HAVE_UNLOCKPT) -# if defined(PTYS_ARE_GETPT) || defined(PTYS_ARE_POSIX) || defined(PTYS_ARE_PTMX) int pfd; -# if defined(PTYS_ARE_GETPT) +# if defined(HAVE_GETPT) pfd = getpt(); -# elif defined(PTYS_ARE_POSIX) +# elif defined(HAVE_POSIX_OPENPT) pfd = posix_openpt (O_RDWR); # else - pfd = open ("/dev/ptmx", O_RDWR | O_NOCTTY, 0); + pfd = open (CLONE_DEVICE, O_RDWR | O_NOCTTY, 0); # endif if (pfd >= 0) { @@ -91,16 +92,13 @@ get_pty_streams (int *fd_tty, char **ttydev) close (pfd); } -# endif -#endif return -1; } - -static inline int -get_pty_openpty (int *fd_tty, char **ttydev) +#elif defined(HAVE_OPENPTY) +static int +get_pty (int *fd_tty, char **ttydev) { -#ifdef PTYS_ARE_OPENPTY int pfd; int res; char tty_name[32]; @@ -111,29 +109,25 @@ get_pty_openpty (int *fd_tty, char **ttydev) *ttydev = strdup (tty_name); return pfd; } -#endif return -1; } - -static inline int -get_pty__getpty (int *fd_tty, char **ttydev) +#elif defined(HAVE__GETPTY) +static int +get_pty (int *fd_tty, char **ttydev) { -#ifdef PTYS_ARE__GETPTY int pfd; *ttydev = _getpty (&pfd, O_RDWR | O_NONBLOCK | O_NOCTTY, 0622, 0); if (*ttydev != NULL) return pfd; -#endif return -1; } - -static inline int -get_pty_ptc (int *fd_tty, char **ttydev) +#elif defined(HAVE_DEV_PTC) +static int +get_pty (int *fd_tty, char **ttydev) { -#ifdef PTYS_ARE_PTC int pfd; if ((pfd = open ("/dev/ptc", O_RDWR | O_NOCTTY, 0)) >= 0) @@ -141,15 +135,13 @@ get_pty_ptc (int *fd_tty, char **ttydev) *ttydev = strdup (ttyname (pfd)); return pfd; } -#endif return -1; } - -static inline int -get_pty_clone (int *fd_tty, char **ttydev) +#elif defined(HAVE_DEV_CLONE) +static int +get_pty (int *fd_tty, char **ttydev) { -#ifdef PTYS_ARE_CLONE int pfd; if ((pfd = open ("/dev/ptym/clone", O_RDWR | O_NOCTTY, 0)) >= 0) @@ -157,109 +149,41 @@ get_pty_clone (int *fd_tty, char **ttydev) *ttydev = strdup (ptsname (pfd)); return pfd; } -#endif return -1; } - -static inline int -get_pty_numeric (int *fd_tty, char **ttydev) +#else +/* Based on the code in openssh/openbsd-compat/bsd-openpty.c */ +static int +get_pty (int *fd_tty, char **ttydev) { -#ifdef PTYS_ARE_NUMERIC int pfd; - int idx; - char *c1, *c2; - char pty_name[] = "/dev/ptyp???"; - char tty_name[] = "/dev/ttyp???"; - - c1 = &(pty_name[sizeof (pty_name) - 4]); - c2 = &(tty_name[sizeof (tty_name) - 4]); - - for (idx = 0; idx < 256; idx++) + int i; + char pty_name[32]; + char tty_name[32]; + const char *majors = "pqrstuvwxyzabcde"; + const char *minors = "0123456789abcdef"; + for (i = 0; i < 256; i++) { - sprintf (c1, "%d", idx); - sprintf (c2, "%d", idx); - - if (access (tty_name, F_OK) < 0) + snprintf(pty_name, 32, "/dev/pty%c%c", majors[i / 16], minors[i % 16]); + snprintf(tty_name, 32, "/dev/tty%c%c", majors[i / 16], minors[i % 16]); + if ((pfd = open (pty_name, O_RDWR | O_NOCTTY, 0)) == -1) { - idx = 256; - break; + snprintf(pty_name, 32, "/dev/ptyp%d", i); + snprintf(tty_name, 32, "/dev/ttyp%d", i); + if ((pfd = open (pty_name, O_RDWR | O_NOCTTY, 0)) == -1) + continue; } - - if ((pfd = open (pty_name, O_RDWR | O_NOCTTY, 0)) >= 0) + if (access (tty_name, R_OK | W_OK) == 0) { - if (access (tty_name, R_OK | W_OK) == 0) - { - *ttydev = strdup (tty_name); - return pfd; - } - - close (pfd); + *ttydev = strdup (tty_name); + return pfd; } - } -#endif - - return -1; -} - -static inline int -get_pty_searched (int *fd_tty, char **ttydev) -{ -#ifdef PTYS_ARE_SEARCHED -# ifndef PTYCHAR1 -# define PTYCHAR1 "pqrstuvwxyz" -# endif -# ifndef PTYCHAR2 -# define PTYCHAR2 "0123456789abcdef" -# endif - int pfd; - const char *c1, *c2; - char pty_name[] = "/dev/pty??"; - char tty_name[] = "/dev/tty??"; - - for (c1 = PTYCHAR1; *c1; c1++) - { - pty_name[ (sizeof (pty_name) - 3)] = - tty_name[ (sizeof (pty_name) - 3)] = *c1; - - for (c2 = PTYCHAR2; *c2; c2++) - { - pty_name[ (sizeof (pty_name) - 2)] = - tty_name[ (sizeof (pty_name) - 2)] = *c2; - - if ((pfd = open (pty_name, O_RDWR | O_NOCTTY, 0)) >= 0) - { - if (access (tty_name, R_OK | W_OK) == 0) - { - *ttydev = strdup (tty_name); - return pfd; - } - close (pfd); - } - } + close (pfd); } -#endif - - return -1; -} - -static int -get_pty (int *fd_tty, char **ttydev) -{ - int pfd; - - if ((pfd = get_pty_streams (fd_tty, ttydev)) != -1 - || (pfd = get_pty_openpty (fd_tty, ttydev)) != -1 - || (pfd = get_pty__getpty (fd_tty, ttydev)) != -1 - || (pfd = get_pty_ptc (fd_tty, ttydev)) != -1 - || (pfd = get_pty_clone (fd_tty, ttydev)) != -1 - || (pfd = get_pty_numeric (fd_tty, ttydev)) != -1 - || (pfd = get_pty_searched (fd_tty, ttydev)) != -1) - return pfd; - - return -1; } +#endif /*----------------------------------------------------------------------*/ /* @@ -280,7 +204,7 @@ control_tty (int fd_tty) { setsid (); -#if defined(PTYS_ARE_PTMX) && defined(I_PUSH) +#if defined(HAVE_DEV_PTMX) && defined(I_PUSH) /* * Push STREAMS modules: * ptem: pseudo-terminal hardware emulation module. diff --git a/src/ptytty.h b/src/ptytty.h index b124e23a..4025a8e7 100644 --- a/src/ptytty.h +++ b/src/ptytty.h @@ -4,12 +4,7 @@ #include "rxvt.h" #include "feature.h" -#if defined(HAVE_GRANTPT) && defined(HAVE_UNLOCKPT) -# if defined(PTYS_ARE_GETPT) || defined(PTYS_ARE_POSIX) || defined(PTYS_ARE_PTMX) -# define NO_SETOWNER_TTYDEV 1 -# endif -#endif -#if defined(__CYGWIN__) || defined(PTYS_ARE_OPENPTY) +#if defined(HAVE__GETPTY) || defined(HAVE_OPENPTY) || defined(UNIX98_PTY) # define NO_SETOWNER_TTYDEV 1 #endif -- 2.34.1