Description: ps: Don't crash when using short option
 ps would crash with the -si or -sf options with systemd enabled.
 The issue was the utmp wasn't filled in, the long option checked, the
 short option did not. 
 .
 Refactored the showinfo() function so instead of a branch with duplicate
 prints for the items in both long and short we just branch on the items
 for long output.
 .
 Also, made the function prototypes not dependendent on systemd enabled,
 it was too messy that way and passing a char* NULL is not really going
 to hurt anything
Author: Craig Small <csmall@dropbear.xyz>
Origin: upstream, https://gitlab.com/procps-ng/procps/-/commit/79042e07fab9956135a21b1df7a69d1fbde7ef79
Bug: https://gitlab.com/procps-ng/procps/-/issues/301
Applied-Upstream: 4.0.5
Reviewed-by: Craig Small <csmall@debian.org>
Last-Update: 2025-04-13
---
This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
--- a/src/w.c
+++ b/src/w.c
@@ -207,9 +207,7 @@
 
 /* This routine prints either the hostname or the IP address of the remote */
 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) {
@@ -508,11 +506,10 @@
 #undef PIDS_GETSTR
 }
 
+
 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,
+            utmp_t * u, const int longform, int maxcmd, int from,
             const int userlen, const int fromlen, const int ip_addresses,
             const int pids)
 {
@@ -575,25 +572,20 @@
     /* force NUL term for printf */
     uname[UT_NAMESIZE] = '\0';
 
-    if (formtype) {
-        printf("%-*.*s%-9.8s", userlen + 1, userlen, uname, tty + 5);
+    printf("%-*.*s%-9.8s", userlen + 1, userlen, uname, tty + 5);
+    if (from)
+        print_from(session, NULL, ip_addresses, fromlen);
+
+    /* login time */
+    if (longform) {
 #if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
         if (session) {
             uint64_t ltime;
 
-            if (from)
-              print_from(session, NULL, ip_addresses, fromlen);
-
             sd_session_get_start_time(session, &ltime);
             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);
@@ -603,11 +595,16 @@
 #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
-            print_time_ival7(idletime(tty), 0, stdout);
+    }
+    /* idle */
+    if (u && *u->ut_line == ':')
+        /* idle unknown for xdm logins */
+        printf(" ?xdm? ");
+    else
+        print_time_ival7(idletime(tty), 0, stdout);
+
+    /* jpcpu/pcpu */
+    if (longform) {
         print_time_ival7(jcpu / hertz, (jcpu % hertz) * (100. / hertz),
                  stdout);
         if (pcpu > 0)
@@ -616,20 +613,8 @@
                              stdout);
         else
             printf("   ?   ");
-    } else {
-        printf("%-*.*s%-9.8s", userlen + 1, userlen, uname, tty + 5);
-        if (from)
-	    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
-            print_time_ival7(idletime(tty), 0, stdout);
     }
+    /* what */
     if (pids) {
         pid_t ut_pid = -1;
         if (u)
@@ -798,9 +783,9 @@
 		 * headers. Try to keep alignment intact.  */
 		printf(_("%-*s TTY      "), userlen, _("USER"));
 		if (from)
-			printf("%-*s", fromlen - 1, _("FROM"));
+			printf("%-*s", fromlen, _("FROM"));
 		if (longform)
-			printf(_("  LOGIN@   IDLE   JCPU   PCPU WHAT\n"));
+			printf(_(" LOGIN@   IDLE   JCPU   PCPU  WHAT\n"));
 		else
 			printf(_("   IDLE WHAT\n"));
 	}
@@ -857,9 +842,7 @@
 				continue;
 			if (!strncmp(u->ut_user, user, UT_NAMESIZE))
 				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, pids);
 		}
@@ -876,9 +859,7 @@
 				continue;
 			if (*u->ut_user)
 				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, pids);
 		}
