Loading...
gen/NetBSD/utmpx.c.patch Libc-391 /dev/null
--- 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 */