Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package procps for openSUSE:Factory checked in at 2023-08-21 11:42:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/procps (Old) and /work/SRC/openSUSE:Factory/.procps.new.1766 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "procps" Mon Aug 21 11:42:53 2023 rev:133 rq:1104653 version:3.3.17 Changes: -------- --- /work/SRC/openSUSE:Factory/procps/procps.changes 2023-08-16 14:16:52.250882820 +0200 +++ /work/SRC/openSUSE:Factory/.procps.new.1766/procps.changes 2023-08-21 11:43:00.183392417 +0200 @@ -1,0 +2,14 @@ +Fri Aug 18 09:08:36 UTC 2023 - Dr. Werner Fink <wer...@suse.de> + +- Modify patches + * procps-ng-3.3.9-w-notruncate.diff + * procps-ng-3.3.17-logind.patch + to real to not truncate output of w with option -n + +------------------------------------------------------------------- +Wed Aug 16 13:50:25 UTC 2023 - Thorsten Kukuk <ku...@suse.com> + +- procps-ng-3.3.17-logind.patch: Backport from 4.x git, prefer + logind over utmp (jsc#PED-3144) + +------------------------------------------------------------------- New: ---- procps-ng-3.3.17-logind.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ procps.spec ++++++ --- /var/tmp/diff_new_pack.hzxYMp/_old 2023-08-21 11:43:05.743403070 +0200 +++ /var/tmp/diff_new_pack.hzxYMp/_new 2023-08-21 11:43:05.783403146 +0200 @@ -69,6 +69,7 @@ # PATCH-BACKPORT-FROM-UPSTREAM -- bsc#1181475: 'free' command reports misleading "used" value Patch42: procps-3.3.17-library-bsc1181475.patch Patch43: procps-3.3.17-top-bsc1181475.patch +Patch44: procps-ng-3.3.17-logind.patch BuildRequires: automake BuildRequires: dejagnu BuildRequires: diffutils @@ -154,6 +155,7 @@ %patch36 -p0 %patch42 %patch43 +%patch44 -p1 %build test -s .tarball-version || echo %{version} > .tarball-version ++++++ procps-ng-3.3.17-logind.patch ++++++ --- configure.ac | 7 + proc/whattime.c | 18 ++++ w.c | 206 ++++++++++++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 203 insertions(+), 28 deletions(-) --- a/configure.ac +++ b/configure.ac 2023-08-17 08:13:43.400631603 +0000 @@ -214,6 +214,13 @@ AC_ARG_WITH([systemd], AS_IF([test "x$with_systemd" != "xno"], [ PKG_CHECK_MODULES([SYSTEMD], [libsystemd]) AC_DEFINE(WITH_SYSTEMD, 1, [enable systemd support]) + + # The functions needed to replace utmp with logind are only available + # with systemd v254 or later. + old_LIBS="$LIBS" + LIBS="$LIBS $SYSTEMD_LIBS" + AC_CHECK_FUNCS([sd_session_get_leader]) + LIBS="$old_LIBS" ]) AM_CONDITIONAL([WITH_SYSTEMD], [test x$with_systemd != xno]) --- a/w.c +++ b/w.c 2023-08-18 09:05:49.745019308 +0000 @@ -56,11 +56,22 @@ #include <time.h> #include <unistd.h> #ifdef HAVE_UTMPX_H -# include <utmpx.h> +#include <utmpx.h> +#ifndef HAVE_UT_HOSTSIZE_IN_UTMPX +#include <utmp.h> +#endif #else # include <utmp.h> #endif #include <arpa/inet.h> +#ifdef WITH_SYSTEMD +# include <systemd/sd-login.h> +# include <systemd/sd-daemon.h> +#endif +#ifdef WITH_ELOGIND +# include <elogind/sd-login.h> +# include <elogind/sd-daemon.h> +#endif static int ignoreuser = 0; /* for '-u' */ static int oldstyle = 0; /* for '-o' */ @@ -72,12 +83,6 @@ typedef struct utmpx utmp_t; typedef struct utmp utmp_t; #endif -#if !defined(UT_HOSTSIZE) || defined(__UT_HOSTSIZE) -# define UT_HOSTSIZE __UT_HOSTSIZE -# define UT_LINESIZE __UT_LINESIZE -# define UT_NAMESIZE __UT_NAMESIZE -#endif - #ifdef W_SHOWFROM # define FROM_STRING "on" #else @@ -198,7 +203,25 @@ static void print_display_or_interface(c /* This routine prints either the hostname or the IP address of the remote */ -static void print_from(const utmp_t *restrict const u, const int ip_addresses, const int fromlen) { +static void print_from( +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + const char *session, +#endif + const utmp_t *restrict const u, const int ip_addresses, const int fromlen) { +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + if (session) { + char *host = NULL; + int r; + + r = sd_session_get_remote_host(session, &host); + if (r < 0 || host == NULL) + print_host("", 0, fromlen); + else { + print_host(host, strlen(host), fromlen == 0?strlen(host):fromlen); + free(host); + } + } else { +#endif char buf[fromlen + 1]; char buf_ipv6[INET6_ADDRSTRLEN]; int len; @@ -243,6 +266,9 @@ static void print_from(const utmp_t *res #else print_host(u->ut_host, UT_HOSTSIZE, fromlen); #endif +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + } +#endif } @@ -341,7 +367,11 @@ error: * the user for that login session is doing currently. This the * essential core of 'w'. */ -static const proc_t *getproc(const utmp_t * restrict const u, +static const proc_t *getproc( +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + const char *session, +#endif + const utmp_t * restrict const u, const char *restrict const tty, unsigned long long *restrict const jcpu, int *restrict const found_utpid) @@ -351,9 +381,16 @@ static const proc_t *getproc(const utmp_ const proc_t *best = NULL; const proc_t *secondbest = NULL; unsigned uid = ~0U; + pid_t ut_pid = -1; *found_utpid = 0; if (!ignoreuser) { +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + if (session) { + if (sd_session_get_uid(session, &uid) < 0) + return 0; + } else { +#endif char buf[UT_NAMESIZE + 1]; /* pointer to static data */ struct passwd *passwd_data; @@ -364,12 +401,21 @@ static const proc_t *getproc(const utmp_ return NULL; uid = passwd_data->pw_uid; /* OK to have passwd_data go out of scope here */ +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + } +#endif } line = tty_to_dev(tty); *jcpu = 0; + if (u) + ut_pid = u->ut_pid; +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + else + sd_session_get_leader(session, &ut_pid); +#endif for (; *pptr; pptr++) { - const proc_t *restrict const tmp = *pptr; - if (unlikely(tmp->tgid == u->ut_pid)) { + const proc_t *restrict const tmp = *pptr; + if (unlikely(tmp->tgid == ut_pid)) { *found_utpid = 1; if (!best) best = tmp; @@ -393,7 +439,11 @@ static const proc_t *getproc(const utmp_ return best ? best : secondbest; } -static void showinfo(utmp_t * u, int formtype, int maxcmd, int from, +static void showinfo( +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + const char *session, const char *name, +#endif + utmp_t * u, int formtype, int maxcmd, int from, int userlen, int fromlen, const int ip_addresses) { unsigned long long jcpu; @@ -402,14 +452,36 @@ static void showinfo(utmp_t * u, int for char uname[UT_NAMESIZE + 1] = "", tty[5 + UT_LINESIZE + 1] = "/dev/"; const proc_t *best; +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + if (session) { + char *sd_tty; + + if (sd_session_get_tty(session, &sd_tty) >= 0) { + for (i = 0; i < strlen (sd_tty); i++) + /* clean up tty if garbled */ + if (isalnum(sd_tty[i]) || (sd_tty[i] == '/')) + tty[i + 5] = sd_tty[i]; + else + tty[i + 5] = '\0'; + free(sd_tty); + } + } else { +#endif for (i = 0; i < UT_LINESIZE; i++) /* clean up tty if garbled */ if (isalnum(u->ut_line[i]) || (u->ut_line[i] == '/')) tty[i + 5] = u->ut_line[i]; else tty[i + 5] = '\0'; +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + } +#endif - best = getproc(u, tty + 5, &jcpu, &ut_pid_found); + best = getproc( +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + session, +#endif + u, tty + 5, &jcpu, &ut_pid_found); /* * just skip if stale utmp entry (i.e. login proc doesn't @@ -420,26 +492,56 @@ static void showinfo(utmp_t * u, int for if (!ut_pid_found) return; +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + if (name) + strncpy(uname, name, UT_NAMESIZE); + else +#endif + strncpy(uname, u->ut_user, UT_NAMESIZE); /* force NUL term for printf */ - strncpy(uname, u->ut_user, UT_NAMESIZE); + uname[UT_NAMESIZE] = '\0'; if (formtype) { - int utlnlen = 8; - if (formtype > 1) { - userlen = strnlen(uname, UT_NAMESIZE); - fromlen = strnlen(u->ut_host, UT_HOSTSIZE); - utlnlen = strnlen(u->ut_line, UT_LINESIZE); - maxcmd = MAX_CMD_WIDTH; + int utlnlen = 8; + if (formtype > 1) { + userlen = strnlen(uname, UT_NAMESIZE); + if (u) { + fromlen = strnlen(u->ut_host, UT_HOSTSIZE); + utlnlen = strnlen(u->ut_line, UT_LINESIZE); + } else { + fromlen = 0; + utlnlen = strlen (tty+5); } - printf("%-*.*s%-*.*s", userlen + 1, userlen, uname, utlnlen + 1, utlnlen, u->ut_line); + maxcmd = MAX_CMD_WIDTH; + } + printf("%-*.*s%-*.*s", userlen + 1, userlen, uname, utlnlen + 1, utlnlen, tty+5); +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + if (session) { + uint64_t ltime; + if (from) - print_from(u, ip_addresses, fromlen); + print_from(session, NULL, ip_addresses, fromlen); + + sd_session_get_start_time(session, <ime); + print_logintime(ltime/((uint64_t) 1000000ULL), stdout); + } else { +#endif + if (from) + print_from( +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + NULL, +#endif + u, ip_addresses, fromlen); + #ifdef HAVE_UTMPX_H print_logintime(u->ut_tv.tv_sec, stdout); #else print_logintime(u->ut_time, stdout); #endif - if (*u->ut_line == ':') +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + } +#endif + if (u && *u->ut_line == ':') /* idle unknown for xdm logins */ printf(" ?xdm? "); else @@ -457,8 +559,12 @@ static void showinfo(utmp_t * u, int for printf("%-*.*s%-9.8s", userlen + 1, userlen, u->ut_user, u->ut_line); if (from) - print_from(u, ip_addresses, fromlen); - if (*u->ut_line == ':') + print_from( +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + NULL, +#endif + u, ip_addresses, fromlen); + if (u && *u->ut_line == ':') /* idle unknown for xdm logins */ printf(" ?xdm? "); else @@ -635,7 +741,40 @@ int main(int argc, char **argv) else printf(_(" IDLE WHAT\n")); } - +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + if (sd_booted() > 0) { + char **sessions_list; + int sessions; + int i; + + sessions = sd_get_sessions (&sessions_list); + if (sessions < 0 && sessions != -ENOENT) + error(EXIT_FAILURE, -sessions, _("error getting sessions")); + + if (sessions >= 0) { + for (int i = 0; i < sessions; i++) { + char *name; + int r; + + if ((r = sd_session_get_username(sessions_list[i], &name)) < 0) + error(EXIT_FAILURE, -r, _("get user name failed")); + + if (user) { + if (!strcmp(name, user)) + showinfo(sessions_list[i], name, NULL, longform, + maxcmd, from, userlen, fromlen, + ip_addresses); + } else { + showinfo(sessions_list[i], name, NULL, longform, maxcmd, + from, userlen, fromlen, ip_addresses); + } + free(name); + free(sessions_list[i]); + } + free(sessions_list); + } + } else { +#endif #ifdef HAVE_UTMPX_H setutxent(); #else @@ -654,7 +793,11 @@ int main(int argc, char **argv) if (u->ut_type != USER_PROCESS) continue; if (!strncmp(u->ut_user, user, UT_NAMESIZE)) - showinfo(u, longform, maxcmd, from, userlen, + showinfo( +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + NULL, NULL, +#endif + u, longform, maxcmd, from, userlen, fromlen, ip_addresses); } } else { @@ -669,7 +812,11 @@ int main(int argc, char **argv) if (u->ut_type != USER_PROCESS) continue; if (*u->ut_user) - showinfo(u, longform, maxcmd, from, userlen, + showinfo( +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + NULL, NULL, +#endif + u, longform, maxcmd, from, userlen, fromlen, ip_addresses); } } @@ -678,6 +825,9 @@ int main(int argc, char **argv) #else endutent(); #endif +#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER) + } +#endif return EXIT_SUCCESS; } --- a/proc/whattime.c +++ b/proc/whattime.c 2023-08-17 08:13:43.400631603 +0000 @@ -38,6 +38,15 @@ #include "whattime.h" #include "sysinfo.h" +#ifdef WITH_SYSTEMD +#include <systemd/sd-daemon.h> +#include <systemd/sd-login.h> +#endif +#ifdef WITH_ELOGIND +#include <elogind/sd-daemon.h> +#include <elogind/sd-login.h> +#endif + static char buf[256]; static double av[3]; @@ -98,6 +107,11 @@ char *sprint_uptime(int human_readable) /* count the number of users */ numuser = 0; +#if defined(WITH_SYSTEMD) || defined(WITH_ELOGIND) + if (sd_booted() > 0) + numuser = sd_get_sessions(NULL); + else { +#endif setutent(); while ((utmpstruct = getutent())) { if ((utmpstruct->ut_type == USER_PROCESS) && @@ -105,6 +119,10 @@ char *sprint_uptime(int human_readable) numuser++; } endutent(); +#if defined(WITH_SYSTEMD) || defined(WITH_ELOGIND) + } +#endif + pos += sprintf(buf + pos, "%2d user%s, ", numuser, numuser == 1 ? "" : "s"); ++++++ procps-ng-3.3.9-w-notruncate.diff ++++++ --- /var/tmp/diff_new_pack.hzxYMp/_old 2023-08-21 11:43:05.923403415 +0200 +++ /var/tmp/diff_new_pack.hzxYMp/_new 2023-08-21 11:43:05.931403430 +0200 @@ -1,10 +1,10 @@ --- w.1 | 3 +++ - w.c | 18 +++++++++++++++--- - 2 files changed, 18 insertions(+), 3 deletions(-) + w.c | 19 ++++++++++++++++--- + 2 files changed, 19 insertions(+), 3 deletions(-) --- w.1 -+++ w.1 2021-02-10 09:47:10.894888530 +0000 ++++ w.1 2023-08-18 08:21:51.764340794 +0000 @@ -40,6 +40,9 @@ and a \fB\-s\fR, \fB\-\-short\fR Use the short format. Don't print the login time, JCPU or PCPU times. @@ -16,7 +16,7 @@ Toggle printing the .B from --- w.c -+++ w.c 2021-02-10 09:51:09.750284453 +0000 ++++ w.c 2023-08-18 08:37:32.143482035 +0000 @@ -394,7 +394,7 @@ static const proc_t *getproc(const utmp_ } @@ -26,7 +26,7 @@ { unsigned long long jcpu; int ut_pid_found; -@@ -424,7 +424,13 @@ static void showinfo(utmp_t * u, int for +@@ -424,7 +424,14 @@ static void showinfo(utmp_t * u, int for strncpy(uname, u->ut_user, UT_NAMESIZE); if (formtype) { @@ -36,12 +36,13 @@ + userlen = strnlen(uname, UT_NAMESIZE); + fromlen = strnlen(u->ut_host, UT_HOSTSIZE); + utlnlen = strnlen(u->ut_line, UT_LINESIZE); ++ maxcmd = MAX_CMD_WIDTH; + } + printf("%-*.*s%-*.*s", userlen + 1, userlen, uname, utlnlen + 1, utlnlen, u->ut_line); if (from) print_from(u, ip_addresses, fromlen); #ifdef HAVE_UTMPX_H -@@ -478,6 +484,7 @@ static void __attribute__ ((__noreturn__ +@@ -478,6 +485,7 @@ static void __attribute__ ((__noreturn__ fputs(_(" -h, --no-header do not print header\n"),out); fputs(_(" -u, --no-current ignore current process username\n"),out); fputs(_(" -s, --short short format\n"),out); @@ -49,7 +50,7 @@ fputs(_(" -f, --from show remote hostname field\n"),out); fputs(_(" -o, --old-style old style output\n"),out); fputs(_(" -i, --ip-addr display IP address instead of hostname (if possible)\n"), out); -@@ -514,6 +521,7 @@ int main(int argc, char **argv) +@@ -514,6 +522,7 @@ int main(int argc, char **argv) {"no-header", no_argument, NULL, 'h'}, {"no-current", no_argument, NULL, 'u'}, {"short", no_argument, NULL, 's'}, @@ -57,7 +58,7 @@ {"from", no_argument, NULL, 'f'}, {"old-style", no_argument, NULL, 'o'}, {"ip-addr", no_argument, NULL, 'i'}, -@@ -535,7 +543,7 @@ int main(int argc, char **argv) +@@ -535,7 +544,7 @@ int main(int argc, char **argv) #endif while ((ch = @@ -66,7 +67,7 @@ switch (ch) { case 'h': header = 0; -@@ -546,6 +554,10 @@ int main(int argc, char **argv) +@@ -546,6 +555,10 @@ int main(int argc, char **argv) case 's': longform = 0; break;