From: Harald Hoyer Date: Thu, 14 Feb 2013 10:26:05 +0000 (+0100) Subject: bootchart: more fixes for bootchart in the initramfs X-Git-Tag: v198~237 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=b823b5e272d07d31c12625a268e8d563289a4db5 bootchart: more fixes for bootchart in the initramfs --- diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c index adfaba57b..e34c08a5e 100644 --- a/src/bootchart/bootchart.c +++ b/src/bootchart/bootchart.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -32,6 +33,7 @@ #include #include #include +#include #include "bootchart.h" @@ -51,6 +53,7 @@ double interval; FILE *of = NULL; int overrun = 0; static int exiting = 0; +int sysfd=-1; /* graph defaults */ int entropy = 0; @@ -273,6 +276,9 @@ int main(int argc, char *argv[]) of = fopen(output_file, "w"); } + if (sysfd < 0) { + sysfd = open("/sys", O_RDONLY); + } /* wait for /proc to become available, discarding samples */ if (!(graph_start > 0.0)) @@ -331,7 +337,6 @@ int main(int argc, char *argv[]) if (ps->smaps) fclose(ps->smaps); } - closedir(proc); if (!of) { t = time(NULL); @@ -350,6 +355,9 @@ int main(int argc, char *argv[]) fprintf(stderr, "bootchartd: Wrote %s\n", output_file); fclose(of); + closedir(proc); + close(sysfd); + /* nitpic cleanups */ ps = ps_first; while (ps->next_ps) { diff --git a/src/bootchart/bootchart.h b/src/bootchart/bootchart.h index 7793cfc63..6b11fd8b8 100644 --- a/src/bootchart/bootchart.h +++ b/src/bootchart/bootchart.h @@ -117,6 +117,8 @@ extern char init_path[PATH_MAX]; extern FILE *of; extern DIR *proc; +extern int procfd; +extern int sysfd; extern double gettime_ns(void); extern void log_uptime(void); diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c index 6ad7348ec..dc55cb379 100644 --- a/src/bootchart/svg.c +++ b/src/bootchart/svg.c @@ -28,6 +28,8 @@ #include #include #include +#include +#include #include "bootchart.h" #include "util.h" @@ -151,10 +153,12 @@ static void svg_title(void) char *c; FILE *f; time_t t; + int fd; struct utsname uts; /* grab /proc/cmdline */ - f = fopen("/proc/cmdline", "r"); + fd = openat(procfd, "cmdline", O_RDONLY); + f = fdopen(fd, "r"); if (f) { if (!fgets(cmdline, 255, f)) sprintf(cmdline, "Unknown"); @@ -167,8 +171,9 @@ static void svg_title(void) strncpy(rootbdev, &c[10], 3); rootbdev[3] = '\0'; } - sprintf(filename, "/sys/block/%s/device/model", rootbdev); - f = fopen(filename, "r"); + sprintf(filename, "block/%s/device/model", rootbdev); + fd = openat(sysfd, filename, O_RDONLY); + f = fdopen(fd, "r"); if (f) { if (!fgets(model, 255, f)) fprintf(stderr, "Error reading disk model for %s\n", rootbdev); @@ -184,7 +189,8 @@ static void svg_title(void) strftime(date, sizeof(date), "%a, %d %b %Y %H:%M:%S %z", localtime(&t)); /* CPU type */ - f = fopen("/proc/cpuinfo", "r"); + fd = openat(procfd, "cpuinfo", O_RDONLY); + f = fdopen(fd, "r"); if (f) { while (fgets(buf, 255, f)) { if (strstr(buf, "model name")) {