Loading...
--- Libc/Libc-391/gen/NetBSD/utmpx.c.patch
+++ /dev/null
@@ -1,271 +0,0 @@
---- utmpx.c.orig 2004-07-13 13:02:37.000000000 -0700
-+++ utmpx.c 2004-08-05 15:25:10.000000000 -0700
-@@ -50,7 +50,6 @@
- #include <sys/wait.h>
-
- #include <assert.h>
--#include <db.h>
- #include <errno.h>
- #include <fcntl.h>
- #include <stdio.h>
-@@ -63,6 +62,13 @@
- #include <utmpx.h>
- #include <vis.h>
-
-+#ifdef UTMP_COMPAT
-+#include <utmp.h>
-+#include <ttyent.h>
-+
-+static void _utmp_compat(const struct utmpx *);
-+#endif /* UTMP_COMPAT */
-+
- __warn_references(getlastlogx,
- "warning: reference to compatibility getlastlogx(); include <utmpx.h> for correct reference")
- __warn_references(lastlogxname,
-@@ -72,7 +78,6 @@
- static int readonly = 0;
- static struct utmpx ut;
- static char utfile[MAXPATHLEN] = _PATH_UTMPX;
--static char llfile[MAXPATHLEN] = _PATH_LASTLOGX;
-
- static struct utmpx *utmp_update(const struct utmpx *);
-
-@@ -270,6 +275,9 @@
- goto fail;
-
- u = memcpy(&ut, &temp, sizeof(ut));
-+#ifdef UTMP_COMPAT
-+ _utmp_compat(u);
-+#endif /* UTMP_COMPAT */
- fail:
- if (gotlock) {
- if (lockf(fileno(fp), F_ULOCK, (off_t)0) == -1)
-@@ -308,185 +316,50 @@
-
- }
-
--/*
-- * The following are extensions and not part of the X/Open spec.
-- */
--int
--updwtmpx(const char *file, const struct utmpx *utx)
--{
-- int fd;
-- int saved_errno;
--
-- _DIAGASSERT(file != NULL);
-- _DIAGASSERT(utx != NULL);
--
-- fd = open(file, O_WRONLY|O_APPEND|O_SHLOCK);
--
-- if (fd == -1) {
-- if ((fd = open(file, O_CREAT|O_WRONLY|O_EXLOCK, 0644)) == -1)
-- return -1;
-- (void)memset(&ut, 0, sizeof(ut));
-- ut.ut_type = SIGNATURE;
-- (void)memcpy(ut.ut_user, vers, sizeof(vers));
-- if (write(fd, &ut, sizeof(ut)) == -1)
-- goto failed;
-+#ifdef UTMP_COMPAT
-+static void
-+_utmp_compat(const struct utmpx *ux)
-+{
-+ struct utmp u;
-+ int fd, slot;
-+ struct ttyent *ttyp;
-+
-+ switch (ux->ut_type) {
-+ case INIT_PROCESS:
-+ case LOGIN_PROCESS:
-+ case USER_PROCESS:
-+ break;
-+ case DEAD_PROCESS:
-+ logout(ux->ut_line);
-+ return;
-+ default:
-+ return;
- }
-- if (write(fd, utx, sizeof(*utx)) == -1)
-- goto failed;
-- if (close(fd) == -1)
-- return -1;
-- return 0;
--
-- failed:
-- saved_errno = errno;
-- (void) close(fd);
-- errno = saved_errno;
-- return -1;
--}
--
--
--int
--utmpxname(const char *fname)
--{
-- size_t len;
--
-- _DIAGASSERT(fname != NULL);
--
-- len = strlen(fname);
--
-- if (len >= sizeof(utfile))
-- return 0;
--
-- /* must end in x! */
-- if (fname[len - 1] != 'x')
-- return 0;
--
-- (void)strlcpy(utfile, fname, sizeof(utfile));
-- endutxent();
-- return 1;
--}
--
--
--void
--getutmp(const struct utmpx *ux, struct utmp *u)
--{
--
-- _DIAGASSERT(ux != NULL);
-- _DIAGASSERT(u != NULL);
--
-- (void)memcpy(u->ut_name, ux->ut_name, sizeof(u->ut_name));
-- (void)memcpy(u->ut_line, ux->ut_line, sizeof(u->ut_line));
-- (void)memcpy(u->ut_host, ux->ut_host, sizeof(u->ut_host));
-- u->ut_time = ux->ut_tv.tv_sec;
--}
--
--void
--getutmpx(const struct utmp *u, struct utmpx *ux)
--{
--
-- _DIAGASSERT(ux != NULL);
-- _DIAGASSERT(u != NULL);
--
-- (void)memcpy(ux->ut_name, u->ut_name, sizeof(u->ut_name));
-- (void)memcpy(ux->ut_line, u->ut_line, sizeof(u->ut_line));
-- (void)memcpy(ux->ut_host, u->ut_host, sizeof(u->ut_host));
-- ux->ut_tv.tv_sec = u->ut_time;
-- ux->ut_tv.tv_usec = 0;
-- (void)memset(&ux->ut_ss, 0, sizeof(ux->ut_ss));
-- ux->ut_pid = 0;
-- ux->ut_type = USER_PROCESS;
-- ux->ut_session = 0;
-- ux->ut_exit.e_termination = 0;
-- ux->ut_exit.e_exit = 0;
--}
--
--int
--lastlogxname(const char *fname)
--{
-- size_t len;
--
-- _DIAGASSERT(fname != NULL);
--
-- len = strlen(fname);
--
-- if (len >= sizeof(llfile))
-- return 0;
--
-- /* must end in x! */
-- if (fname[len - 1] != 'x')
-- return 0;
--
-- (void)strlcpy(llfile, fname, sizeof(llfile));
-- return 1;
--}
--
--struct lastlogx *
--getlastlogx(uid_t uid, struct lastlogx *ll)
--{
--
-- return __getlastlogx13(_PATH_LASTLOGX, uid, ll);
--}
--
--struct lastlogx *
--__getlastlogx13(const char *fname, uid_t uid, struct lastlogx *ll)
--{
-- DBT key, data;
-- DB *db;
--
-- _DIAGASSERT(fname != NULL);
-- _DIAGASSERT(ll != NULL);
--
-- db = dbopen(fname, O_RDONLY|O_SHLOCK, 0, DB_HASH, NULL);
--
-- if (db == NULL)
-- return NULL;
--
-- key.data = &uid;
-- key.size = sizeof(uid);
--
-- if ((db->get)(db, &key, &data, 0) != 0)
-- goto error;
--
-- if (data.size != sizeof(*ll)) {
-- errno = EFTYPE;
-- goto error;
-+ /* do equivalent of ttyslot(), but using ux->ut_slot */
-+ setttyent();
-+ slot = 1;
-+ for(;;) {
-+ if ((ttyp = getttyent()) == NULL) {
-+ endttyent();
-+ return;
-+ }
-+ if (!strcmp(ttyp->ty_name, ux->ut_line)) {
-+ endttyent();
-+ break;
-+ }
-+ slot++;
- }
-
-- if (ll == NULL)
-- if ((ll = malloc(sizeof(*ll))) == NULL)
-- goto done;
--
-- (void)memcpy(ll, data.data, sizeof(*ll));
-- goto done;
--error:
-- ll = NULL;
--done:
-- (db->close)(db);
-- return ll;
--}
--
--int
--updlastlogx(const char *fname, uid_t uid, struct lastlogx *ll)
--{
-- DBT key, data;
-- int error = 0;
-- DB *db;
--
-- _DIAGASSERT(fname != NULL);
-- _DIAGASSERT(ll != NULL);
--
-- db = dbopen(fname, O_RDWR|O_CREAT|O_EXLOCK, 0, DB_HASH, NULL);
--
-- if (db == NULL)
-- return -1;
--
-- key.data = &uid;
-- key.size = sizeof(uid);
-- data.data = ll;
-- data.size = sizeof(*ll);
-- if ((db->put)(db, &key, &data, 0) != 0)
-- error = -1;
--
-- (db->close)(db);
-- return error;
-+ /* now write utmp */
-+ (void)memset(&u, 0, sizeof(u));
-+ strncpy(u.ut_line, ux->ut_line, UT_LINESIZE);
-+ strncpy(u.ut_name, ux->ut_user, UT_NAMESIZE);
-+ strncpy(u.ut_host, ux->ut_host, UT_HOSTSIZE);
-+ u.ut_time = ux->ut_tv.tv_sec;
-+ if ((fd = open(_PATH_UTMP, O_WRONLY|O_CREAT, 0644)) >= 0) {
-+ (void)lseek(fd, (off_t)(slot * sizeof(struct utmp)), L_SET);
-+ (void)write(fd, &u, sizeof(struct utmp));
-+ (void)close(fd);
-+ }
- }
-+#endif /* UTMP_COMPAT */