unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Adhemerval Zanella via Libc-alpha <libc-alpha@sourceware.org>
To: libc-alpha@sourceware.org
Cc: Alistair Francis <alistair.francis@wdc.com>
Subject: [PATCH 2/5] login: Move gnu utmpx to default implementaion
Date: Wed, 29 Jul 2020 17:51:14 -0300	[thread overview]
Message-ID: <20200729205117.2925113-2-adhemerval.zanella@linaro.org> (raw)
In-Reply-To: <20200729205117.2925113-1-adhemerval.zanella@linaro.org>

It removes one indirection where generic implementation assumes that
utmp and utmpx might differ and allows the optimize the symbol alias
where getutmp is the same as getumpx.

Checked on all afftected ABIs.
---
 {sysdeps/gnu/bits => bits}/struct_utmpx.h     |  0
 {sysdeps/gnu/bits => bits}/utmpx.h            |  0
 include/utmpx.h                               |  1 +
 login/getutmp.c                               | 34 ++++++++++++++++--
 login/getutmpx.c                              | 35 +------------------
 login/updwtmp.c                               | 11 +++++-
 {sysdeps/gnu => login}/utmpx.h                |  0
 sysdeps/gnu/getutmp.c                         | 34 ------------------
 sysdeps/gnu/getutmpx.c                        |  1 -
 sysdeps/gnu/updwtmp.c                         | 31 ----------------
 .../unix/sysv/linux/s390/s390-32/getutmp.c    | 21 ++++-------
 .../unix/sysv/linux/s390/s390-32/updwtmp.c    |  2 +-
 12 files changed, 52 insertions(+), 118 deletions(-)
 rename {sysdeps/gnu/bits => bits}/struct_utmpx.h (100%)
 rename {sysdeps/gnu/bits => bits}/utmpx.h (100%)
 create mode 100644 include/utmpx.h
 rename {sysdeps/gnu => login}/utmpx.h (100%)
 delete mode 100644 sysdeps/gnu/getutmp.c
 delete mode 100644 sysdeps/gnu/getutmpx.c
 delete mode 100644 sysdeps/gnu/updwtmp.c

diff --git a/sysdeps/gnu/bits/struct_utmpx.h b/bits/struct_utmpx.h
similarity index 100%
rename from sysdeps/gnu/bits/struct_utmpx.h
rename to bits/struct_utmpx.h
diff --git a/sysdeps/gnu/bits/utmpx.h b/bits/utmpx.h
similarity index 100%
rename from sysdeps/gnu/bits/utmpx.h
rename to bits/utmpx.h
diff --git a/include/utmpx.h b/include/utmpx.h
new file mode 100644
index 0000000000..cfe9b7c054
--- /dev/null
+++ b/include/utmpx.h
@@ -0,0 +1 @@
+#include <login/utmpx.h>
diff --git a/login/getutmp.c b/login/getutmp.c
index e9a5fe69a5..3058a93d1b 100644
--- a/login/getutmp.c
+++ b/login/getutmp.c
@@ -17,17 +17,47 @@
 
 #include <string.h>
 #include <utmp.h>
+#include <stddef.h>
+#define getutmpx __redirect_getutmpx
 #include <utmpx.h>
