ps: use separate get_uptime() and make it work on non-linux too
authorMichael Tokarev <mjt@tls.msk.ru>
Wed, 13 Jun 2012 00:51:56 +0000 (02:51 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 13 Jun 2012 00:52:28 +0000 (02:52 +0200)
Create get_uptime() function in procps/ps.c, and use it rather than
relying on linux-specific sysinfo() inline.

Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
procps/ps.c

index 4727b21..3a5af7c 100644 (file)
 /* Absolute maximum on output line length */
 enum { MAX_WIDTH = 2*1024 };
 
+#if ENABLE_FEATURE_PS_TIME || ENABLE_FEATURE_PS_LONG
+static long get_uptime(void)
+{
+#ifdef __linux__
+       struct sysinfo info;
+       if (sysinfo(&info) < 0)
+               return 0;
+       return info.uptime;
+#elif 1
+       char buf[64];
+       long uptime;
+       if (open_read_close("/proc/uptime", buf, sizeof(buf)) <= 0)
+               bb_perror_msg_and_die("can't read %s", "/proc/uptime");
+       buf[sizeof(buf)-1] = '\0';
+       sscanf(buf, "%l", &uptime);
+       return uptime;
+#else
+       struct timespec ts;
+       if (clock_gettime(CLOCK_MONOTONIC, &ts) < 0)
+               return 0;
+       return ts.tv_sec;
+#endif
+}
+#endif
+
 #if ENABLE_DESKTOP
 
 #include <sys/times.h> /* for times() */
@@ -197,8 +222,6 @@ static inline unsigned get_HZ_by_waiting(void)
 
 static unsigned get_kernel_HZ(void)
 {
-       //char buf[64];
-       struct sysinfo info;
 
        if (kernel_HZ)
                return kernel_HZ;
@@ -208,12 +231,7 @@ static unsigned get_kernel_HZ(void)
        if (kernel_HZ == (unsigned)-1)
                kernel_HZ = get_HZ_by_waiting();
 
-       //if (open_read_close("/proc/uptime", buf, sizeof(buf)) <= 0)
-       //      bb_perror_msg_and_die("can't read %s", "/proc/uptime");
-       //buf[sizeof(buf)-1] = '\0';
-       ///sscanf(buf, "%llu", &seconds_since_boot);
-       sysinfo(&info);
-       seconds_since_boot = info.uptime;
+       seconds_since_boot = get_uptime();
 
        return kernel_HZ;
 }
@@ -635,7 +653,7 @@ int ps_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
        };
 #if ENABLE_FEATURE_PS_LONG
        time_t now = now;
-       struct sysinfo info;
+       long uptime;
 #endif
        int opts = 0;
        /* If we support any options, parse argv */
@@ -695,7 +713,7 @@ int ps_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
                puts("S   UID   PID  PPID   VSZ   RSS TTY   STIME TIME     CMD");
 #if ENABLE_FEATURE_PS_LONG
                now = time(NULL);
-               sysinfo(&info);
+               uptime = get_uptime();
 #endif
        }
        else {
@@ -727,7 +745,7 @@ int ps_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
                                char tty[2 * sizeof(int)*3 + 2];
                                char *endp;
                                unsigned sut = (p->stime + p->utime) / 100;
-                               unsigned elapsed = info.uptime - (p->start_time / 100);
+                               unsigned elapsed = uptime - (p->start_time / 100);
                                time_t start = now - elapsed;
                                struct tm *tm = localtime(&start);