Re: [PATCHv2] query logind/elogind for number of users

"Thorsten Kukuk" <[email protected]> ("kukuk") Mon, 20 Mar 2023 13:58:12 +0100
Newsgroups gmane.linux.procps.devel
Message-ID <[email protected]>
Hi Craig,

on comment on this version of my patch? Does it address your concerns?

  Thorsten

On Thu, Mar 09, Thorsten Kukuk wrote:

> 
> Hi,
> 
> a new patch which uses utmp as fallback and prints '?' in error case.
> 
>   Thorsten
> 
> -- 
> Thorsten Kukuk, Distinguished Engineer, Senior Architect, Future Technologies
> SUSE Software Solutions Germany GmbH, Frankenstraße 146, 90461 Nuernberg, Germany
> Managing Director: Ivo Totev, Andrew Myers, Andrew McDonald, Martje Boudien Moerman
> (HRB 36809, AG Nürnberg)

> From 931e5736cb8ad356e247febb3385f04a1b1a6fe4 Mon Sep 17 00:00:00 2001
> From: Thorsten Kukuk <[email protected]>
> Date: Tue, 7 Mar 2023 10:30:50 +0100
> Subject: [PATCH 1/2] library: use sd_get_sessions() instead of utmp
> 
> The utmp format of glibc is not Y2038 safe, not even on 64bit systems.
> Query logind/elogind for the number of users if we use libsystemd.
> 
> Signed-off-by: Thorsten Kukuk <[email protected]>
> ---
>  library/uptime.c | 23 ++++++++++++++++++++---
>  1 file changed, 20 insertions(+), 3 deletions(-)
> 
> diff --git a/library/uptime.c b/library/uptime.c
> index 16f1b05d..bb9344a2 100644
> --- a/library/uptime.c
> +++ b/library/uptime.c
> @@ -31,6 +31,12 @@
>  #include <time.h>
>  #include <unistd.h>
>  #include <utmp.h>
> +#ifdef WITH_SYSTEMD
> +#include <systemd/sd-login.h>
> +#endif
> +#ifdef WITH_ELOGIND
> +#include <elogind/sd-login.h>
> +#endif
>  
>  #include "misc.h"
>  #include "procps-private.h"
> @@ -45,6 +51,13 @@ static int count_users(void)
>      int numuser = 0;
>      struct utmp *ut;
>  
> +#if defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)
> +    numuser = sd_get_sessions(NULL);
> +
> +    if (numuser >= 0 || numuser != ENOENT)
> +      return numuser;
> +#endif
> +
>      setutent();
>      while ((ut = getutent())) {
>      if ((ut->ut_type == USER_PROCESS) && (ut->ut_name[0] != '\0'))
> @@ -136,8 +149,13 @@ PROCPS_EXPORT char *procps_uptime_sprint(void)
>      users = count_users();
>      procps_loadavg(&av1, &av5, &av15);
>  
> -    pos += sprintf(upbuf + pos, "%2d %s,  load average: %.2f, %.2f, %.2f",
> -        users, users > 1 ? "users" : "user",
> +    if (users < 0)
> +      pos += sprintf(upbuf + pos, " ? ");
> +    else
> +      pos += sprintf(upbuf + pos, "%2d ", users);
> +
> +    pos += sprintf(upbuf + pos, "%s,  load average: %.2f, %.2f, %.2f",
> +        users > 1 ? "users" : "user",
>          av1, av5, av15);
>  
>      return upbuf;
> @@ -248,4 +266,3 @@ PROCPS_EXPORT char *procps_uptime_sprint_short(void)
>      }
>      return shortbuf;
>  }
> -
> -- 
> 2.39.2
> 


-- 
Thorsten Kukuk, Distinguished Engineer, Senior Architect, Future Technologies
SUSE Software Solutions Germany GmbH, Frankenstraße 146, 90461 Nuernberg, Germany
Managing Director: Ivo Totev, Andrew Myers, Andrew McDonald, Martje Boudien Moerman
(HRB 36809, AG Nürnberg)