From a6c79231067e6f12de2c4f363e263f69ef38888f Mon Sep 17 00:00:00 2001 From: Markus Mayer Date: Wed, 8 May 2013 16:34:44 -0700 Subject: [PATCH] Fix btime handling reading from /proc/stat 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 --- proc/sysinfo.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/proc/sysinfo.c b/proc/sysinfo.c index 1f9b1fb6..15cdb831 100644 --- a/proc/sysinfo.c +++ b/proc/sysinfo.c @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include #include @@ -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); }