style fix, no code changes
[oweals/busybox.git] / procps / ps.c
index 2a53cc9749e5bfcb2591efb7a8a06af5790e0bb4..815c11578ae1ed6d4f3c16b56f6fd25ff841ae46 100644 (file)
@@ -17,7 +17,7 @@
 //config:config FEATURE_PS_WIDE
 //config:      bool "Enable wide output (-w)"
 //config:      default y
-//config:      depends on PS && !DESKTOP
+//config:      depends on (PS || MINIPS) && !DESKTOP
 //config:      help
 //config:      Support argument 'w' for wide output.
 //config:      If given once, 132 chars are printed, and if given more
@@ -26,7 +26,7 @@
 //config:config FEATURE_PS_LONG
 //config:      bool "Enable long output (-l)"
 //config:      default y
-//config:      depends on PS && !DESKTOP
+//config:      depends on (PS || MINIPS) && !DESKTOP
 //config:      help
 //config:      Support argument 'l' for long output.
 //config:      Adds fields PPID, RSS, START, TIME & TTY
 //config:config FEATURE_PS_TIME
 //config:      bool "Enable -o time and -o etime specifiers"
 //config:      default y
-//config:      depends on PS && DESKTOP
+//config:      depends on (PS || MINIPS) && DESKTOP
 //config:      select PLATFORM_LINUX
 //config:
-//config:config FEATURE_PS_ADDITIONAL_COLUMNS
-//config:      bool "Enable -o rgroup, -o ruser, -o nice specifiers"
-//config:      default y
-//config:      depends on PS && DESKTOP
-//config:
 //config:config FEATURE_PS_UNUSUAL_SYSTEMS
 //config:      bool "Support Linux prior to 2.4.0 and non-ELF systems"
 //config:      default n
 //config:      help
 //config:      Include support for measuring HZ on old kernels and non-ELF systems
 //config:      (if you are on Linux 2.4.0+ and use ELF, you don't need this)
+//config:
+//config:config FEATURE_PS_ADDITIONAL_COLUMNS
+//config:      bool "Enable -o rgroup, -o ruser, -o nice specifiers"
+//config:      default y
+//config:      depends on (PS || MINIPS) && DESKTOP
 
-//applet:IF_PS(APPLET_NOEXEC(ps, ps, BB_DIR_BIN, BB_SUID_DROP, ps))
+//                 APPLET_NOEXEC:name    main location    suid_type     help
+//applet:IF_PS(    APPLET_NOEXEC(ps,     ps,  BB_DIR_BIN, BB_SUID_DROP, ps))
+//applet:IF_MINIPS(APPLET_NOEXEC(minips, ps,  BB_DIR_BIN, BB_SUID_DROP, ps))
 
 //kbuild:lib-$(CONFIG_PS) += ps.o
+//kbuild:lib-$(CONFIG_MINIPS) += ps.o
 
 //usage:#if ENABLE_DESKTOP
 //usage:
@@ -308,28 +311,55 @@ static void func_nice(char *buf, int size, const procps_status_t *ps)
 #endif
 
 #if ENABLE_FEATURE_PS_TIME
+static void format_time(char *buf, int size, unsigned long tt)
+{
+       unsigned ff;
+
+       /* Used to show "14453:50" if tt is large. Ugly.
+        * procps-ng 3.3.10 uses "[[dd-]hh:]mm:ss" format.
+        * TODO: switch to that?
+        */
+
+       /* Formatting for 5-char TIME column.
+        * NB: "size" is not always 5: ELAPSED is wider (7),
+        * not taking advantage of that (yet?).
+        */
+       ff = tt % 60;
+       tt /= 60;
+       if (tt < 60) {
+               snprintf(buf, size+1, "%2u:%02u", (unsigned)tt, ff);
+               return;
+       }
+       ff = tt % 60;
+       tt /= 60;
+       if (tt < 24) {
+               snprintf(buf, size+1, "%2uh%02u", (unsigned)tt, ff);
+               return;
+       }
+       ff = tt % 24;
+       tt /= 24;
+       if (tt < 100) {
+               snprintf(buf, size+1, "%2ud%02u", (unsigned)tt, ff);
+               return;
+       }
+       snprintf(buf, size+1, "%4lud", tt);
+}
 static void func_etime(char *buf, int size, const procps_status_t *ps)
 {
        /* elapsed time [[dd-]hh:]mm:ss; here only mm:ss */
        unsigned long mm;
-       unsigned ss;
 
        mm = ps->start_time / get_kernel_HZ();
        mm = G.seconds_since_boot - mm;
-       ss = mm % 60;
-       mm /= 60;
-       snprintf(buf, size+1, "%3lu:%02u", mm, ss);
+       format_time(buf, size, mm);
 }
 static void func_time(char *buf, int size, const procps_status_t *ps)
 {
        /* cumulative time [[dd-]hh:]mm:ss; here only mm:ss */
        unsigned long mm;
-       unsigned ss;
 
        mm = (ps->utime + ps->stime) / get_kernel_HZ();
-       ss = mm % 60;
-       mm /= 60;
-       snprintf(buf, size+1, "%3lu:%02u", mm, ss);
+       format_time(buf, size, mm);
 }
 #endif
 
@@ -365,7 +395,7 @@ static const ps_out_t out_spec[] = {
 //     { 5                  , "pcpu"  ,"%CPU"   ,func_pcpu  ,PSSCAN_        },
 #endif
 #if ENABLE_FEATURE_PS_TIME
-       { 6                  , "time"  ,"TIME"   ,func_time  ,PSSCAN_STIME | PSSCAN_UTIME },
+       { 5                  , "time"  ,"TIME"   ,func_time  ,PSSCAN_STIME | PSSCAN_UTIME },
 #endif
        { 6                  , "tty"   ,"TT"     ,func_tty   ,PSSCAN_TTY     },
        { 4                  , "vsz"   ,"VSZ"    ,func_vsz   ,PSSCAN_VSZ     },
@@ -503,7 +533,7 @@ static void format_process(const procps_status_t *ps)
                len = out[i].width - len + 1;
                if (++i == out_cnt) /* do not pad last field */
                        break;
-               p += sprintf(p, "%*s", len, "");
+               p += sprintf(p, "%*s", len, " "); /* " ", not "", to ensure separation of fields */
        }
        printf("%.*s\n", terminal_width, buffer);
 }
@@ -537,9 +567,11 @@ int ps_main(int argc UNUSED_PARAM, char **argv)
        };
 
        INIT_G();
+#if ENABLE_FEATURE_PS_TIME
        G.seconds_since_boot = get_uptime();
-#if ENABLE_FEATURE_PS_TIME && (ENABLE_FEATURE_PS_UNUSUAL_SYSTEMS || !defined(__linux__))
+# if ENABLE_FEATURE_PS_UNUSUAL_SYSTEMS || !defined(__linux__)
        G.kernel_HZ = bb_clk_tck(); /* this is sysconf(_SC_CLK_TCK) */
+# endif
 #endif
 
        // POSIX: