From dc5da309134870bc96b68cfc671453ff87d3060b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Dejean?= Date: Mon, 28 Apr 2008 16:20:56 +0000 Subject: [PATCH] Fixed parsing of big /proc/stat for uptime. svn path=/trunk/; revision=2741 --- sysdeps/linux/glibtop_private.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/sysdeps/linux/glibtop_private.c b/sysdeps/linux/glibtop_private.c index ec4dab79..02077fc9 100644 --- a/sysdeps/linux/glibtop_private.c +++ b/sysdeps/linux/glibtop_private.c @@ -119,20 +119,27 @@ file_to_buffer(glibtop *server, char *buffer, size_t bufsiz, const char *filenam static unsigned long read_boot_time(glibtop *server) { - char buffer[BUFSIZ]; - char *btime; + char* line = NULL; + size_t size = 0; + FILE* stat; + unsigned long btime = 0; - file_to_buffer(server, buffer, sizeof buffer, "/proc/stat"); - - btime = strstr(buffer, "btime"); - - if (!btime) { - glibtop_warn_io_r(server, "cannot find btime in /proc/stat"); - return 0UL; + if (!(stat = fopen("/proc/stat", "r"))) { + glibtop_error_io_r(server, "fopen(\"/proc/stat\")"); + goto out; } - btime = skip_token(btime); - return strtoul(btime, NULL, 10); + while (getline(&line, &size, stat) != -1) { + if (!strncmp(line, "btime", 5)) { + btime = strtoul(skip_token(line), NULL, 10); + break; + } + } + + free(line); + fclose(stat); +out: + return btime; }