From 6ff9c31abc14f207265ab214370982ecb3bfe428 Mon Sep 17 00:00:00 2001
From: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Date: Wed, 25 Mar 2015 23:59:45 +0100
Subject: utmp: favour POSIX utmpx over SVID utmp

Note: _PATH_UTMPX == _PATH_UTMP and the utmp struct is identical to the
utmpx struct so this only changes the external API entrypoints and NOT
the underlying data source.

This saves about 500b (~1300b from previously ~1950) while at it.

Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
---
 libc/misc/utmp/Makefile.in          |   4 +-
 libc/misc/utmp/utent.c              | 121 +++++++++++++++++++++---------------
 libc/misc/utmp/utxent.c             | 108 --------------------------------
 libc/misc/utmp/wtent.c              |  50 ---------------
 libc/sysdeps/linux/sh/bits/atomic.h |  12 +++-
 5 files changed, 82 insertions(+), 213 deletions(-)
 delete mode 100644 libc/misc/utmp/utxent.c
 delete mode 100644 libc/misc/utmp/wtent.c

(limited to 'libc')

diff --git a/libc/misc/utmp/Makefile.in b/libc/misc/utmp/Makefile.in
index 715341c85..6c54ade96 100644
--- a/libc/misc/utmp/Makefile.in
+++ b/libc/misc/utmp/Makefile.in
@@ -8,9 +8,7 @@
 subdirs += libc/misc/utmp
 
 CSRC-y :=
-CSRC-$(if $(findstring y,$(UCLIBC_HAS_UTMP)$(UCLIBC_HAS_UTMPX)),y) += wtent.c
-CSRC-$(UCLIBC_HAS_UTMP) += utent.c
-CSRC-$(UCLIBC_HAS_UTMPX) += utxent.c
+CSRC-$(if $(findstring y,$(UCLIBC_HAS_UTMP)$(UCLIBC_HAS_UTMPX)),y) += utent.c
 
 MISC_UTMP_DIR := $(top_srcdir)libc/misc/utmp
 MISC_UTMP_OUT := $(top_builddir)libc/misc/utmp
diff --git a/libc/misc/utmp/utent.c b/libc/misc/utmp/utent.c
index a258cb46d..3671bb05c 100644
--- a/libc/misc/utmp/utent.c
+++ b/libc/misc/utmp/utent.c
@@ -19,7 +19,7 @@
 #include <paths.h>
 #include <errno.h>
 #include <string.h>
-#include <utmp.h>
+#include "internal/utmp.h"
 #include <not-cancel.h>
 #include <bits/uClibc_mutex.h>
 
@@ -27,17 +27,17 @@ __UCLIBC_MUTEX_STATIC(utmplock, PTHREAD_MUTEX_INITIALIZER);
 
 /* Some global crap */
 static int static_fd = -1;
-static struct utmp static_utmp;
-static const char default_file_name[] = _PATH_UTMP;
-static const char *static_ut_name = default_file_name;
+static struct UT static_utmp;
+static const char default_file[] = __DEFAULT_PATH_UTMP;
+static const char *current_file = default_file;
 
 /* This function must be called with the LOCK held */
