diff options
author | Patrick J Volkerding <volkerdi@slackware.com> | 2018-05-28 19:12:29 +0000 |
---|---|---|
committer | Eric Hameleers <alien@slackware.com> | 2018-05-31 23:39:35 +0200 |
commit | 646a5c1cbfd95873950a87b5f75d52073a967023 (patch) | |
tree | b8b8d2ab3b0d432ea69ad1a64d1c789649d65020 /source/xap/rxvt-unicode/rxvt-unicode.utempter.diff | |
parent | d31c50870d0bee042ce660e445c9294a59a3a65b (diff) | |
download | current-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.diff | 1183 |
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 |