summaryrefslogtreecommitdiff
path: root/src/bootchart/bootchart.c
diff options
context:
space:
mode:
authorDaniel Mack <daniel@zonque.org>2015-04-02 14:15:33 +0200
committerDaniel Mack <daniel@zonque.org>2015-04-03 15:29:18 +0200
commitf91781329c6d8a760e3c1b88b66b0e2137c2e5ab (patch)
tree94a417ee58753ea5a92116d0a74ec0a3a044e825 /src/bootchart/bootchart.c
parent34a4071e998f327945993ea6e6cbcaa0292b4093 (diff)
bootchart: clean up sysfd and proc handling
Retrieve the handle to procfs in main(), and pass it functions that need it. Kill the global variables. Also, refactor lots of code in svg_title(). There's no need to access any global variables from there either, and we really should return proper errors from there as well.
Diffstat (limited to 'src/bootchart/bootchart.c')
-rw-r--r--src/bootchart/bootchart.c35
1 files changed, 18 insertions, 17 deletions
diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
index 1024f78fa6..8cb1ee6921 100644
--- a/src/bootchart/bootchart.c
+++ b/src/bootchart/bootchart.c
@@ -67,7 +67,6 @@ double interval;
FILE *of = NULL;
int overrun = 0;
static int exiting = 0;
-int sysfd=-1;
#define DEFAULT_SAMPLES_LEN 500
#define DEFAULT_HZ 25.0
@@ -314,6 +313,8 @@ static void do_journal_append(char *file) {
int main(int argc, char *argv[]) {
_cleanup_free_ char *build = NULL;
+ _cleanup_close_ int sysfd = -1;
+ _cleanup_closedir_ DIR *proc = NULL;
struct sigaction sig = {
.sa_handler = signal_handler,
};
@@ -323,7 +324,6 @@ int main(int argc, char *argv[]) {
time_t t = 0;
int r;
struct rlimit rlim;
- bool has_procfs = false;
parse_conf();
@@ -373,8 +373,6 @@ int main(int argc, char *argv[]) {
return EXIT_FAILURE;
}
- has_procfs = access("/proc/vmstat", F_OK) == 0;
-
LIST_HEAD_INIT(head);
/* main program loop */
@@ -404,13 +402,16 @@ int main(int argc, char *argv[]) {
parse_env_file("/usr/lib/os-release", NEWLINE, "PRETTY_NAME", &build, NULL);
}
- if (has_procfs) {
- r = log_sample(samples, &sampledata);
+ if (proc)
+ rewinddir(proc);
+ else
+ proc = opendir("/proc");
+
+ /* wait for /proc to become available, discarding samples */
+ if (proc) {
+ r = log_sample(proc, samples, &sampledata);
if (r < 0)
return EXIT_FAILURE;
- } else {
- /* wait for /proc to become available, discarding samples */
- has_procfs = access("/proc/vmstat", F_OK) == 0;
}
sample_stop = gettime_ns();
@@ -470,23 +471,23 @@ int main(int argc, char *argv[]) {
}
if (!of) {
- fprintf(stderr, "opening output file '%s': %m\n", output_file);
- exit (EXIT_FAILURE);
+ log_error("Error opening output file '%s': %m\n", output_file);
+ return EXIT_FAILURE;
}
- svg_do(strna(build));
+ r = svg_do(strna(build));
+ if (r < 0) {
+ log_error_errno(r, "Error generating svg file: %m\n");
+ return EXIT_FAILURE;
+ }
- fprintf(stderr, "systemd-bootchart wrote %s\n", output_file);
+ log_info("systemd-bootchart wrote %s\n", output_file);
do_journal_append(output_file);
if (of)
fclose(of);
- closedir(proc);
- if (sysfd >= 0)
- close(sysfd);
-
/* nitpic cleanups */
ps = ps_first->next_ps;
while (ps->next_ps) {