Loading...
--- Libc/Libc-763.13/gen/NetBSD/utmpx.c.patch
+++ Libc/Libc-498/gen/NetBSD/utmpx.c.patch
@@ -1,6 +1,6 @@
---- utmpx.c.orig 2010-06-24 19:43:32.000000000 -0700
-+++ utmpx.c 2010-06-29 11:25:57.000000000 -0700
-@@ -42,111 +42,240 @@ __RCSID("$NetBSD: utmpx.c,v 1.25 2008/04
+--- utmpx.c.orig 2006-02-06 00:43:57.000000000 -0800
++++ utmpx.c 2006-02-06 00:51:52.000000000 -0800
+@@ -49,34 +49,27 @@
#include <sys/time.h>
#include <sys/wait.h>
@@ -12,377 +12,152 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-+#ifdef UNIFDEF_LEGACY_UTMP_APIS
#include <utmp.h>
-+#endif /* UNIFDEF_LEGACY_UTMP_APIS */
+-/* don't define earlier, has side effects in fcntl.h */
+-#define __LIBC12_SOURCE__
#include <utmpx.h>
+#include <utmpx-darwin.h>
+#include <errno.h>
#include <vis.h>
+-
+-__warn_references(getlastlogx,
+- "warning: reference to compatibility getlastlogx(); include <utmpx.h> for correct reference")
+-__warn_references(lastlogxname,
+- "warning: reference to deprecated lastlogxname()")
+#include <notify.h>
--static FILE *fp;
--static int readonly = 0;
--static struct utmpx ut;
--static char utfile[MAXPATHLEN] = _PATH_UTMPX;
-+/* This is the default struct _utmpx shared by the POSIX APIs */
-+__private_extern__
-+struct _utmpx __utx__ = {
-+ __UTX_MAGIC__, /* magic */
-+ {}, /* ut */
-+ PTHREAD_MUTEX_INITIALIZER, /* utmpx_mutex */
-+ _PATH_UTMPX, /* utfile */
-+ NULL, /* fp */
-+ 1, /* utfile_system */
-+ 0, /* readonly */
-+};
-+
-+static struct utmpx *__getutxid(struct _utmpx *, const struct utmpx *);
+ static FILE *fp;
+ static int readonly = 0;
+ static struct utmpx ut;
+ static char utfile[MAXPATHLEN] = _PATH_UTMPX;
+-static char llfile[MAXPATHLEN] = _PATH_LASTLOGX;
++__private_extern__ int utfile_system = 1; /* are we using _PATH_UTMPX? */
-static struct utmpx *utmp_update(const struct utmpx *);
++static struct utmpx *_getutxid(const struct utmpx *);
+
+-static const char vers[] = "utmpx-1.00";
+__private_extern__ const char _utmpx_vers[] = "utmpx-1.00";
--static const char vers[] = "utmpx-1.00";
-+__private_extern__ void
-+__setutxent(struct _utmpx *U)
-+{
-+
-+ (void)memset(&U->ut, 0, sizeof(U->ut));
-+ if (U->fp == NULL)
-+ return;
-+#ifdef __LP64__
-+ (void)fseeko(U->fp, (off_t)sizeof(struct utmpx32), SEEK_SET);
-+#else /* __LP64__ */
-+ (void)fseeko(U->fp, (off_t)sizeof(U->ut), SEEK_SET);
-+#endif /* __LP64__ */
-+}
-
void
--setutxent()
-+_setutxent(struct _utmpx *U)
- {
-
-- (void)memset(&ut, 0, sizeof(ut));
-- if (fp == NULL)
-- return;
-- (void)fseeko(fp, (off_t)sizeof(ut), SEEK_SET);
-+ TEST_UTMPX_T("_setutxent", U);
-+ UTMPX_LOCK(U);
-+ __setutxent(U);
-+ UTMPX_UNLOCK(U);
+ setutxent()
+@@ -85,7 +78,11 @@
+ (void)memset(&ut, 0, sizeof(ut));
+ if (fp == NULL)
+ return;
++#ifdef __LP64__
++ (void)fseeko(fp, (off_t)sizeof(struct utmpx32), SEEK_SET);
++#else /* __LP64__ */
+ (void)fseeko(fp, (off_t)sizeof(ut), SEEK_SET);
++#endif /* __LP64__ */
}
- void
--endutxent()
-+setutxent()
- {
-+ _setutxent(&__utx__);
-+}
-+
-
-- (void)memset(&ut, 0, sizeof(ut));
-- if (fp != NULL) {
-- (void)fclose(fp);
-- fp = NULL;
-- readonly = 0;
-+__private_extern__ void
-+__endutxent(struct _utmpx *U)
-+{
-+ (void)memset(&U->ut, 0, sizeof(U->ut));
-+ if (U->fp != NULL) {
-+ int saveerrno = errno;
-+ (void)fclose(U->fp);
-+ errno = saveerrno;
-+ U->fp = NULL;
-+ U->readonly = 0;
- }
- }
-
-
--struct utmpx *
--getutxent()
-+void
-+_endutxent(struct _utmpx *U)
- {
-+ TEST_UTMPX_T("_endutxent", U);
-+ UTMPX_LOCK(U);
-+ __endutxent(U);
-+ UTMPX_UNLOCK(U);
-+}
-
-- if (fp == NULL) {
-+
-+void
-+endutxent()
-+{
-+ _endutxent(&__utx__);
-+}
-+
-+
-+__private_extern__ struct utmpx *
-+__getutxent(struct _utmpx *U)
-+{
-+ int saveerrno;
+@@ -105,6 +102,9 @@
+ struct utmpx *
+ getutxent()
+ {
+#ifdef __LP64__
+ struct utmpx32 ut32;
+#endif /* __LP64__ */
-+
-+ if (U->fp == NULL) {
+
+ if (fp == NULL) {
struct stat st;
-
-- if ((fp = fopen(utfile, "r+")) == NULL)
-- if ((fp = fopen(utfile, "w+")) == NULL) {
-- if ((fp = fopen(utfile, "r")) == NULL)
-+ if ((U->fp = fopen(U->utfile, "r+")) == NULL)
-+ if ((U->fp = fopen(U->utfile, "w+")) == NULL) {
-+ if ((U->fp = fopen(U->utfile, "r")) == NULL)
- goto fail;
- else
-- readonly = 1;
-+ U->readonly = 1;
- }
--
-+
-+ fcntl(fileno(U->fp), F_SETFD, 1); /* set close-on-exec flag */
-
- /* get file size in order to check if new file */
-- if (fstat(fileno(fp), &st) == -1)
-+ if (fstat(fileno(U->fp), &st) == -1)
- goto failclose;
+@@ -124,42 +124,80 @@
if (st.st_size == 0) {
/* new file, add signature record */
-- (void)memset(&ut, 0, sizeof(ut));
-- ut.ut_type = SIGNATURE;
-- (void)memcpy(ut.ut_user, vers, sizeof(vers));
-- if (fwrite(&ut, sizeof(ut), 1, fp) != 1)
+#ifdef __LP64__
+ (void)memset(&ut32, 0, sizeof(ut32));
+ ut32.ut_type = SIGNATURE;
+ (void)memcpy(ut32.ut_user, _utmpx_vers, sizeof(_utmpx_vers));
-+ if (fwrite(&ut32, sizeof(ut32), 1, U->fp) != 1)
-+#else /* __LP64__ */
-+ (void)memset(&U->ut, 0, sizeof(U->ut));
-+ U->ut.ut_type = SIGNATURE;
-+ (void)memcpy(U->ut.ut_user, _utmpx_vers, sizeof(_utmpx_vers));
-+ if (fwrite(&U->ut, sizeof(U->ut), 1, U->fp) != 1)
++ if (fwrite(&ut32, sizeof(ut32), 1, fp) != 1)
++#else /* __LP64__ */
+ (void)memset(&ut, 0, sizeof(ut));
+ ut.ut_type = SIGNATURE;
+- (void)memcpy(ut.ut_user, vers, sizeof(vers));
++ (void)memcpy(ut.ut_user, _utmpx_vers, sizeof(_utmpx_vers));
+ if (fwrite(&ut, sizeof(ut), 1, fp) != 1)
+#endif /* __LP64__ */
goto failclose;
} else {
/* old file, read signature record */
-- if (fread(&ut, sizeof(ut), 1, fp) != 1)
-+#ifdef __LP64__
-+ if (fread(&ut32, sizeof(ut32), 1, U->fp) != 1)
-+#else /* __LP64__ */
-+ if (fread(&U->ut, sizeof(U->ut), 1, U->fp) != 1)
++#ifdef __LP64__
++ if (fread(&ut32, sizeof(ut32), 1, fp) != 1)
++#else /* __LP64__ */
+ if (fread(&ut, sizeof(ut), 1, fp) != 1)
+#endif /* __LP64__ */
goto failclose;
- if (memcmp(ut.ut_user, vers, sizeof(vers)) != 0 ||
-- ut.ut_type != SIGNATURE)
+#ifdef __LP64__
+ if (memcmp(ut32.ut_user, _utmpx_vers, sizeof(_utmpx_vers)) != 0 ||
+ ut32.ut_type != SIGNATURE)
+#else /* __LP64__ */
-+ if (memcmp(U->ut.ut_user, _utmpx_vers, sizeof(_utmpx_vers)) != 0 ||
-+ U->ut.ut_type != SIGNATURE)
-+#endif /* __LP64__ */
-+ {
-+ errno = EINVAL;
++ if (memcmp(ut.ut_user, _utmpx_vers, sizeof(_utmpx_vers)) != 0 ||
+ ut.ut_type != SIGNATURE)
++#endif /* __LP64__ */
goto failclose;
-+ }
}
}
-- if (fread(&ut, sizeof(ut), 1, fp) != 1)
-+#ifdef __LP64__
-+ if (fread(&ut32, sizeof(ut32), 1, U->fp) != 1)
-+#else /* __LP64__ */
-+ if (fread(&U->ut, sizeof(U->ut), 1, U->fp) != 1)
++#ifdef __LP64__
++ if (fread(&ut32, sizeof(ut32), 1, fp) != 1)
++#else /* __LP64__ */
+ if (fread(&ut, sizeof(ut), 1, fp) != 1)
+#endif /* __LP64__ */
goto fail;
-- return &ut;
-+#ifdef __LP64__
-+ _utmpx32_64(&ut32, &U->ut);
-+#endif /* __LP64__ */
-+ return &U->ut;
++#ifdef __LP64__
++ _utmpx32_64(&ut32, &ut);
++#endif /* __LP64__ */
+ return &ut;
failclose:
-- (void)fclose(fp);
-+ saveerrno = errno;
-+ (void)fclose(U->fp);
-+ errno = saveerrno;
-+ U->fp = NULL;
+ (void)fclose(fp);
++ fp = NULL;
fail:
-- (void)memset(&ut, 0, sizeof(ut));
-+ (void)memset(&U->ut, 0, sizeof(U->ut));
+ (void)memset(&ut, 0, sizeof(ut));
return NULL;
}
-
+-
struct utmpx *
--getutxid(const struct utmpx *utx)
-+_getutxent(struct _utmpx *U)
- {
-+ struct utmpx *ret;
-+
-+ TEST_UTMPX_T("_getutxent", U);
-+ UTMPX_LOCK(U);
-+ ret = __getutxent(U);
-+ UTMPX_UNLOCK(U);
-+ return ret;
-+}
-+
-+
-+struct utmpx *
-+getutxent()
-+{
-+ return _getutxent(&__utx__);
-+}
-
-- _DIAGASSERT(utx != NULL);
-+
-+struct utmpx *
-+_getutxid(struct _utmpx *U, const struct utmpx *utx)
-+{
+ getutxid(const struct utmpx *utx)
+ {
+ struct utmpx temp;
+ const struct utmpx *ux;
-+ struct utmpx *ret;
+
+ _DIAGASSERT(utx != NULL);
if (utx->ut_type == EMPTY)
return NULL;
-+ TEST_UTMPX_T("_getutxid", U);
-+ UTMPX_LOCK(U);
+ /* make a copy as needed, and auto-fill if requested */
+ ux = _utmpx_working_copy(utx, &temp, 1);
-+ if (!ux) {
-+ UTMPX_UNLOCK(U);
++ if (!ux)
+ return NULL;
-+ }
+
-+ ret = __getutxid(U, ux);
-+ UTMPX_UNLOCK(U);
-+ return ret;
-+}
-+
-+
-+struct utmpx *
-+getutxid(const struct utmpx *utx)
-+{
-+ return _getutxid(&__utx__, utx);
++ return _getutxid(ux);
+}
+
+
+static struct utmpx *
-+__getutxid(struct _utmpx *U, const struct utmpx *utx)
++_getutxid(const struct utmpx *utx)
+{
+
do {
-- if (ut.ut_type == EMPTY)
-+ if (U->ut.ut_type == EMPTY)
+ if (ut.ut_type == EMPTY)
continue;
- switch (utx->ut_type) {
- case EMPTY:
-@@ -155,21 +284,21 @@ getutxid(const struct utmpx *utx)
- case BOOT_TIME:
- case OLD_TIME:
- case NEW_TIME:
-- if (ut.ut_type == utx->ut_type)
-- return &ut;
-+ if (U->ut.ut_type == utx->ut_type)
-+ return &U->ut;
- break;
- case INIT_PROCESS:
- case LOGIN_PROCESS:
- case USER_PROCESS:
- case DEAD_PROCESS:
-- switch (ut.ut_type) {
-+ switch (U->ut.ut_type) {
- case INIT_PROCESS:
- case LOGIN_PROCESS:
- case USER_PROCESS:
- case DEAD_PROCESS:
-- if (memcmp(ut.ut_id, utx->ut_id,
-- sizeof(ut.ut_id)) == 0)
-- return &ut;
-+ if (memcmp(U->ut.ut_id, utx->ut_id,
-+ sizeof(U->ut.ut_id)) == 0)
-+ return &U->ut;
- break;
- default:
- break;
-@@ -178,188 +307,253 @@ getutxid(const struct utmpx *utx)
- default:
- return NULL;
- }
-- } while (getutxent() != NULL);
-+ } while (__getutxent(U) != NULL);
- return NULL;
- }
-
-
--struct utmpx *
--getutxline(const struct utmpx *utx)
-+static struct utmpx *
-+__getutxline(struct _utmpx *U, const struct utmpx *utx)
- {
--
-- _DIAGASSERT(utx != NULL);
--
- do {
-- switch (ut.ut_type) {
-+ switch (U->ut.ut_type) {
- case EMPTY:
- break;
- case LOGIN_PROCESS:
- case USER_PROCESS:
-- if (strncmp(ut.ut_line, utx->ut_line,
-- sizeof(ut.ut_line)) == 0)
-- return &ut;
-+ if (strncmp(U->ut.ut_line, utx->ut_line,
-+ sizeof(U->ut.ut_line)) == 0)
-+ return &U->ut;
- break;
- default:
- break;
- }
-- } while (getutxent() != NULL);
-+ } while (__getutxent(U) != NULL);
- return NULL;
- }
-
-
+@@ -225,30 +263,68 @@
struct utmpx *
--pututxline(const struct utmpx *utx)
-+_getutxline(struct _utmpx *U, const struct utmpx *utx)
-+{
-+ struct utmpx *ret;
-+
-+ TEST_UTMPX_T("_getutxline", U);
-+ UTMPX_LOCK(U);
-+ ret = __getutxline(U, utx);
-+ UTMPX_UNLOCK(U);
-+ return ret;
-+}
-+
-+
-+struct utmpx *
-+getutxline(const struct utmpx *utx)
+ pututxline(const struct utmpx *utx)
{
- struct utmpx temp, *u = NULL;
- int gotlock = 0;
-+ return _getutxline(&__utx__, utx);
-+}
-
-- _DIAGASSERT(utx != NULL);
++ struct utmpx *ux;
+
+ _DIAGASSERT(utx != NULL);
- if (utx == NULL)
-+struct utmpx *
-+_pututxline(struct _utmpx *U, const struct utmpx *utx)
-+{
-+ struct utmpx *ux;
-+
+ if (utx == NULL) {
+ errno = EINVAL;
return NULL;
@@ -391,67 +166,51 @@
- if (strcmp(_PATH_UTMPX, utfile) == 0)
- if ((fp != NULL && readonly) || (fp == NULL && geteuid() != 0))
- return utmp_update(utx);
-+ TEST_UTMPX_T("_pututxline", U);
-+ UTMPX_LOCK(U);
-+ if ((ux = __pututxline(&__utx__, utx)) != NULL && __utx__.utfile_system) {
++ if ((ux = _pututxline(utx)) != NULL && utfile_system) {
+ _utmpx_asl(ux); /* the equivalent of wtmpx and lastlogx */
+#ifdef UTMP_COMPAT
+ _write_utmp_compat(ux);
+#endif /* UTMP_COMPAT */
+ }
-+ UTMPX_UNLOCK(U);
+ return ux;
+}
-
-- (void)memcpy(&temp, utx, sizeof(temp));
-+struct utmpx *
-+pututxline(const struct utmpx *utx)
-+{
-+ return _pututxline(&__utx__, utx);
-+}
-+
+__private_extern__ struct utmpx *
-+__pututxline(struct _utmpx *U, const struct utmpx *utx)
++_pututxline(const struct utmpx *utx)
+{
+ struct utmpx temp, *u = NULL, *x;
+ const struct utmpx *ux;
+#ifdef __LP64__
+ struct utmpx32 ut32;
+#endif /* __LP64__ */
-+ struct flock fl;
-+#define gotlock (fl.l_start >= 0)
-+
-+ fl.l_start = -1; /* also means we haven't locked */
-+ if (U->utfile_system)
-+ if ((U->fp != NULL && U->readonly) || (U->fp == NULL && geteuid() != 0)) {
++ int gotlock = 0;
+
+- (void)memcpy(&temp, utx, sizeof(temp));
++ if (utfile_system)
++ if ((fp != NULL && readonly) || (fp == NULL && geteuid() != 0)) {
+ errno = EPERM;
+ return NULL;
+ }
-- if (fp == NULL) {
-- (void)getutxent();
+ if (fp == NULL) {
+ (void)getutxent();
- if (fp == NULL || readonly)
-+ if (U->fp == NULL) {
-+ (void)__getutxent(U);
-+ if (U->fp == NULL || U->readonly) {
++ if (fp == NULL || readonly) {
+ errno = EPERM;
return NULL;
+ }
}
- if (getutxid(&temp) == NULL) {
-- setutxent();
-- if (getutxid(&temp) == NULL) {
-- if (lockf(fileno(fp), F_LOCK, (off_t)0) == -1)
+ /* make a copy as needed, and auto-fill if requested */
+ ux = _utmpx_working_copy(utx, &temp, 0);
+ if (!ux)
+ return NULL;
+
-+ if ((x = __getutxid(U, ux)) == NULL) {
-+ __setutxent(U);
-+ if ((x = __getutxid(U, ux)) == NULL) {
++ if ((x = _getutxid(ux)) == NULL) {
+ setutxent();
+- if (getutxid(&temp) == NULL) {
++ if ((x = _getutxid(ux)) == NULL) {
+ /*
+ * utx->ut_type has any original mask bits, while
+ * ux->ut_type has those mask bits removed. If we
@@ -462,24 +221,12 @@
+ if (ux->ut_type == DEAD_PROCESS &&
+ (utx->ut_type & UTMPX_DEAD_IF_CORRESPONDING_MASK)) {
+ errno = EINVAL;
++ return NULL;
++ }
+ if (lockf(fileno(fp), F_LOCK, (off_t)0) == -1)
return NULL;
-- gotlock++;
-- if (fseeko(fp, (off_t)0, SEEK_END) == -1)
-+ }
-+ /*
-+ * Replace lockf() with fcntl() and a fixed start
-+ * value. We should already be at EOF.
-+ */
-+ if ((fl.l_start = lseek(fileno(U->fp), 0, SEEK_CUR)) < 0)
-+ return NULL;
-+ fl.l_len = 0;
-+ fl.l_whence = SEEK_SET;
-+ fl.l_type = F_WRLCK;
-+ if (fcntl(fileno(U->fp), F_SETLKW, &fl) == -1)
-+ return NULL;
-+ if (fseeko(U->fp, (off_t)0, SEEK_END) == -1)
- goto fail;
- }
+ gotlock++;
+@@ -258,99 +334,66 @@
}
if (!gotlock) {
@@ -497,11 +244,10 @@
+ return NULL;
+ }
/* we are not appending */
-- if (fseeko(fp, -(off_t)sizeof(ut), SEEK_CUR) == -1)
-+#ifdef __LP64__
-+ if (fseeko(U->fp, -(off_t)sizeof(ut32), SEEK_CUR) == -1)
-+#else /* __LP64__ */
-+ if (fseeko(U->fp, -(off_t)sizeof(U->ut), SEEK_CUR) == -1)
++#ifdef __LP64__
++ if (fseeko(fp, -(off_t)sizeof(ut32), SEEK_CUR) == -1)
++#else /* __LP64__ */
+ if (fseeko(fp, -(off_t)sizeof(ut), SEEK_CUR) == -1)
+#endif /* __LP64__ */
return NULL;
}
@@ -509,25 +255,22 @@
- if (fwrite(&temp, sizeof (temp), 1, fp) != 1)
+#ifdef __LP64__
+ _utmpx64_32(ux, &ut32);
-+ if (fwrite(&ut32, sizeof (ut32), 1, U->fp) != 1)
-+#else /* __LP64__ */
-+ if (fwrite(ux, sizeof (*ux), 1, U->fp) != 1)
++ if (fwrite(&ut32, sizeof (ut32), 1, fp) != 1)
++#else /* __LP64__ */
++ if (fwrite(ux, sizeof (*ux), 1, fp) != 1)
+#endif /* __LP64__ */
goto fail;
-- if (fflush(fp) == -1)
-+ if (fflush(U->fp) == -1)
+ if (fflush(fp) == -1)
goto fail;
- u = memcpy(&ut, &temp, sizeof(ut));
-+ u = memcpy(&U->ut, ux, sizeof(U->ut));
++ u = memcpy(&ut, ux, sizeof(ut));
+ notify_post(UTMPX_CHANGE_NOTIFICATION);
fail:
if (gotlock) {
-- if (lockf(fileno(fp), F_ULOCK, (off_t)0) == -1)
+ int save = errno;
-+ fl.l_type = F_UNLCK;
-+ if (fcntl(fileno(U->fp), F_SETLK, &fl) == -1)
+ if (lockf(fileno(fp), F_ULOCK, (off_t)0) == -1)
return NULL;
+ errno = save;
}
@@ -550,7 +293,7 @@
- case 0:
- (void)execl(_PATH_UTMP_UPDATE,
- strrchr(_PATH_UTMP_UPDATE, '/') + 1, buf, NULL);
-- _exit(1);
+- exit(1);
- /*NOTREACHED*/
- case -1:
- return NULL;
@@ -567,7 +310,7 @@
/*
* The following are extensions and not part of the X/Open spec.
*/
--int
+ int
-updwtmpx(const char *file, const struct utmpx *utx)
-{
- int fd;
@@ -602,65 +345,29 @@
-
-
-int
--utmpxname(const char *fname)
-+__private_extern__ int
-+__utmpxname(struct _utmpx *U, const char *fname)
+ utmpxname(const char *fname)
{
size_t len;
- _DIAGASSERT(fname != NULL);
+ if (fname == NULL) {
-+ if(!U->utfile_system)
-+ free(U->utfile);
-+ U->utfile = _PATH_UTMPX;
-+ U->utfile_system = 1;
-+ __endutxent(U);
++ strcpy(utfile, _PATH_UTMPX);
++ utfile_system = 1;
++ endutxent();
+ return 1;
+ }
len = strlen(fname);
-- if (len >= sizeof(utfile))
-+ if (len >= MAXPATHLEN)
- return 0;
-
- /* must end in x! */
- if (fname[len - 1] != 'x')
- return 0;
-
-- (void)strlcpy(utfile, fname, sizeof(utfile));
-- endutxent();
-+ if (U->utfile_system)
-+ U->utfile = NULL;
-+ U->utfile_system = 0;
-+ if ((U->utfile = reallocf(U->utfile, len + 1)) == NULL)
-+ return 0;
-+
-+ (void)strcpy(U->utfile, fname);
-+ __endutxent(U);
+@@ -363,6 +406,7 @@
+
+ (void)strlcpy(utfile, fname, sizeof(utfile));
+ endutxent();
++ utfile_system = 0;
return 1;
}
-+int
-+_utmpxname(struct _utmpx *U, const char *fname)
-+{
-+ int ret;
-+
-+ TEST_UTMPX_T("_utmpxname", U);
-+ UTMPX_LOCK(U);
-+ ret = __utmpxname(U, fname);
-+ UTMPX_UNLOCK(U);
-+ return ret;
-+}
-+
-+int
-+utmpxname(const char *fname)
-+{
-+ return _utmpxname(&__utx__, fname);
-+}
-
-+#ifdef UNIFDEF_LEGACY_UTMP_APIS
- void
+@@ -371,10 +415,8 @@
getutmp(const struct utmpx *ux, struct utmp *u)
{
@@ -673,7 +380,7 @@
(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;
-@@ -369,82 +563,16 @@ void
+@@ -384,109 +426,15 @@
getutmpx(const struct utmp *u, struct utmpx *ux)
{
@@ -699,8 +406,35 @@
- 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(const char *fname, uid_t uid, struct lastlogx *ll)
+-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;
@@ -747,7 +481,7 @@
- _DIAGASSERT(fname != NULL);
- _DIAGASSERT(ll != NULL);
-
-- db = dbopen(fname, O_RDWR|O_CREAT|O_EXLOCK, 0644, DB_HASH, NULL);
+- db = dbopen(fname, O_RDWR|O_CREAT|O_EXLOCK, 0, DB_HASH, NULL);
-
- if (db == NULL)
- return -1;
@@ -762,4 +496,3 @@
- (db->close)(db);
- return error;
}
-+#endif /* UNIFDEF_LEGACY_UTMP_APIS */