--- ./configure.ac.orig 2015-06-17 06:57:42.000000000 -0500 +++ ./configure.ac 2018-03-31 11:21:43.971399093 -0500 @@ -113,7 +113,6 @@ support_fading=no support_keepscrolling=no support_selectionscrolling=no - support_lastlog=no support_mousewheel=no support_mouseslipwheel=no support_text_blink=no @@ -121,8 +120,6 @@ support_scroll_rxvt=no support_scroll_next=no support_scroll_xterm=no - support_utmp=no - support_wtmp=no support_xim=no support_pixbuf=no support_startup_notification=no @@ -141,7 +138,6 @@ support_fading=yes support_keepscrolling=yes support_selectionscrolling=yes - support_lastlog=yes support_mousewheel=yes support_mouseslipwheel=yes support_text_blink=yes @@ -149,8 +145,6 @@ support_scroll_rxvt=yes support_scroll_next=yes support_scroll_xterm=yes - support_utmp=yes - support_wtmp=yes support_xim=yes support_pixbuf=yes support_startup_notification=yes @@ -513,8 +507,6 @@ dnl# -------------------------------------------------------------------------- AC_CHECK_FUNCS(unsetenv) -UTMP_CHECK - dnl# -------------------------------------------------------------------------- dnl# -------------------------------------------------------------------------- --- ./config.h.in.orig 2015-06-17 06:57:42.000000000 -0500 +++ ./config.h.in 2018-03-31 11:21:43.970399093 -0500 @@ -75,9 +75,6 @@ /* Define to 1 if you have the `kqueue' function. */ #undef HAVE_KQUEUE -/* Define to 1 if you have the header file. */ -#undef HAVE_LASTLOG_H - /* Define to 1 if you have the `rt' library (-lrt). */ #undef HAVE_LIBRT @@ -156,18 +153,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STROPTS_H -/* Define to 1 if the system has the type `struct lastlog'. */ -#undef HAVE_STRUCT_LASTLOG - -/* Define to 1 if the system has the type `struct lastlogx'. */ -#undef HAVE_STRUCT_LASTLOGX - -/* Define to 1 if the system has the type `struct utmp'. */ -#undef HAVE_STRUCT_UTMP - -/* Define to 1 if the system has the type `struct utmpx'. */ -#undef HAVE_STRUCT_UTMPX - /* Define to 1 if you have the header file. */ #undef HAVE_SYS_BYTEORDER_H @@ -214,33 +199,9 @@ /* Define to 1 if you have the `unsetenv' function. */ #undef HAVE_UNSETENV -/* Define to 1 if you have the `updlastlogx' function. */ -#undef HAVE_UPDLASTLOGX - -/* Define to 1 if you have the `updwtmp' function. */ -#undef HAVE_UPDWTMP - -/* Define to 1 if you have the `updwtmpx' function. */ -#undef HAVE_UPDWTMPX - /* Define to 1 if you have the header file. */ #undef HAVE_UTIL_H -/* Define to 1 if you have the header file. */ -#undef HAVE_UTMPX_H - -/* Define if struct utmpx contains ut_host */ -#undef HAVE_UTMPX_HOST - -/* Define to 1 if you have the header file. */ -#undef HAVE_UTMP_H - -/* Define if struct utmp contains ut_host */ -#undef HAVE_UTMP_HOST - -/* Define if struct utmp contains ut_pid */ -#undef HAVE_UTMP_PID - /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H @@ -262,9 +223,6 @@ /* Define if you want ISO 14755 extended support */ #undef ISO_14755 -/* Define if you want to have lastlog support when utmp/utmpx is enabled */ -#undef LASTLOG_SUPPORT - /* Define to have CTRL cause wheel events to accelerate scrolling. Release CTRL to halt scrolling */ #undef MOUSE_SLIP_WHEELING @@ -322,21 +280,6 @@ /* Define if you want to hide the pointer while typing */ #undef POINTER_BLANK -/* Define to a fallback location of lastlogx */ -#undef PT_LASTLOGX_FILE - -/* Define to a fallback location of lastlog */ -#undef PT_LASTLOG_FILE - -/* Define to a fallback location of utmp */ -#undef PT_UTMP_FILE - -/* Define to a fallback location of wtmpx */ -#undef PT_WTMPX_FILE - -/* Define to a fallback location of wtmp */ -#undef PT_WTMP_FILE - /* Resource class */ #undef RESCLASS @@ -409,12 +352,6 @@ for multibyte characters input */ #undef USE_XIM -/* Define if you want to have utmp/utmpx support */ -#undef UTMP_SUPPORT - -/* Define if you want to have wtmp support when utmp/utmpx is enabled */ -#undef WTMP_SUPPORT - /* Define to enable xft support */ #undef XFT @@ -451,10 +388,6 @@ /* Enable declarations of msg_control and msg_controllen on Solaris */ #undef _XOPEN_SOURCE -/* Enable declarations in utmp.h on Solaris when the XPG4v2 namespace is - active */ -#undef __EXTENSIONS__ - /* Define to `int' if doesn't define. */ #undef gid_t --- ./libptytty/ptytty.m4.orig 2015-05-11 17:24:03.000000000 -0500 +++ ./libptytty/ptytty.m4 2018-03-31 11:24:41.669415706 -0500 @@ -51,143 +51,6 @@ fi ]) -AC_DEFUN([UTMP_CHECK], -[ -support_utmp=yes -support_wtmp=yes -support_lastlog=yes - -AC_ARG_ENABLE(utmp, - [AS_HELP_STRING([--enable-utmp],[enable utmp (utmpx) support])], - [if test x$enableval = xyes -o x$enableval = xno; then - support_utmp=$enableval - fi]) - -AC_ARG_ENABLE(wtmp, - [AS_HELP_STRING([--enable-wtmp],[enable wtmp (wtmpx) support (requires --enable-utmp)])], - [if test x$enableval = xyes -o x$enableval = xno; then - support_wtmp=$enableval - fi]) - -AC_ARG_ENABLE(lastlog, - [AS_HELP_STRING([--enable-lastlog],[enable lastlog support (requires --enable-utmp)])], - [if test x$enableval = xyes -o x$enableval = xno; then - support_lastlog=$enableval - fi]) - -if test x$support_utmp = xyes; then - AC_DEFINE(UTMP_SUPPORT, 1, Define if you want to have utmp/utmpx support) -fi -if test x$support_wtmp = xyes; then - AC_DEFINE(WTMP_SUPPORT, 1, Define if you want to have wtmp support when utmp/utmpx is enabled) -fi -if test x$support_lastlog = xyes; then - AC_DEFINE(LASTLOG_SUPPORT, 1, Define if you want to have lastlog support when utmp/utmpx is enabled) -fi - -AC_CHECK_FUNCS( \ - updwtmp \ - updwtmpx \ - updlastlogx \ -) - -AC_CHECK_HEADERS(lastlog.h) - -case $host in - *-*-solaris*) - AC_DEFINE(__EXTENSIONS__, 1, Enable declarations in utmp.h on Solaris when the XPG4v2 namespace is active) - ;; -esac - -dnl# -------------------------------------------------------------------------- -dnl# DO ALL UTMP AND WTMP CHECKING -dnl# -------------------------------------------------------------------------- -dnl# check for host field in utmp structure - -dnl# -------------------------------------------- -AC_CHECK_HEADERS(utmp.h, [ -AC_CHECK_TYPES([struct utmp], [], [], [ -#include -#include -]) - -AC_CHECK_MEMBER([struct utmp.ut_host], -[AC_DEFINE(HAVE_UTMP_HOST, 1, Define if struct utmp contains ut_host)], [], [ -#include -#include -]) - -AC_CHECK_MEMBER([struct utmp.ut_pid], -[AC_DEFINE(HAVE_UTMP_PID, 1, Define if struct utmp contains ut_pid)], [], [ -#include -#include -]) -]) dnl# AC_CHECK_HEADERS(utmp.h - -dnl# -------------------------------------------- - -AC_CHECK_HEADERS(utmpx.h, [ -AC_CHECK_TYPES([struct utmpx], [], [], [ -#include -#include -]) - -AC_CHECK_MEMBER([struct utmpx.ut_host], -[AC_DEFINE(HAVE_UTMPX_HOST, 1, Define if struct utmpx contains ut_host)], [], [ -#include -#include -]) -]) dnl# AC_CHECK_HEADERS(utmpx.h - -dnl# -------------------------------------------------------------------------- -dnl# check for struct lastlog -AC_CHECK_TYPES([struct lastlog], [], [], [ -#include -#include -#ifdef HAVE_LASTLOG_H -#include -#endif -]) - -dnl# check for struct lastlogx -AC_CHECK_TYPES([struct lastlogx], [], [], [ -#include -#include -#ifdef HAVE_LASTLOG_H -#include -#endif -]) - -dnl# -------------------------------------------------------------------------- -dnl# FIND FILES -dnl# -------------------------------------------------------------------------- - -dnl# find utmp -PT_FIND_FILE([utmp], [PT_UTMP_FILE], -["/var/run/utmp" "/var/adm/utmp" "/etc/utmp" "/usr/etc/utmp" "/usr/adm/utmp"]) - -dnl# -------------------------------------------------------------------------- - -dnl# find wtmp -PT_FIND_FILE([wtmp], [PT_WTMP_FILE], -["/var/log/wtmp" "/var/adm/wtmp" "/etc/wtmp" "/usr/etc/wtmp" "/usr/adm/wtmp"]) -dnl# -------------------------------------------------------------------------- - -dnl# find wtmpx -PT_FIND_FILE([wtmpx], [PT_WTMPX_FILE], -["/var/log/wtmpx" "/var/adm/wtmpx"]) -dnl# -------------------------------------------------------------------------- - -dnl# find lastlog -PT_FIND_FILE([lastlog], [PT_LASTLOG_FILE], -["/var/log/lastlog" "/var/adm/lastlog"]) -dnl# -------------------------------------------------------------------------- - -dnl# find lastlogx -PT_FIND_FILE([lastlogx], [PT_LASTLOGX_FILE], -["/var/log/lastlogx" "/var/adm/lastlogx"]) -]) - AC_DEFUN([SCM_RIGHTS_CHECK], [ AH_TEMPLATE([_XOPEN_SOURCE], [Enable declarations of msg_control and msg_controllen on Solaris]) --- ./libptytty/src/proxy.C.orig 2015-04-11 13:27:01.000000000 -0500 +++ ./libptytty/src/proxy.C 2018-03-31 11:25:17.787419082 -0500 @@ -1,351 +0,0 @@ -/*----------------------------------------------------------------------* - * File: proxy.C - *----------------------------------------------------------------------* - * - * All portions of code are copyright by their respective author/s. - * Copyright (c) 2006 Marc Lehmann - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - *---------------------------------------------------------------------*/ - -#include "config.h" - -#include "ptytty.h" - -#include "estl.h" - -#include -#include -#include - -#include -#include -#include -#include -#include - -// helper/proxy support - -#if PTYTTY_HELPER - -static int sock_fd = -1, lock_fd = -1; -static int helper_pid; - -struct command -{ - enum { get, login, destroy } type; - - ptytty *id; - - bool login_shell; - int cmd_pid; - char hostname[512]; // arbitrary, but should be plenty -}; - -struct ptytty_proxy : ptytty -{ - ptytty *id; - - ptytty_proxy () - : id(0) - { - } - - ~ptytty_proxy (); - - bool get (); - void login (int cmd_pid, bool login_shell, const char *hostname); -}; - -#if PTYTTY_REENTRANT -# define NEED_TOKEN do { char ch; read (lock_fd, &ch , 1); } while (0) -# define GIVE_TOKEN write (lock_fd, &lock_fd, 1) -#else -# define NEED_TOKEN (void)0 -# define GIVE_TOKEN (void)0 -#endif - -bool -ptytty_proxy::get () -{ - NEED_TOKEN; - - command cmd; - - cmd.type = command::get; - - write (sock_fd, &cmd, sizeof (cmd)); - - if (read (sock_fd, &id, sizeof (id)) != sizeof (id)) - PTYTTY_FATAL ("protocol error while creating pty using helper process, aborting.\n"); - - if (!id) - { - GIVE_TOKEN; - return false; - } - - if ((pty = recv_fd (sock_fd)) < 0 - || (tty = recv_fd (sock_fd)) < 0) - PTYTTY_FATAL ("protocol error while reading pty/tty fds from helper process, aborting.\n"); - - GIVE_TOKEN; - return true; -} - -void -ptytty_proxy::login (int cmd_pid, bool login_shell, const char *hostname) -{ - NEED_TOKEN; - - command cmd; - - cmd.type = command::login; - cmd.id = id; - cmd.cmd_pid = cmd_pid; - cmd.login_shell = login_shell; - strncpy (cmd.hostname, hostname, sizeof (cmd.hostname)); - - write (sock_fd, &cmd, sizeof (cmd)); - - GIVE_TOKEN; -} - -ptytty_proxy::~ptytty_proxy () -{ - if (id) - { - close_tty (); - - if (pty >= 0) - close (pty); - - NEED_TOKEN; - - command cmd; - - cmd.type = command::destroy; - cmd.id = id; - - write (sock_fd, &cmd, sizeof (cmd)); - - GIVE_TOKEN; - } -} - -static -void serve () -{ - command cmd; - vector ptys; - - for (;;) - { - GIVE_TOKEN; - - if (read (sock_fd, &cmd, sizeof (command)) != sizeof (command)) - break; - - if (cmd.type == command::get) - { - // -> id ptyfd ttyfd - cmd.id = new ptytty_unix; - - if (cmd.id->get ()) - { - write (sock_fd, &cmd.id, sizeof (cmd.id)); - ptys.push_back (cmd.id); - - ptytty::send_fd (sock_fd, cmd.id->pty); - ptytty::send_fd (sock_fd, cmd.id->tty); - - cmd.id->close_tty (); - } - else - { - delete cmd.id; - cmd.id = 0; - write (sock_fd, &cmd.id, sizeof (cmd.id)); - } - } - else if (cmd.type == command::login) - { -#if UTMP_SUPPORT - if (find (ptys.begin (), ptys.end (), cmd.id) != ptys.end ()) - { - cmd.hostname[sizeof (cmd.hostname) - 1] = 0; - cmd.id->login (cmd.cmd_pid, cmd.login_shell, cmd.hostname); - } -#endif - } - else if (cmd.type == command::destroy) - { - vector::iterator pty = find (ptys.begin (), ptys.end (), cmd.id); - - if (pty != ptys.end ()) - { - delete *pty; - ptys.erase (pty); - } - } - else - break; - - NEED_TOKEN; - } - - // destroy all ptys - for (vector::iterator i = ptys.end (); i-- > ptys.begin (); ) - delete *i; -} - -void -ptytty::use_helper () -{ - if (sock_fd >= 0) - return; - - int sv[2]; - - if (socketpair (AF_UNIX, SOCK_STREAM, 0, sv)) - PTYTTY_FATAL ("could not create socket to communicate with pty/sessiondb helper, aborting.\n"); - -#if PTYTTY_REENTRANT - int lv[2]; - - if (socketpair (AF_UNIX, SOCK_STREAM, 0, lv)) - PTYTTY_FATAL ("could not create socket to communicate with pty/sessiondb helper, aborting.\n"); -#endif - - helper_pid = fork (); - - if (helper_pid < 0) - PTYTTY_FATAL ("could not create pty/sessiondb helper process, aborting.\n"); - - if (helper_pid) - { - // client, process - sock_fd = sv[0]; - close (sv[1]); - fcntl (sock_fd, F_SETFD, FD_CLOEXEC); -#if PTYTTY_REENTRANT - lock_fd = lv[0]; - close (lv[1]); - fcntl (lock_fd, F_SETFD, FD_CLOEXEC); -#endif - } - else - { - // server, pty-helper - sock_fd = sv[1]; -#if PTYTTY_REENTRANT - lock_fd = lv[1]; -#endif - - chdir ("/"); - - signal (SIGHUP, SIG_IGN); - signal (SIGTERM, SIG_IGN); - signal (SIGINT, SIG_IGN); - signal (SIGPIPE, SIG_IGN); - - for (int fd = 0; fd < 1023; fd++) - if (fd != sock_fd && fd != lock_fd) - close (fd); - - serve (); - _exit (EXIT_SUCCESS); - } -} - -#endif - -ptytty * -ptytty::create () -{ -#if PTYTTY_HELPER - if (helper_pid) - // use helper process - return new ptytty_proxy; - else -#endif - return new ptytty_unix; -} - -void -ptytty::sanitise_stdfd () -{ - // sanitise stdin/stdout/stderr to point to *something*. - for (int fd = 0; fd <= 2; ++fd) - if (fcntl (fd, F_GETFL) < 0 && errno == EBADF) - { - int fd2 = open ("/dev/tty", fd ? O_WRONLY : O_RDONLY); - - if (fd2 < 0) - fd2 = open ("/dev/null", fd ? O_WRONLY : O_RDONLY); - - if (fd2 != fd) - PTYTTY_FATAL ("unable to sanitise fds, aborting.\n"); - } -} - -void -ptytty::init () -{ - sanitise_stdfd (); - - uid_t uid = getuid (); - gid_t gid = getgid (); - - // before doing anything else, check for setuid/setgid operation, - // start the helper process and drop privileges - if (uid != geteuid () - || gid != getegid ()) - { -#if PTYTTY_HELPER - use_helper (); -#else - PTYTTY_WARN ("running setuid/setgid without pty helper compiled in, continuing unprivileged.\n"); -#endif - - drop_privileges (); - } -} - -void -ptytty::drop_privileges () -{ - uid_t uid = getuid (); - gid_t gid = getgid (); - - // drop privileges -#if HAVE_SETRESUID - setresgid (gid, gid, gid); - setresuid (uid, uid, uid); -#elif HAVE_SETREUID - setregid (gid, gid); - setreuid (uid, uid); -#elif HAVE_SETUID - setgid (gid); - setuid (uid); -#else -# error no way to drop privileges, configure failed? -#endif - - if (uid != geteuid () - || gid != getegid ()) - PTYTTY_FATAL ("unable to drop privileges, aborting.\n"); -} - --- ./libptytty/src/ptytty.h.orig 2014-11-16 06:22:34.000000000 -0600 +++ ./libptytty/src/ptytty.h 2018-03-31 11:21:57.530400360 -0500 @@ -8,23 +8,10 @@ # define NO_SETOWNER_TTYDEV 1 #endif -#if UTMP_SUPPORT -# if defined(__GLIBC__) -# undef HAVE_STRUCT_UTMPX -# endif - -# if ! defined(HAVE_STRUCT_UTMPX) && ! defined(HAVE_STRUCT_UTMP) -# error cannot build with utmp support - no utmp or utmpx struct found -# endif - -#endif - struct ptytty_unix : ptytty { char *name; - void log_session (bool login, const char *hostname); - public: ptytty_unix (); @@ -35,13 +22,10 @@ void login (int cmd_pid, bool login_shell, const char *hostname); -#if UTMP_SUPPORT - int utmp_pos; int cmd_pid; bool login_shell; void logout (); -#endif }; #endif --- ./libptytty/src/ptytty.C.orig 2015-05-11 17:24:03.000000000 -0500 +++ ./libptytty/src/ptytty.C 2018-03-31 11:21:57.529400360 -0500 @@ -217,6 +217,29 @@ return 0; } +ptytty * +ptytty::create () +{ + return new ptytty_unix; +} + +void +ptytty::sanitise_stdfd () +{ + // sanitise stdin/stdout/stderr to point to *something*. + for (int fd = 0; fd <= 2; ++fd) + if (fcntl (fd, F_GETFL) < 0 && errno == EBADF) + { + int fd2 = open ("/dev/tty", fd ? O_WRONLY : O_RDONLY); + + if (fd2 < 0) + fd2 = open ("/dev/null", fd ? O_WRONLY : O_RDONLY); + + if (fd2 != fd) + abort (); + } +} + void ptytty::close_tty () { @@ -287,16 +310,12 @@ ptytty_unix::ptytty_unix () { name = 0; -#if UTMP_SUPPORT cmd_pid = 0; -#endif } ptytty_unix::~ptytty_unix () { -#if UTMP_SUPPORT logout (); -#endif put (); } @@ -390,18 +409,6 @@ } #endif -#if UTMP_SUPPORT -# if defined(HAVE_STRUCT_UTMP) && !defined(HAVE_UTMP_PID) - int fd_stdin = dup (STDIN_FILENO); - dup2 (tty, STDIN_FILENO); - - utmp_pos = ttyslot (); - - dup2 (fd_stdin, STDIN_FILENO); - close (fd_stdin); -# endif -#endif - return true; } --- ./libptytty/src/logging.C.orig 2014-11-16 06:22:34.000000000 -0600 +++ ./libptytty/src/logging.C 2018-03-31 11:21:57.527400360 -0500 @@ -36,251 +36,8 @@ #include "ptytty.h" -#include +#include "utempter.h" -#if UTMP_SUPPORT - -#ifdef HAVE_UTMPX_H -# include -#endif -#ifdef HAVE_UTMP_H -# include -#endif -#ifdef HAVE_LASTLOG_H -# include -#endif - -#if !defined(UTMP_FILE) -# if defined(_PATH_UTMP) -# define UTMP_FILE _PATH_UTMP -# elif defined(PT_UTMP_FILE) -# define UTMP_FILE PT_UTMP_FILE -# endif -#endif -#if !defined(WTMP_FILE) -# if defined(_PATH_WTMP) -# define WTMP_FILE _PATH_WTMP -# elif defined(PT_WTMP_FILE) -# define WTMP_FILE PT_WTMP_FILE -# endif -#endif -#if !defined(WTMPX_FILE) -# if defined(_PATH_WTMPX) -# define WTMPX_FILE _PATH_WTMPX -# elif defined(PT_WTMPX_FILE) -# define WTMPX_FILE PT_WTMPX_FILE -# endif -#endif -#if !defined(LASTLOG_FILE) -# if defined(_PATH_LASTLOG) -# define LASTLOG_FILE _PATH_LASTLOG -# elif defined(PT_LASTLOG_FILE) -# define LASTLOG_FILE PT_LASTLOG_FILE -# endif -#endif -#if !defined(LASTLOGX_FILE) -# if defined(_PATH_LASTLOGX) -# define LASTLOGX_FILE _PATH_LASTLOGX -# elif defined(PT_LASTLOGX_FILE) -# define LASTLOGX_FILE PT_LASTLOGX_FILE -# endif -#endif - -#include - -#include -#include - -#include -#include -#include -#include -#include - -/* - * BSD style utmp entry - * ut_line, ut_name, ut_host, ut_time - * SYSV style utmp (and utmpx) entry - * ut_user, ut_id, ut_line, ut_pid, ut_type, ut_exit, ut_time - */ - -/* ------------------------------------------------------------------------- */ -/* - * Write a BSD style utmp entry - */ -#if defined(HAVE_STRUCT_UTMP) && !defined(HAVE_UTMP_PID) -static void -write_bsd_utmp (int utmp_pos, struct utmp *ut) -{ - int fd; - - if (utmp_pos <= 0 || (fd = open (UTMP_FILE, O_WRONLY)) == -1) - return; - - if (lseek (fd, (off_t) (utmp_pos * sizeof (struct utmp)), SEEK_SET) != -1) - write (fd, ut, sizeof (struct utmp)); - close (fd); -} -#endif - -/* ------------------------------------------------------------------------- */ -/* - * Update a BSD style wtmp entry - */ -#if defined(WTMP_SUPPORT) && !defined(HAVE_UPDWTMP) && defined(HAVE_STRUCT_UTMP) -static void -update_wtmp (const char *fname, const struct utmp *ut) -{ - int fd, gotlock, retry; - struct flock lck; /* fcntl locking scheme */ - struct stat sbuf; - - if ((fd = open (fname, O_WRONLY | O_APPEND, 0)) < 0) - return; - - lck.l_whence = SEEK_END; /* start lock at current eof */ - lck.l_len = 0; /* end at ``largest possible eof'' */ - lck.l_start = 0; - lck.l_type = F_WRLCK; /* we want a write lock */ - - /* attempt lock with F_SETLK; F_SETLKW would cause a deadlock! */ - for (retry = 10, gotlock = 0; retry--;) - if (fcntl (fd, F_SETLK, &lck) != -1) - { - gotlock = 1; - break; - } - else if (errno != EAGAIN && errno != EACCES) - break; - - if (gotlock) - { - if (fstat (fd, &sbuf) == 0) - if (write (fd, ut, sizeof (struct utmp)) != sizeof (struct utmp)) - ftruncate (fd, sbuf.st_size); /* remove bad writes */ - - lck.l_type = F_UNLCK; /* unlocking the file */ - fcntl (fd, F_SETLK, &lck); - } - - close (fd); -} -#endif - -/* ------------------------------------------------------------------------- */ -#ifdef LASTLOG_SUPPORT -static void -update_lastlog (const char *pty, const char *host) -{ -# if defined(HAVE_STRUCT_LASTLOGX) && defined(HAVE_UPDLASTLOGX) - struct lastlogx llx; -# endif -# ifdef HAVE_STRUCT_LASTLOG - int fd; - struct lastlog ll; -# endif - -# if defined(HAVE_STRUCT_LASTLOGX) && defined(HAVE_UPDLASTLOGX) - memset (&llx, 0, sizeof (llx)); - llx.ll_tv.tv_sec = time (NULL); - llx.ll_tv.tv_usec = 0; - strncpy (llx.ll_line, pty, sizeof (llx.ll_line)); - strncpy (llx.ll_host, host, sizeof (llx.ll_host)); - updlastlogx (LASTLOGX_FILE, getuid (), &llx); -# endif - -# ifdef HAVE_STRUCT_LASTLOG - memset (&ll, 0, sizeof (ll)); - ll.ll_time = time (NULL); - strncpy (ll.ll_line, pty, sizeof (ll.ll_line)); - strncpy (ll.ll_host, host, sizeof (ll.ll_host)); - if ((fd = open (LASTLOG_FILE, O_RDWR)) != -1) - { - if (lseek (fd, (off_t) (getuid () * sizeof (ll)), - SEEK_SET) != -1) - write (fd, &ll, sizeof (ll)); - close (fd); - } -# endif /* HAVE_STRUCT_LASTLOG */ -} -#endif /* LASTLOG_SUPPORT */ - -#if defined(HAVE_UTMP_PID) || defined(HAVE_STRUCT_UTMPX) -static void -fill_id (char *id, const char *line, size_t id_size) -{ - size_t len = strlen (line); - - if (len > id_size) - line += len - id_size; - strncpy (id, line, id_size); -} -#endif - -#ifdef HAVE_STRUCT_UTMP -static void -fill_utmp (struct utmp *ut, bool login, int pid, const char *line, const char *user, const char *host) -{ - memset (ut, 0, sizeof (struct utmp)); - - strncpy (ut->ut_line, line, sizeof (ut->ut_line)); -# ifdef HAVE_UTMP_PID - fill_id (ut->ut_id, line, sizeof (ut->ut_id)); - ut->ut_pid = pid; - ut->ut_type = login ? USER_PROCESS : DEAD_PROCESS; -# endif - ut->ut_time = time (NULL); - - if (login) - { -# ifdef HAVE_UTMP_PID - strncpy (ut->ut_user, user, sizeof (ut->ut_user)); -# else - strncpy (ut->ut_name, user, sizeof (ut->ut_name)); -# endif -# ifdef HAVE_UTMP_HOST - strncpy (ut->ut_host, host, sizeof (ut->ut_host)); -# endif - } -} -#endif - -#ifdef HAVE_STRUCT_UTMPX -static void -fill_utmpx (struct utmpx *utx, bool login, int pid, const char *line, const char *user, const char *host) -{ - memset (utx, 0, sizeof (struct utmpx)); - - // posix says that ut_line is not meaningful for DEAD_PROCESS - // records, but most implementations of last use ut_line to - // associate records in wtmp file - strncpy (utx->ut_line, line, sizeof (utx->ut_line)); - fill_id (utx->ut_id, line, sizeof (utx->ut_id)); - utx->ut_pid = pid; - utx->ut_type = login ? USER_PROCESS : DEAD_PROCESS; - utx->ut_tv.tv_sec = time (NULL); - utx->ut_tv.tv_usec = 0; - - // posix says that ut_user is not meaningful for DEAD_PROCESS - // records, but solaris utmp_update helper requires that the ut_user - // field of a DEAD_PROCESS entry matches the one of an existing - // USER_PROCESS entry for the same line, if any - strncpy (utx->ut_user, user, sizeof (utx->ut_user)); - - if (login) - { -# ifdef HAVE_UTMPX_HOST - strncpy (utx->ut_host, host, sizeof (utx->ut_host)); -# endif - } -} -#endif - -/* ------------------------------------------------------------------------- */ - -/* - * make and write utmp and wtmp entries - */ void ptytty_unix::login (int cmd_pid, bool login_shell, const char *hostname) { @@ -290,97 +47,17 @@ this->cmd_pid = cmd_pid; this->login_shell = login_shell; - log_session (true, hostname); -} - -void -ptytty_unix::log_session (bool login, const char *hostname) -{ - struct passwd *pwent = getpwuid (getuid ()); - const char *user = (pwent && pwent->pw_name) ? pwent->pw_name : "?"; - - const char *pty = name; - - if (!strncmp (pty, "/dev/", 5)) - pty += 5; /* skip /dev/ prefix */ - -#ifdef HAVE_STRUCT_UTMP - struct utmp *tmput; - struct utmp ut; - fill_utmp (&ut, login, cmd_pid, pty, user, hostname); -#endif - -#ifdef HAVE_STRUCT_UTMPX - struct utmpx *tmputx; - struct utmpx utx; - fill_utmpx (&utx, login, cmd_pid, pty, user, hostname); -#endif - -#ifdef HAVE_STRUCT_UTMP -# ifdef HAVE_UTMP_PID - setutent (); - if (login || ((tmput = getutid (&ut)) && tmput->ut_pid == cmd_pid)) - pututline (&ut); - endutent (); -# else - write_bsd_utmp (utmp_pos, &ut); -# endif -#endif - -#ifdef HAVE_STRUCT_UTMPX - setutxent (); - if (login || ((tmputx = getutxid (&utx)) && tmputx->ut_pid == cmd_pid)) - pututxline (&utx); - endutxent (); -#endif - -#ifdef WTMP_SUPPORT - if (login_shell) - { -# ifdef HAVE_STRUCT_UTMP -# ifdef HAVE_UPDWTMP - updwtmp (WTMP_FILE, &ut); -# else - update_wtmp (WTMP_FILE, &ut); -# endif -# endif -# if defined(HAVE_STRUCT_UTMPX) && defined(HAVE_UPDWTMPX) - updwtmpx (WTMPX_FILE, &utx); -# endif - } -#endif - -#ifdef LASTLOG_SUPPORT - if (login_shell) - if (login) - { - if (pwent) - update_lastlog (pty, hostname); - else - PTYTTY_WARN ("no entry in password file, not updating lastlog.\n"); - } -#endif + utempter_add_record(pty, hostname); } -/* ------------------------------------------------------------------------- */ -/* - * remove utmp and wtmp entries - */ void ptytty_unix::logout () { if (!cmd_pid) return; - log_session (false, 0); + utempter_remove_record(pty); cmd_pid = 0; } -#else -void -ptytty_unix::login (int cmd_pid, bool login_shell, const char *hostname) -{ -} -#endif - --- ./src/Makefile.in.orig 2016-01-23 14:09:22.000000000 -0600 +++ ./src/Makefile.in 2018-03-31 11:21:43.963399092 -0500 @@ -64,10 +64,10 @@ all: allbin rxvt: rxvt.o $(COMMON) - $(LINK) -o $@ rxvt.o $(COMMON) $(LIBS) $(XLIB) $(PERLLIB) + $(LINK) -o $@ rxvt.o $(COMMON) $(LIBS) $(XLIB) $(PERLLIB) -lutempter rxvtd: rxvtd.o $(COMMON) $(COMMON_DAEMON) - $(LINK) -o $@ rxvtd.o $(COMMON) $(COMMON_DAEMON) $(LIBS) $(XLIB) $(PERLLIB) + $(LINK) -o $@ rxvtd.o $(COMMON) $(COMMON_DAEMON) $(LIBS) $(XLIB) $(PERLLIB) -lutempter rxvtc: rxvtc.o $(COMMON_DAEMON) fdpass_wrapper.o $(LINK) -o $@ rxvtc.o $(COMMON_DAEMON) fdpass_wrapper.o $(LIBS) @@ -205,7 +205,7 @@ ptytty_wrapper.o: ../libptytty/src/libptytty.h rxvtperl.h hookinc.h rsinc.h ptytty_wrapper.o: optinc.h ../libptytty/src/logging.C ptytty_wrapper.o: ../libptytty/src/ptytty.h ../libptytty/src/ptytty_conf.h -ptytty_wrapper.o: ../libptytty/src/proxy.C ../libptytty/src/ptytty.C +ptytty_wrapper.o: ../libptytty/src/ptytty.C rxvt.o: ../config.h rxvt.h feature.h ../libptytty/src/ecb.h encoding.h rxvt.o: rxvtutil.h ../libptytty/src/estl.h emman.h rxvtfont.h rxvttoolkit.h rxvt.o: ev_cpp.h ../config.h ../libev/ev++.h ../libev/ev.h callback.h --- ./src/rxvt.C.orig 2014-12-12 19:00:23.000000000 -0600 +++ ./src/rxvt.C 2018-03-31 11:21:43.965399092 -0500 @@ -30,7 +30,7 @@ main (int argc, char *argv[]) try { - ptytty::init (); + ptytty::sanitise_stdfd (); rxvt_init (); rxvt_term *t = new rxvt_term; --- ./src/ptytty_wrapper.C.orig 2014-12-12 19:00:23.000000000 -0600 +++ ./src/ptytty_wrapper.C 2018-03-31 11:21:43.961399092 -0500 @@ -7,5 +7,4 @@ #define PTYTTY_WARN rxvt_warn #include "logging.C" -#include "proxy.C" #include "ptytty.C" --- ./src/rxvtd.C.orig 2014-12-26 16:34:13.000000000 -0600 +++ ./src/rxvtd.C 2018-03-31 11:21:43.960399092 -0500 @@ -227,7 +227,7 @@ int main (int argc, char *argv[]) { - ptytty::init (); + ptytty::sanitise_stdfd (); static char opt_fork, opt_opendisplay, opt_quiet; #if ENABLE_PERL