-static void __setutent_unlocked(void)
+static void __set_unlocked(void)
 {
 	if (static_fd < 0) {
-		static_fd = open_not_cancel_2(static_ut_name, O_RDWR | O_CLOEXEC);
+		static_fd = open_not_cancel_2(current_file, O_RDWR | O_CLOEXEC);
 		if (static_fd < 0) {
-			static_fd = open_not_cancel_2(static_ut_name, O_RDONLY | O_CLOEXEC);
+			static_fd = open_not_cancel_2(current_file, O_RDONLY | O_CLOEXEC);
 			if (static_fd < 0) {
 				return; /* static_fd remains < 0 */
 			}
@@ -51,22 +51,23 @@ static void __setutent_unlocked(void)
 	lseek(static_fd, 0, SEEK_SET);
 }
 #if defined __UCLIBC_HAS_THREADS__
-void setutent(void)
+void set(void)
 {
 	__UCLIBC_MUTEX_LOCK(utmplock);
-	__setutent_unlocked();
+	__set_unlocked();
 	__UCLIBC_MUTEX_UNLOCK(utmplock);
 }
 #else
-strong_alias(__setutent_unlocked,setutent)
+strong_alias(__set_unlocked,set)
 #endif
-libc_hidden_def(setutent)
+/* not used in libc_hidden_def(set) */
+other(setutxent,setutent)
 
 /* This function must be called with the LOCK held */
-static struct utmp *__getutent_unlocked(void)
+static struct UT *__get_unlocked(void)
 {
 	if (static_fd < 0) {
-		__setutent_unlocked();
+		__set_unlocked();
 		if (static_fd < 0)
 			return NULL;
 	}
@@ -79,21 +80,22 @@ static struct utmp *__getutent_unlocked(void)
 	return NULL;
 }
 #if defined __UCLIBC_HAS_THREADS__
-struct utmp *getutent(void)
+struct UT *get(void)
 {
-	struct utmp *ret;
+	struct UT *ret;
 
 	__UCLIBC_MUTEX_LOCK(utmplock);
-	ret = __getutent_unlocked();
+	ret = __get_unlocked();
 	__UCLIBC_MUTEX_UNLOCK(utmplock);
 	return ret;
 }
 #else
-strong_alias(__getutent_unlocked,getutent)
+strong_alias(__get_unlocked,get)
 #endif
-libc_hidden_def(getutent)
+/* not used in libc_hidden_def(get) */
+other(getutxent,getutent)
 
-void endutent(void)
+void end(void)
 {
 	__UCLIBC_MUTEX_LOCK(utmplock);
 	if (static_fd >= 0)
@@ -101,12 +103,13 @@ void endutent(void)
 	static_fd = -1;
 	__UCLIBC_MUTEX_UNLOCK(utmplock);
 }
-libc_hidden_def(endutent)
+/* not used in libc_hidden_def(end) */
+other(endutxent,endutent)
 
 /* This function must be called with the LOCK held */
-static struct utmp *__getutid_unlocked(const struct utmp *utmp_entry)
+static struct UT *__getid_unlocked(const struct UT *utmp_entry)
 {
-	struct utmp *lutmp;
+	struct UT *lutmp;
 	unsigned type;
 
 	/* We use the fact that constants we are interested in are: */
@@ -114,7 +117,7 @@ static struct utmp *__getutid_unlocked(const struct utmp *utmp_entry)
 	type = utmp_entry->ut_type - 1;
 	type /= 4;
 
-	while ((lutmp = __getutent_unlocked()) != NULL) {
+	while ((lutmp = __get_unlocked()) != NULL) {
 		if (type == 0 && lutmp->ut_type == utmp_entry->ut_type)	{
 			/* one of RUN_LVL, BOOT_TIME, NEW_TIME, OLD_TIME */
 			return lutmp;
@@ -130,26 +133,27 @@ static struct utmp *__getutid_unlocked(const struct utmp *utmp_entry)
 	return NULL;
 }
 #if defined __UCLIBC_HAS_THREADS__
-struct utmp *getutid(const struct utmp *utmp_entry)
+struct UT *getid(const struct UT *utmp_entry)
 {
-	struct utmp *ret;
+	struct UT *ret;
 
 	__UCLIBC_MUTEX_LOCK(utmplock);
-	ret = __getutid_unlocked(utmp_entry);
+	ret = __getid_unlocked(utmp_entry);
 	__UCLIBC_MUTEX_UNLOCK(utmplock);
 	return ret;
 }
 #else
-strong_alias(__getutid_unlocked,getutid)
+strong_alias(__getid_unlocked,getid)
 #endif
-libc_hidden_def(getutid)
+/* not used in libc_hidden_def(getid) */
+other(getutxid,getutid)
 
-struct utmp *getutline(const struct utmp *utmp_entry)
+struct UT *getline(const struct UT *utmp_entry)
 {
-	struct utmp *lutmp;
+	struct UT *lutmp;
 
 	__UCLIBC_MUTEX_LOCK(utmplock);
-	while ((lutmp = __getutent_unlocked()) != NULL) {
+	while ((lutmp = __get_unlocked()) != NULL) {
 		if (lutmp->ut_type == USER_PROCESS || lutmp->ut_type == LOGIN_PROCESS) {
 			if (strncmp(lutmp->ut_line, utmp_entry->ut_line,
 						sizeof(lutmp->ut_line)) == 0) {
@@ -160,39 +164,41 @@ struct utmp *getutline(const struct utmp *utmp_entry)
 	__UCLIBC_MUTEX_UNLOCK(utmplock);
 	return lutmp;
 }
-libc_hidden_def(getutline)
+/* libc_hidden_def(getline) */
+other(getutxline,getutline)
 
-struct utmp *pututline(const struct utmp *utmp_entry)
+struct UT *putline(const struct UT *utmp_entry)
 {
 	__UCLIBC_MUTEX_LOCK(utmplock);
 	/* Ignore the return value.  That way, if they've already positioned
 	   the file pointer where they want it, everything will work out. */
-	lseek(static_fd, (off_t) - sizeof(struct utmp), SEEK_CUR);
+	lseek(static_fd, (off_t) - sizeof(struct UT), SEEK_CUR);
 
-	if (__getutid_unlocked(utmp_entry) != NULL)
-		lseek(static_fd, (off_t) - sizeof(struct utmp), SEEK_CUR);
+	if (__getid_unlocked(utmp_entry) != NULL)
+		lseek(static_fd, (off_t) - sizeof(struct UT), SEEK_CUR);
 	else
 		lseek(static_fd, (off_t) 0, SEEK_END);
-	if (write(static_fd, utmp_entry, sizeof(struct utmp))
-			!= sizeof(struct utmp))
+	if (write(static_fd, utmp_entry, sizeof(struct UT))
+			!= sizeof(struct UT))
 		utmp_entry = NULL;
 
 	__UCLIBC_MUTEX_UNLOCK(utmplock);
-	return (struct utmp *)utmp_entry;
+	return (struct UT *)utmp_entry;
 }
-libc_hidden_def(pututline)
+/* not used in libc_hidden_def(putline) */
+other(pututxline,pututline)
 
-int utmpname(const char *new_ut_name)
+int name(const char *new_file)
 {
 	__UCLIBC_MUTEX_LOCK(utmplock);
-	if (new_ut_name != NULL) {
-		if (static_ut_name != default_file_name)
-			free((char *)static_ut_name);
-		static_ut_name = strdup(new_ut_name);
-		if (static_ut_name == NULL) {
+	if (new_file != NULL) {
+		if (current_file != default_file)
+			free((char *)current_file);
+		current_file = strdup(new_file);
+		if (current_file == NULL) {
 			/* We should probably whine about out-of-memory
 			 * errors here...  Instead just reset to the default */
-			static_ut_name = default_file_name;
+			current_file = default_file;
 		}
 	}
 
@@ -201,6 +207,23 @@ int utmpname(const char *new_ut_name)
 		static_fd = -1;
 	}
 	__UCLIBC_MUTEX_UNLOCK(utmplock);
-	return 0; /* or maybe return -(static_ut_name != new_ut_name)? */
+	return 0; /* or maybe return -(current_file != new_file)? */
 }
-libc_hidden_def(utmpname)
+/* not used in libc_hidden_def(name) */
+other(utmpxname,utmpname)
+
+void updw(const char *wtmp_file, const struct UT *lutmp)
+{
+	int fd;
+
+	fd = open_not_cancel_2(wtmp_file, O_APPEND | O_WRONLY);
+	if (fd >= 0) {
+		if (lockf(fd, F_LOCK, 0) == 0) {
+			write_not_cancel(fd, lutmp, sizeof(struct UT));
+			lockf(fd, F_ULOCK, 0);
+			close_not_cancel_no_status(fd);
+		}
+	}
+}
+/* not used in libc_hidden_def(updw) */
+other(updwtmpx,updwtmp)
diff --git a/libc/misc/utmp/utxent.c b/libc/misc/utmp/utxent.c
deleted file mode 100644
index c32e4da49..000000000
--- a/libc/misc/utmp/utxent.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * utexent.c : Support for accessing user accounting database.
- * Copyright (C) 2010 STMicroelectronics Ltd.
- *
- * Author: Salvatore Cro <salvatore.cro@st.com>
- *
- * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
- *
- */
-
-#include <features.h>
-#include <string.h>
-#include <utmpx.h>
-#include <utmp.h>
-
-void setutxent(void)
-{
-	setutent ();
-}
-
-void endutxent(void)
-{
-	endutent ();
-}
-
-struct utmpx *getutxent(void)
-{
-	return (struct utmpx *) getutent ();
-}
-
-struct utmpx *getutxid(const struct utmpx *utmp_entry)
-{
-	return (struct utmpx *) getutid ((const struct utmp *) utmp_entry);
-}
-
-struct utmpx *getutxline(const struct utmpx *utmp_entry)
-{
-	return (struct utmpx *) getutline ((const struct utmp *) utmp_entry);
-}
-
-struct utmpx *pututxline (const struct utmpx *utmp_entry)
-{
-	return (struct utmpx *) pututline ((const struct utmp *) utmp_entry);
-}
-
-int utmpxname (const char *new_ut_name)
-{
-	return utmpname (new_ut_name);
-}
-
-void updwtmpx (const char *wtmpx_file, const struct utmpx *utmpx)
-{
-	updwtmp (wtmpx_file, (const struct utmp *) utmpx);
-}
-
-/* Copy the information in UTMPX to UTMP. */
-void getutmp (const struct utmpx *utmpx, struct utmp *utmp)
-{
-#if _HAVE_UT_TYPE - 0
-	utmp->ut_type = utmpx->ut_type;
-#endif
-#if _HAVE_UT_PID - 0
-	utmp->ut_pid = utmpx->ut_pid;
-#endif
-	memcpy (utmp->ut_line, utmpx->ut_line, sizeof (utmp->ut_line));
-	memcpy (utmp->ut_user, utmpx->ut_user, sizeof (utmp->ut_user));
-#if _HAVE_UT_ID - 0
-	memcpy (utmp->ut_id, utmpx->ut_id, sizeof (utmp->ut_id));
-#endif
-#if _HAVE_UT_HOST - 0
-	memcpy (utmp->ut_host, utmpx->ut_host, sizeof (utmp->ut_host));
-#endif
-#if _HAVE_UT_TV - 0
-	utmp->ut_tv.tv_sec = utmpx->ut_tv.tv_sec;
-	utmp->ut_tv.tv_usec = utmpx->ut_tv.tv_usec;
-#else
-	utmp->ut_time = utmpx->ut_time;
-#endif
-}
-
-/* Copy the information in UTMP to UTMPX. */
-void getutmpx (const struct utmp *utmp, struct utmpx *utmpx)
-{
-	memset (utmpx, 0, sizeof (struct utmpx));
-
-#if _HAVE_UT_TYPE - 0
-	utmpx->ut_type = utmp->ut_type;
-#endif
-#if _HAVE_UT_PID - 0
-	utmpx->ut_pid = utmp->ut_pid;
-#endif
-	memcpy (utmpx->ut_line, utmp->ut_line, sizeof (utmp->ut_line));
-	memcpy (utmpx->ut_user, utmp->ut_user, sizeof (utmp->ut_user));
-#if _HAVE_UT_ID - 0
-	memcpy (utmpx->ut_id, utmp->ut_id, sizeof (utmp->ut_id));
-#endif
-#if _HAVE_UT_HOST - 0
-	memcpy (utmpx->ut_host, utmp->ut_host, sizeof (utmp->ut_host));
-#endif
-#if _HAVE_UT_TV - 0
-	utmpx->ut_tv.tv_sec = utmp->ut_tv.tv_sec;
-	utmpx->ut_tv.tv_usec = utmp->ut_tv.tv_usec;
-#else
-	utmpx->ut_time = utmp->ut_time;
-#endif
-}
-
diff --git a/libc/misc/utmp/wtent.c b/libc/misc/utmp/wtent.c
deleted file mode 100644
index 30939ea43..000000000
--- a/libc/misc/utmp/wtent.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
- *
- * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
- */
-
-/* wtmp support rubbish (i.e. complete crap) */
-
-#include <string.h>
-#include <sys/time.h>
-#include <time.h>
-#include <unistd.h>
-#include <utmp.h>
-#include <fcntl.h>
-#include <sys/file.h>
-#include <not-cancel.h>
-
-#if 0
-/* This is enabled in uClibc/libutil/logwtmp.c */
-void logwtmp (const char *line, const char *name, const char *host)
-{
-    struct utmp lutmp;
-    memset(&lutmp, 0, sizeof(lutmp));
-
-    lutmp.ut_type = (name && *name) ? USER_PROCESS : DEAD_PROCESS;
-    lutmp.ut_pid = getpid();
-    strncpy(lutmp.ut_line, line, sizeof(lutmp.ut_line)-1);
-    strncpy(lutmp.ut_name, name, sizeof(lutmp.ut_name)-1);
-    strncpy(lutmp.ut_host, host, sizeof(lutmp.ut_host)-1);
-    gettimeofday(&(lutmp.ut_tv), NULL);
-
-    updwtmp(_PATH_WTMP, &lutmp);
-}
-#endif
-
-void updwtmp(const char *wtmp_file, const struct utmp *lutmp)
-{
-    int fd;
-
-    fd = open_not_cancel_2(wtmp_file, O_APPEND | O_WRONLY);
-    if (fd >= 0) {
-	if (lockf(fd, F_LOCK, 0) == 0) {
-	    write_not_cancel(fd, lutmp, sizeof(struct utmp));
-	    lockf(fd, F_ULOCK, 0);
-	    close_not_cancel_no_status(fd);
-	}
-    }
-}
-libc_hidden_def(updwtmp)
diff --git a/libc/sysdeps/linux/sh/bits/atomic.h b/libc/sysdeps/linux/sh/bits/atomic.h
index 745c85c1d..18ae9ea77 100644
--- a/libc/sysdeps/linux/sh/bits/atomic.h
+++ b/libc/sysdeps/linux/sh/bits/atomic.h
@@ -68,6 +68,12 @@ typedef uintmax_t uatomic_max_t;
       r1:     saved stack pointer
 */
 
+#if __GNUC_PREREQ (4, 7)
+# define rNOSP "u"
+#else
+# define rNOSP "r"
+#endif
+
 /* Avoid having lots of different versions of compare and exchange,
    by having this one complicated version. Parameters:
       bwl:     b, w or l for 8, 16 and 32 bit versions.
@@ -94,7 +100,7 @@ typedef uintmax_t uatomic_max_t;
         movt %0\n\
      .endif\n"					\
 	: "=&r" (__arch_result)			\
-	: "r" (mem), "r" (newval), "r" (oldval)	\
+	: rNOSP (mem), rNOSP (newval), rNOSP (oldval)	\
 	: "r0", "r1", "t", "memory");		\
      __arch_result; })
 
@@ -150,7 +156,7 @@ typedef uintmax_t uatomic_max_t;
 	mov." #bwl " %1,@%2\n\
      1: mov r1,r15"			\
 	: "=&r" (old), "=&r"(new)	\
-	: "r" (mem), "r" (value)	\
+	: rNOSP (mem), rNOSP (value)	\
 	: "r0", "r1", "memory");	\
     })
 
@@ -194,7 +200,7 @@ typedef uintmax_t uatomic_max_t;
 	mov." #bwl " %0,@%1\n\
      1: mov r1,r15"			\
 	: "=&r" (__new)			\
-	: "r" (mem), "r" (__value)	\
+	: rNOSP (mem), rNOSP (__value)	\
 	: "r0", "r1", "memory");	\
      __new;				\
   })
-- 
cgit v1.2.3