[PATCH 2/5] login: Move gnu utmpx to default implementaion

Lukasz Majewski lukma@denx.de
Thu Oct 22 08:15:10 GMT 2020


Hi Adhemerval,

> 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

Nice that we would have the getutmp.c in one place.

Reviewed-by: Lukasz Majewski <lukma@denx.de>

> 
> 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);




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <https://sourceware.org/pipermail/libc-alpha/attachments/20201022/7dc9d4d8/attachment-0001.sig>


More information about the Libc-alpha mailing list