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:
parent
25201bc9fe
commit
a6c7923106
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user