diff options
author | Benoît Dejean <bdejean@src.gnome.org> | 2008-04-29 17:57:01 +0000 |
---|---|---|
committer | Benoît Dejean <bdejean@src.gnome.org> | 2008-04-29 17:57:01 +0000 |
commit | 1634698050d799df2a8d6cd533f5495e72ddaa6b (patch) | |
tree | 9f2ff3fa0a4272a4c3863054488c4e551d22be0d | |
parent | be8a3714818ff6826a2722d4ed85ff0765ecaa3f (diff) | |
download | libgtop-1634698050d799df2a8d6cd533f5495e72ddaa6b.tar.gz |
Fixed parsing of big /proc/stat for uptime.
Closes #529946.
svn path=/branches/gnome-2-22/; revision=2742
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | sysdeps/linux/glibtop_private.c | 29 |
2 files changed, 19 insertions, 12 deletions
diff --git a/configure.in b/configure.in index 63f2ed7f..d36b5791 100644 --- a/configure.in +++ b/configure.in @@ -4,7 +4,7 @@ dnl m4_define([libgtop_major_version], [2]) m4_define([libgtop_minor_version], [22]) -m4_define([libgtop_micro_version], [1]) +m4_define([libgtop_micro_version], [2]) m4_define([libgtop_version], [libgtop_major_version.libgtop_minor_version.libgtop_micro_version]) dnl increment if the interface has additions, changes, removals. 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; - - file_to_buffer(server, buffer, sizeof buffer, "/proc/stat"); - - btime = strstr(buffer, "btime"); + char* line = NULL; + size_t size = 0; + FILE* stat; + unsigned long btime = 0; + + if (!(stat = fopen("/proc/stat", "r"))) { + glibtop_error_io_r(server, "fopen(\"/proc/stat\")"); + goto out; + } - if (!btime) { - glibtop_warn_io_r(server, "cannot find btime in /proc/stat"); - return 0UL; + while (getline(&line, &size, stat) != -1) { + if (!strncmp(line, "btime", 5)) { + btime = strtoul(skip_token(line), NULL, 10); + break; + } } - btime = skip_token(btime); - return strtoul(btime, NULL, 10); + free(line); + fclose(stat); +out: + return btime; } |