Loading...
gen/NetBSD/utmpx.c.patch /dev/null Libc-391
--- /dev/null
+++ Libc/Libc-391/gen/NetBSD/utmpx.c.patch
@@ -0,0 +1,271 @@
+--- 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 */