+#undef getutmpx
+
+#define CHECK_SIZE_AND_OFFSET(field) \
+  _Static_assert (sizeof ((struct utmp){0}.field)		\
+		  == sizeof ((struct utmpx){0}.field),		\
+		  "sizeof ((struct utmp){0}." #field " != "	\
+		  "sizeof ((struct utmpx){0}" #field);	\
+  _Static_assert (offsetof (struct utmp, field)			\
+		  == offsetof (struct utmpx, field),		\
+		  "offsetof (struct utmp, " #field ") != "	\
+		  "offsetof (struct utmpx, " #field ")");
+
+/* This ensure the getutmp to getutmpx alias is valid.  */
+_Static_assert (sizeof (struct utmp) == sizeof (struct utmpx),
+		"sizeof (struct utmp) != sizeof (struct utmpx)");
+CHECK_SIZE_AND_OFFSET (ut_type)
+CHECK_SIZE_AND_OFFSET (ut_pid)
+CHECK_SIZE_AND_OFFSET (ut_line)
+CHECK_SIZE_AND_OFFSET (ut_user)
+CHECK_SIZE_AND_OFFSET (ut_id)
+CHECK_SIZE_AND_OFFSET (ut_host)
+CHECK_SIZE_AND_OFFSET (ut_tv)
+
 
 /* Copy the information in UTMPX to UTMP. */
 void
-getutmp (const struct utmpx *utmpx, struct utmp *utmp)
+__getutmp (const struct utmpx *utmpx, struct utmp *utmp)
 {
+  memset (utmp, 0, sizeof (struct utmpx));
   utmp->ut_type = utmpx->ut_type;
   utmp->ut_pid = utmpx->ut_pid;
   memcpy (utmp->ut_line, utmpx->ut_line, sizeof (utmp->ut_line));
   memcpy (utmp->ut_user, utmpx->ut_user, sizeof (utmp->ut_user));
   memcpy (utmp->ut_id, utmpx->ut_id, sizeof (utmp->ut_id));
   memcpy (utmp->ut_host, utmpx->ut_host, sizeof (utmp->ut_host));
-  utmp->ut_tv = utmpx->ut_tv;
+  utmp->ut_tv.tv_sec = utmpx->ut_tv.tv_sec;
+  utmp->ut_tv.tv_usec = utmpx->ut_tv.tv_usec;
 }
+
+weak_alias (__getutmp, getutmp)
+strong_alias (__getutmp, getutmpx)
diff --git a/login/getutmpx.c b/login/getutmpx.c
index 250a355235..839eb6826e 100644
--- a/login/getutmpx.c
+++ b/login/getutmpx.c
@@ -1,34 +1 @@
-/* Copyright (C) 1999-2020 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <string.h>
-#include <utmp.h>
-#include <utmpx.h>
-
-/* Copy the information in UTMP to UTMPX. */
-void
-getutmpx (const struct utmp *utmp, struct utmpx *utmpx)
-{
-  memset (utmpx, 0, sizeof (struct utmpx));
-  utmpx->ut_type = utmp->ut_type;
-  utmpx->ut_pid = utmp->ut_pid;
-  memcpy (utmpx->ut_line, utmp->ut_line, sizeof (utmp->ut_line));
-  memcpy (utmpx->ut_user, utmp->ut_user, sizeof (utmp->ut_user));
-  memcpy (utmpx->ut_id, utmp->ut_id, sizeof (utmp->ut_id));
-  memcpy (utmpx->ut_host, utmp->ut_host, sizeof (utmp->ut_host));
-  utmpx->ut_tv = utmp->ut_tv;
-}
+/* Implemented by getutmp.c. */
diff --git a/login/updwtmp.c b/login/updwtmp.c
index f6cd515ac4..489c28b553 100644
--- a/login/updwtmp.c
+++ b/login/updwtmp.c
@@ -17,11 +17,20 @@
    <https://www.gnu.org/licenses/>.  */
 
 #include <utmp.h>
+#include <string.h>
+#include <unistd.h>
 
 #include "utmp-private.h"
 
 #ifndef TRANSFORM_UTMP_FILE_NAME
-# define TRANSFORM_UTMP_FILE_NAME(file_name) (file_name)
+# define TRANSFORM_UTMP_FILE_NAME(file_name)	\
+  ((strcmp (file_name, _PATH_UTMP "x") == 0	\
+    && __access (_PATH_UTMP "x", F_OK) != 0)	\
+   ? _PATH_UTMP					\
+   : ((strcmp (file_name, _PATH_WTMP "x") == 0	\
+       && __access (_PATH_WTMP "x", F_OK) != 0)	\
+      ? _PATH_WTMP				\
+      : file_name))
 #endif
 
 void
diff --git a/sysdeps/gnu/utmpx.h b/login/utmpx.h
similarity index 100%
rename from sysdeps/gnu/utmpx.h
rename to login/utmpx.h
diff --git a/sysdeps/gnu/getutmp.c b/sysdeps/gnu/getutmp.c
deleted file mode 100644
index 95a9a4b354..0000000000
--- a/sysdeps/gnu/getutmp.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Copyright (C) 1999-2020 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <assert.h>
-#include <string.h>
-#include <utmp.h>
-#ifndef _UTMPX_H
-/* This is an ugly hack but we must not see the getutmpx declaration.  */
-# define getutmpx XXXgetutmpx
-# include <utmpx.h>
-# undef getutmpx
-#endif
-
-void
-getutmp (const struct utmpx *utmpx, struct utmp *utmp)
-{
-  assert (sizeof (struct utmp) == sizeof (struct utmpx));
-  memcpy (utmp, utmpx, sizeof (struct utmp));
-}
-strong_alias (getutmp, getutmpx)
diff --git a/sysdeps/gnu/getutmpx.c b/sysdeps/gnu/getutmpx.c
deleted file mode 100644
index f393734a63..0000000000
--- a/sysdeps/gnu/getutmpx.c
+++ /dev/null
@@ -1 +0,0 @@
-/* We don't need a separate version.  it is the same as getutmp().  */
diff --git a/sysdeps/gnu/updwtmp.c b/sysdeps/gnu/updwtmp.c
deleted file mode 100644
index 044091b77c..0000000000
--- a/sysdeps/gnu/updwtmp.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Copyright (C) 1998-2020 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 1998.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <string.h>
-#include <unistd.h>
-
-#define TRANSFORM_UTMP_FILE_NAME(file_name)	\
-  ((strcmp (file_name, _PATH_UTMP "x") == 0	\
-    && __access (_PATH_UTMP "x", F_OK) != 0)	\
-   ? _PATH_UTMP					\
-   : ((strcmp (file_name, _PATH_WTMP "x") == 0	\
-       && __access (_PATH_WTMP "x", F_OK) != 0)	\
-      ? _PATH_WTMP				\
-      : file_name))
-
-#include <login/updwtmp.c>
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/getutmp.c b/sysdeps/unix/sysv/linux/s390/s390-32/getutmp.c
index 6380ae2a82..50ce8c4f5c 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/getutmp.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/getutmp.c
@@ -16,22 +16,15 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <string.h>
-#include <utmp.h>
-/* This is an ugly hack but we must not see the getutmpx declaration.  */
-#define getutmpx XXXgetutmpx
-#include <utmpx.h>
-#undef getutmpx
+#undef weak_alias
+#define weak_alias(a, b)
+#undef strong_alias
+#define strong_alias(a, b)
 
-#include "utmp-compat.h"
+#include <login/getutmp.c>
 
-#undef weak_alias
-#define weak_alias(n,a)
-#define getutmp __getutmp
-#define getutmpx __getutmpx
-#include "sysdeps/gnu/getutmp.c"
-#undef getutmp
-#undef getutmpx
+#include "utmp-compat.h"
 
 default_symbol_version (__getutmp, getutmp, UTMP_COMPAT_BASE);
+_strong_alias (__getutmp, __getutmpx)
 default_symbol_version (__getutmpx, getutmpx, UTMP_COMPAT_BASE);
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/updwtmp.c b/sysdeps/unix/sysv/linux/s390/s390-32/updwtmp.c
index dcd334e5a9..2079571cc1 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/updwtmp.c
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/updwtmp.c
@@ -25,7 +25,7 @@
 # undef weak_alias
 # define weak_alias(n,a)
 #endif
-#include "sysdeps/gnu/updwtmp.c"
+#include <login/updwtmp.c>
 
 #if defined SHARED
 default_symbol_version (__updwtmp, updwtmp, UTMP_COMPAT_BASE);
-- 
2.25.1


  reply	other threads:[~2020-07-29 20:51 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-29 20:51 [PATCH 1/5] login: Consolidate utmp and utmpx headers Adhemerval Zanella via Libc-alpha
2020-07-29 20:51 ` Adhemerval Zanella via Libc-alpha [this message]
2020-10-22  8:15   ` [PATCH 2/5] login: Move gnu utmpx to default implementaion Lukasz Majewski
2020-10-22  9:16   ` Andreas Schwab
2020-07-29 20:51 ` [PATCH 3/5] login: Add 64-bit time support Adhemerval Zanella via Libc-alpha
2020-07-29 21:17   ` Joseph Myers
2020-07-30 12:34     ` Adhemerval Zanella via Libc-alpha
2020-08-02 19:02       ` Maciej W. Rozycki via Libc-alpha
2020-08-02 22:05         ` Adhemerval Zanella via Libc-alpha
2020-10-22  9:16   ` Lukasz Majewski
2020-07-29 20:51 ` [PATCH 4/5] login: User 64-bit time on struct lastlog Adhemerval Zanella via Libc-alpha
2020-07-29 21:04   ` Andreas Schwab
2020-07-29 21:14   ` Andreas Schwab
2020-07-30 12:39     ` Adhemerval Zanella via Libc-alpha
2020-07-30 16:19       ` Florian Weimer via Libc-alpha
2020-07-30 18:54         ` Joseph Myers
2020-07-30 21:53           ` Adhemerval Zanella via Libc-alpha
2020-07-31  0:31             ` Joseph Myers
2020-07-30 21:46         ` Adhemerval Zanella via Libc-alpha
2020-10-22  9:25   ` Lukasz Majewski
2020-07-29 20:51 ` [PATCH 5/5] Remove __WORDSIZE_TIME64_COMPAT32 Adhemerval Zanella via Libc-alpha
2020-10-22  9:31   ` Lukasz Majewski
2020-07-29 21:08 ` [PATCH 1/5] login: Consolidate utmp and utmpx headers Joseph Myers
2020-07-30 12:36   ` Adhemerval Zanella via Libc-alpha
2020-10-22  8:06 ` Lukasz Majewski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/libc/involved.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200729205117.2925113-2-adhemerval.zanella@linaro.org \
    --to=libc-alpha@sourceware.org \
    --cc=adhemerval.zanella@linaro.org \
    --cc=alistair.francis@wdc.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).