summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoît Dejean <bdejean@src.gnome.org>2008-04-29 17:57:01 +0000
committerBenoît Dejean <bdejean@src.gnome.org>2008-04-29 17:57:01 +0000
commit1634698050d799df2a8d6cd533f5495e72ddaa6b (patch)
tree9f2ff3fa0a4272a4c3863054488c4e551d22be0d
parentbe8a3714818ff6826a2722d4ed85ff0765ecaa3f (diff)
downloadlibgtop-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.in2
-rw-r--r--sysdeps/linux/glibtop_private.c29
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;
}