diff options
Diffstat (limited to 'misc/screen/patches/patch-am')
-rw-r--r-- | misc/screen/patches/patch-am | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/misc/screen/patches/patch-am b/misc/screen/patches/patch-am new file mode 100644 index 00000000000..1d4842772ad --- /dev/null +++ b/misc/screen/patches/patch-am @@ -0,0 +1,88 @@ +$NetBSD: patch-am,v 1.1 2002/09/15 06:51:39 kim Exp $ + +Code to handle the login slot in utmp when utmpx is available. +Daemons shipped with NetBSD tend to write to both, while 3rd +party software might write to only one. + +--- /dev/null Sun Sep 15 02:36:51 2002 ++++ utmp-netbsd.c Sun Sep 15 02:38:27 2002 +@@ -0,0 +1,79 @@ ++#include <sys/param.h> ++#if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 106050000) ++ ++#include <sys/types.h> ++#include <sys/time.h> ++#include <sys/wait.h> ++ ++#include <errno.h> ++#include <fcntl.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <time.h> ++#include <ttyent.h> ++#include <unistd.h> ++#include <util.h> ++#include <utmp.h> ++ ++static struct utmp saved_utmp; ++static int saved_utmp_ok = 0; ++ ++int ++lineslot(line) ++char *line; ++{ ++ int slot; ++ struct ttyent *ttyp; ++ ++ setttyent(); ++ for (slot = 1; (ttyp = getttyent()) != NULL; ++slot) ++ if (!strcmp(ttyp->ty_name, line)) { ++ endttyent(); ++ return(slot); ++ } ++ endttyent(); ++ return(0); ++} ++ ++void ++utmp_login(line) ++char *line; ++{ ++ int fd; ++ int tty; ++ ++ if (!saved_utmp_ok) ++ return; ++ ++ tty = lineslot(line); ++ if (tty > 0 && (fd = open(_PATH_UTMP, O_WRONLY|O_CREAT, 0644)) >= 0) { ++ (void)lseek(fd, (off_t)(tty * sizeof(struct utmp)), SEEK_SET); ++ (void)write(fd, &saved_utmp, sizeof(struct utmp)); ++ (void)close(fd); ++ } ++} ++ ++void ++utmp_logout(const char *line) ++{ ++ int fd; ++ struct utmp ut; ++ ++ if ((fd = open(_PATH_UTMP, O_RDWR, 0)) < 0) ++ return; ++ while (read(fd, &ut, sizeof(ut)) == sizeof(ut)) { ++ if (!ut.ut_name[0] || strncmp(ut.ut_line, line, UT_LINESIZE)) ++ continue; ++ memcpy(&saved_utmp, &ut, sizeof(ut)); ++ saved_utmp_ok = 1; ++ memset(ut.ut_name, 0, UT_NAMESIZE); ++ memset(ut.ut_host, 0, UT_HOSTSIZE); ++ (void)time(&ut.ut_time); ++ (void)lseek(fd, -(off_t)sizeof(ut), SEEK_CUR); ++ (void)write(fd, &ut, sizeof(ut)); ++ } ++ (void)close(fd); ++} ++ ++#endif |