X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fbootchart%2Fbootchart.c;h=af573da0f238469c90b823217678f546c81ab4e7;hb=d611dadcc74db10ba533ee6859308f5fc505aee1;hp=0c4d3e3432eb29d6b9b9b164008086054cc19934;hpb=0e4ffbff01cb6b8ca1dd9f0afe61c4e4918872e7;p=elogind.git
diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
index 0c4d3e343..af573da0f 100644
--- a/src/bootchart/bootchart.c
+++ b/src/bootchart/bootchart.c
@@ -20,6 +20,17 @@
along with systemd; If not, see .
***/
+/***
+
+ Many thanks to those who contributed ideas and code:
+ - Ziga Mahkovec - Original bootchart author
+ - Anders Norgaard - PyBootchartgui
+ - Michael Meeks - bootchart2
+ - Scott James Remnant - Ubuntu C-based logger
+ - Arjan van der Ven - for the idea to merge bootgraph.pl functionality
+
+ ***/
+
#include
#include
#include
@@ -132,17 +143,17 @@ int main(int argc, char *argv[])
while (1) {
static struct option opts[] = {
- {"rel", no_argument, NULL, 'r'},
- {"freq", required_argument, NULL, 'f'},
- {"samples", required_argument, NULL, 'n'},
- {"pss", no_argument, NULL, 'p'},
- {"output", required_argument, NULL, 'o'},
- {"init", required_argument, NULL, 'i'},
- {"filter", no_argument, NULL, 'F'},
- {"help", no_argument, NULL, 'h'},
- {"scale-x", required_argument, NULL, 'x'},
- {"scale-y", required_argument, NULL, 'y'},
- {"entropy", no_argument, NULL, 'e'},
+ {"rel", no_argument, NULL, 'r'},
+ {"freq", required_argument, NULL, 'f'},
+ {"samples", required_argument, NULL, 'n'},
+ {"pss", no_argument, NULL, 'p'},
+ {"output", required_argument, NULL, 'o'},
+ {"init", required_argument, NULL, 'i'},
+ {"no-filter", no_argument, NULL, 'F'},
+ {"help", no_argument, NULL, 'h'},
+ {"scale-x", required_argument, NULL, 'x'},
+ {"scale-y", required_argument, NULL, 'y'},
+ {"entropy", no_argument, NULL, 'e'},
{NULL, 0, NULL, 0}
};
@@ -156,13 +167,19 @@ int main(int argc, char *argv[])
relative = true;
break;
case 'f':
- safe_atod(optarg, &hz);
+ r = safe_atod(optarg, &hz);
+ if (r < 0)
+ log_warning("failed to parse --freq/-f argument '%s': %s",
+ optarg, strerror(-r));
break;
case 'F':
filter = false;
break;
case 'n':
- safe_atoi(optarg, &len);
+ r = safe_atoi(optarg, &len);
+ if (r < 0)
+ log_warning("failed to parse --samples/-n argument '%s': %s",
+ optarg, strerror(-r));
break;
case 'o':
path_kill_slashes(optarg);
@@ -176,29 +193,35 @@ int main(int argc, char *argv[])
pss = true;
break;
case 'x':
- safe_atod(optarg, &scale_x);
+ r = safe_atod(optarg, &scale_x);
+ if (r < 0)
+ log_warning("failed to parse --scale-x/-x argument '%s': %s",
+ optarg, strerror(-r));
break;
case 'y':
- safe_atod(optarg, &scale_y);
+ r = safe_atod(optarg, &scale_y);
+ if (r < 0)
+ log_warning("failed to parse --scale-y/-y argument '%s': %s",
+ optarg, strerror(-r));
break;
case 'e':
entropy = true;
break;
case 'h':
fprintf(stderr, "Usage: %s [OPTIONS]\n", argv[0]);
- fprintf(stderr, " --rel, -r Record time relative to recording\n");
- fprintf(stderr, " --freq, -f N Sample frequency [%f]\n", hz);
- fprintf(stderr, " --samples, -n N Stop sampling at [%d] samples\n", len);
- fprintf(stderr, " --scale-x, -x N Scale the graph horizontally [%f] \n", scale_x);
- fprintf(stderr, " --scale-y, -y N Scale the graph vertically [%f] \n", scale_y);
- fprintf(stderr, " --pss, -p Enable PSS graph (CPU intensive)\n");
- fprintf(stderr, " --entropy, -e Enable the entropy_avail graph\n");
- fprintf(stderr, " --output, -o [PATH] Path to output files [%s]\n", output_path);
- fprintf(stderr, " --init, -i [PATH] Path to init executable [%s]\n", init_path);
- fprintf(stderr, " --filter, -F Disable filtering of processes from the graph\n");
+ fprintf(stderr, " --rel, -r Record time relative to recording\n");
+ fprintf(stderr, " --freq, -f f Sample frequency [%f]\n", hz);
+ fprintf(stderr, " --samples, -n N Stop sampling at [%d] samples\n", len);
+ fprintf(stderr, " --scale-x, -x N Scale the graph horizontally [%f] \n", scale_x);
+ fprintf(stderr, " --scale-y, -y N Scale the graph vertically [%f] \n", scale_y);
+ fprintf(stderr, " --pss, -p Enable PSS graph (CPU intensive)\n");
+ fprintf(stderr, " --entropy, -e Enable the entropy_avail graph\n");
+ fprintf(stderr, " --output, -o [PATH] Path to output files [%s]\n", output_path);
+ fprintf(stderr, " --init, -i [PATH] Path to init executable [%s]\n", init_path);
+ fprintf(stderr, " --no-filter, -F Disable filtering of processes from the graph\n");
fprintf(stderr, " that are of less importance or short-lived\n");
- fprintf(stderr, " --help, -h Display this message\n");
- fprintf(stderr, "See the installed README and bootchartd.conf.example for more information.\n");
+ fprintf(stderr, " --help, -h Display this message\n");
+ fprintf(stderr, "See bootchart.conf for more information.\n");
exit (EXIT_SUCCESS);
break;
default:
@@ -217,7 +240,7 @@ int main(int argc, char *argv[])
}
/*
- * If the kernel executed us through init=/sbin/bootchartd, then
+ * If the kernel executed us through init=/usr/lib/systemd/systemd-bootchart, then
* fork:
* - parent execs executable specified via init_path[] (/sbin/init by default) as pid=1
* - child logs data
@@ -341,13 +364,13 @@ int main(int argc, char *argv[])
}
if (!of) {
- perror("open output_file");
+ fprintf(stderr, "opening output file '%s': %m\n", output_file);
exit (EXIT_FAILURE);
}
svg_do(build);
- fprintf(stderr, "bootchartd: Wrote %s\n", output_file);
+ fprintf(stderr, "systemd-bootchart wrote %s\n", output_file);
fclose(of);
closedir(proc);
@@ -366,7 +389,7 @@ int main(int argc, char *argv[])
/* don't complain when overrun once, happens most commonly on 1st sample */
if (overrun > 1)
- fprintf(stderr, "bootchartd: Warning: sample time overrun %i times\n", overrun);
+ fprintf(stderr, "systemd-boochart: Warning: sample time overrun %i times\n", overrun);
return 0;
}