summaryrefslogtreecommitdiff
path: root/source/xap/rxvt-unicode/rxvt-unicode.utempter.diff
diff options
context:
space:
mode:
authorPatrick J Volkerding <volkerdi@slackware.com>2018-05-28 19:12:29 +0000
committerEric Hameleers <alien@slackware.com>2018-05-31 23:39:35 +0200
commit646a5c1cbfd95873950a87b5f75d52073a967023 (patch)
treeb8b8d2ab3b0d432ea69ad1a64d1c789649d65020 /source/xap/rxvt-unicode/rxvt-unicode.utempter.diff
parentd31c50870d0bee042ce660e445c9294a59a3a65b (diff)
downloadcurrent-646a5c1cbfd95873950a87b5f75d52073a967023.tar.gz
Mon May 28 19:12:29 UTC 201820180528191229
a/pkgtools-15.0-noarch-13.txz: Rebuilt. installpkg: default line length for --terselength is the number of columns. removepkg: added --terse mode. upgradepkg: default line length for --terselength is the number of columns. upgradepkg: accept -option in addition to --option. ap/vim-8.1.0026-x86_64-1.txz: Upgraded. d/bison-3.0.5-x86_64-1.txz: Upgraded. e/emacs-26.1-x86_64-1.txz: Upgraded. kde/kopete-4.14.3-x86_64-8.txz: Rebuilt. Recompiled against libidn-1.35. n/conntrack-tools-1.4.5-x86_64-1.txz: Upgraded. n/libnetfilter_conntrack-1.0.7-x86_64-1.txz: Upgraded. n/libnftnl-1.1.0-x86_64-1.txz: Upgraded. n/links-2.16-x86_64-2.txz: Rebuilt. Rebuilt to enable X driver for -g mode. n/lynx-2.8.9dev.19-x86_64-1.txz: Upgraded. n/nftables-0.8.5-x86_64-1.txz: Upgraded. n/p11-kit-0.23.11-x86_64-1.txz: Upgraded. n/ulogd-2.0.7-x86_64-1.txz: Upgraded. n/whois-5.3.1-x86_64-1.txz: Upgraded. xap/network-manager-applet-1.8.12-x86_64-1.txz: Upgraded. xap/vim-gvim-8.1.0026-x86_64-1.txz: Upgraded.
Diffstat (limited to 'source/xap/rxvt-unicode/rxvt-unicode.utempter.diff')
-rw-r--r--source/xap/rxvt-unicode/rxvt-unicode.utempter.diff1183
1 files changed, 1183 insertions, 0 deletions
diff --git a/source/xap/rxvt-unicode/rxvt-unicode.utempter.diff b/source/xap/rxvt-unicode/rxvt-unicode.utempter.diff
new file mode 100644
index 00000000..d56c1352
--- /dev/null
+++ b/source/xap/rxvt-unicode/rxvt-unicode.utempter.diff
@@ -0,0 +1,1183 @@
+--- ./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 <lastlog.h> 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 <stropts.h> 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 <sys/byteorder.h> 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 <util.h> header file. */
+ #undef HAVE_UTIL_H
+
+-/* Define to 1 if you have the <utmpx.h> header file. */
+-#undef HAVE_UTMPX_H
+-
+-/* Define if struct utmpx contains ut_host */
+-#undef HAVE_UTMPX_HOST
+-
+-/* Define to 1 if you have the <utmp.h> 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 <wchar.h> 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 <sys/types.h> 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 <sys/types.h>
+-#include <utmp.h>
+-])
+-
+-AC_CHECK_MEMBER([struct utmp.ut_host],
+-[AC_DEFINE(HAVE_UTMP_HOST, 1, Define if struct utmp contains ut_host)], [], [
+-#include <sys/types.h>
+-#include <utmp.h>
+-])
+-
+-AC_CHECK_MEMBER([struct utmp.ut_pid],
+-[AC_DEFINE(HAVE_UTMP_PID, 1, Define if struct utmp contains ut_pid)], [], [
+-#include <sys/types.h>
+-#include <utmp.h>
+-])
+-]) dnl# AC_CHECK_HEADERS(utmp.h
+-
+-dnl# --------------------------------------------
+-
+-AC_CHECK_HEADERS(utmpx.h, [
+-AC_CHECK_TYPES([struct utmpx], [], [], [
+-#include <sys/types.h>
+-#include <utmpx.h>
+-])
+-
+-AC_CHECK_MEMBER([struct utmpx.ut_host],
+-[AC_DEFINE(HAVE_UTMPX_HOST, 1, Define if struct utmpx contains ut_host)], [], [
+-#include <sys/types.h>
+-#include <utmpx.h>
+-])
+-]) dnl# AC_CHECK_HEADERS(utmpx.h
+-
+-dnl# --------------------------------------------------------------------------
+-dnl# check for struct lastlog
+-AC_CHECK_TYPES([struct lastlog], [], [], [
+-#include <sys/types.h>
+-#include <utmp.h>
+-#ifdef HAVE_LASTLOG_H
+-#include <lastlog.h>
+-#endif
+-])
+-
+-dnl# check for struct lastlogx
+-AC_CHECK_TYPES([struct lastlogx], [], [], [
+-#include <sys/types.h>
+-#include <utmpx.h>
+-#ifdef HAVE_LASTLOG_H
+-#include <lastlog.h>
+-#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 <schmorp@schmorp.de>
+- *
+- * 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 <stdio.h>
+-#include <string.h>
+-#include <signal.h>
+-
+-#include <sys/types.h>
+-#include <sys/socket.h>
+-#include <unistd.h>
+-#include <fcntl.h>
+-#include <errno.h>
+-
+-// 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<ptytty *> 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<ptytty *>::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<ptytty *>::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 <sys/types.h>
++#include "utempter.h"
+
+-#if UTMP_SUPPORT
+-
+-#ifdef HAVE_UTMPX_H
+-# include <utmpx.h>
+-#endif
+-#ifdef HAVE_UTMP_H
+-# include <utmp.h>
+-#endif
+-#ifdef HAVE_LASTLOG_H
+-# include <lastlog.h>
+-#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 <pwd.h>
+-
+-#include <stdio.h>
+-#include <string.h>
+-
+-#include <sys/stat.h>
+-#include <fcntl.h>
+-#include <unistd.h>
+-#include <time.h>
+-#include <errno.h>
+-
+-/*
+- * 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