--- 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 */