]> granicus.if.org Git - procps-ng/commitdiff
Fix btime handling reading from /proc/stat
authorMarkus Mayer <mmayer@broadcom.com>
Wed, 8 May 2013 23:34:44 +0000 (16:34 -0700)
committerCraig Small <csmall@enc.com.au>
Sat, 11 May 2013 21:17:07 +0000 (07:17 +1000)
Function getbtime() currently makes the assumption that btime==0 equals
btime not being present in /proc/stat. This is not quite accurate, as
timestamp 0 is, in fact, also a valid time (Epoch), and /proc/stat may
report it as such.

We introduce a flag to indicate whether btime was found in /proc/stat.
In this way, btime==0 becomes a valid case, provided /proc/stat
actually reports this as the boot time.

procps can still detect the case of btime actually not being reported
by the kernel.

Signed-off-by: Markus Mayer <mmayer@broadcom.com>
proc/sysinfo.c

index 1f9b1fb696ade715d0863f85d9b648b6bee77b6f..15cdb831d621b787eedcb27ddb80cab8701d28fd 100644 (file)
@@ -19,6 +19,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -105,6 +106,7 @@ int uptime(double *restrict uptime_secs, double *restrict idle_secs) {
 
 unsigned long getbtime(void) {
     static unsigned long btime = 0;
+    bool found_btime = false;
     FILE *f;
 
     if (btime)
@@ -119,12 +121,14 @@ unsigned long getbtime(void) {
     }
 
     while ((fgets(buf, sizeof buf, f))) {
-        if (sscanf(buf, "btime %lu", &btime) == 1)
+        if (sscanf(buf, "btime %lu", &btime) == 1) {
+            found_btime = true;
             break;
+        }
     }
     fclose(f);
 
-    if (!btime) {
+    if (!found_btime) {
        fputs("missing btime in " STAT_FILE "\n", stderr);
        exit(1);
     }