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 <mmayer@broadcom.com>
This commit is contained in:
Markus Mayer 2013-05-08 16:34:44 -07:00 committed by Craig Small
parent 25201bc9fe
commit a6c7923106

View File

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