--- vte-0.14.0/configure.in.orig 2006-09-11 22:35:42 +0400 +++ vte-0.14.0/configure.in 2006-09-11 22:35:42 +0400 @@ -429,6 +429,14 @@ fi AM_CONDITIONAL(BUILD_GNOME_PTY_HELPER,[test "$enable_gnome_pty_helper" != no]) +AC_ARG_WITH(utempter, + AC_HELP_STRING(--with-utempter, [Use utempter to update utmp/wtmp]), + , + with_utempter=no) +if test "$with_utempter" != no -a "$enable_gnome_pty_helper" = no; then + AC_MSG_WARN([utempter is not used when gnome-pty-helper is disabled]) +fi + ################################################################################ GTK_DOC_CHECK([1.0]) --- vte-0.14.0/gnome-pty-helper/gnome-utmp.c.orig 2006-08-24 03:12:29 +0400 +++ vte-0.14.0/gnome-pty-helper/gnome-utmp.c 2006-09-11 22:35:42 +0400 @@ -57,8 +57,8 @@ #include "gnome-login-support.h" - -#if !defined(UTMP_OUTPUT_FILENAME) +#if !defined(HAVE_LIBUTEMPTER) +# if !defined(UTMP_OUTPUT_FILENAME) # if defined(UTMP_FILE) # define UTMP_OUTPUT_FILENAME UTMP_FILE # elif defined(_PATH_UTMP) /* BSD systems */ @@ -66,9 +66,9 @@ # else # define UTMP_OUTPUT_FILENAME "/etc/utmp" # endif -#endif +# endif -#if !defined(WTMP_OUTPUT_FILENAME) +# if !defined(WTMP_OUTPUT_FILENAME) # if defined(WTMPX_FILE) # define WTMP_OUTPUT_FILENAME WTMPX_FILE # elif defined(_PATH_WTMPX) @@ -82,6 +82,7 @@ # else # define WTMP_OUTPUT_FILENAME "/etc/wtmp" # endif +# endif #endif #if defined(_PATH_LASTLOG) /* BSD systems */ @@ -90,6 +91,9 @@ # define LASTLOG_OUTPUT_FILE "/var/log/lastlog" #endif + +#if !defined(HAVE_LIBUTEMPTER) + #if defined(HAVE_UPDWTMPX) #include #define update_wtmp updwtmpx @@ -195,6 +199,8 @@ #define update_utmp(ut) #endif +#endif /* !HAVE_LIBUTEMPTER */ + #if !defined(HAVE_LASTLOG) #define update_lastlog(login_name, ut) #else @@ -232,7 +238,10 @@ void write_logout_record (char *login_name, void *data, int utmp, int wtmp) { - UTMP put, *ut = data; + UTMP *ut = data; + +#if !defined(HAVE_LIBUTEMPTER) + UTMP put; memset (&put, 0, sizeof(UTMP)); @@ -263,6 +272,8 @@ if (wtmp) update_wtmp (WTMP_OUTPUT_FILENAME, &put); +#endif /* !HAVE_LIBUTEMPTER */ + free (ut); } @@ -346,11 +357,14 @@ ut->ut_syslen = strlen (ut->ut_host); # endif #endif + +#if !defined(HAVE_LIBUTEMPTER) if (utmp) update_utmp (ut); if (wtmp) update_wtmp (WTMP_OUTPUT_FILENAME, ut); +#endif if (lastlog) update_lastlog(login_name, ut); --- vte-0.14.0/gnome-pty-helper/gnome-pty-helper.c.orig 2006-08-24 03:12:29 +0400 +++ vte-0.14.0/gnome-pty-helper/gnome-pty-helper.c 2006-09-11 22:38:18 +0400 @@ -62,6 +62,11 @@ #include #endif +#ifdef HAVE_UTEMPTER_H +#include +#endif + + static struct passwd *pwent; static char login_name_buffer [48]; static char *login_name, *display_name; @@ -72,6 +77,9 @@ char *line; void *data; char utmp, wtmp, lastlog; +#ifdef HAVE_LIBUTEMPTER + int master_fd; +#endif }; typedef struct pty_info pty_info; @@ -235,9 +243,17 @@ static void shutdown_pty (pty_info *pi) { - if (pi->utmp || pi->wtmp || pi->lastlog) + if (pi->utmp || pi->wtmp || pi->lastlog) { if (pi->data) write_logout_record (pi->login_name, pi->data, pi->utmp, pi->wtmp); +#ifdef HAVE_LIBUTEMPTER + if (pi->utmp || pi->wtmp) { + utempter_remove_record(pi->master_fd); + /* Close the lingering PTY master descriptor */ + close(pi->master_fd); + } +#endif + } pty_remove (pi); } @@ -537,14 +553,26 @@ exit (0); } +#ifdef HAVE_LIBUTEMPTER + if (utmp || wtmp) { + utempter_add_record(master_pty, display_name); + /* Let the master PTY descriptor linger */ + p->master_fd = master_pty; + } else { + close (master_pty); + } + utmp = 0; + wtmp = 0; +#else + close (master_pty); +#endif + close (slave_pty); + if (utmp || wtmp || lastlog) { p->data = write_login_record (login_name, display_name, term_name, utmp, wtmp, lastlog); } - close (master_pty); - close (slave_pty); - return 1; } --- vte-0.14.0/gnome-pty-helper/configure.in.orig 2006-08-21 22:15:47 +0400 +++ vte-0.14.0/gnome-pty-helper/configure.in 2006-09-11 22:35:42 +0400 @@ -15,7 +15,7 @@ AC_CHECK_LIB(c,grantpt,true,[AC_CHECK_LIB(pt,grantpt)]) AC_CHECK_LIB(c,openpty,true,[AC_CHECK_LIB(util,openpty)]) AC_CHECK_LIB(c,sendmsg,true,[AC_CHECK_LIB(socket,sendmsg,LIBS="$LIBS -lsocket -lnsl",,-lnsl)]) -AC_CHECK_FUNCS(endutent fcntl forkpty getttyent getutent getutmpx grantpt flock login_tty openpty revoke sendmsg seteuid setreuid setutent strrchr updwtmp updwtmpx utmpname utmpxname) +AC_CHECK_FUNCS(fcntl forkpty grantpt flock login_tty openpty revoke sendmsg seteuid setreuid strrchr) GPH_CHECK_UTMP AC_CHECK_HEADERS(stropts.h) @@ -42,4 +42,18 @@ AM_CONFIG_HEADER(config.h) +AC_ARG_WITH(utempter, + AC_HELP_STRING(--with-utempter, [Use utempter to update utmp/wtmp]), + , + with_utempter=no) +if test "$with_utempter" = no; then + AC_CHECK_FUNCS(endutent getttyent getutent getutmpx setutent updwtmp updwtmpx utmpname utmpxname) +else + AC_CHECK_HEADERS(utempter.h, + AC_CHECK_LIB(utempter, utempter_add_record, + , + AC_MSG_ERROR([-lutempter is not found])), + AC_MSG_ERROR([utempter.h is not found])) +fi + AC_OUTPUT(Makefile)