summaryrefslogtreecommitdiff
path: root/src/bootchart/svg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootchart/svg.c')
-rw-r--r--src/bootchart/svg.c97
1 files changed, 50 insertions, 47 deletions
diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c
index 8c8fab941d..b031090d2f 100644
--- a/src/bootchart/svg.c
+++ b/src/bootchart/svg.c
@@ -31,6 +31,7 @@
#include <fcntl.h>
#include "util.h"
+#include "fileio.h"
#include "macro.h"
#include "store.h"
#include "svg.h"
@@ -149,54 +150,47 @@ static void svg_header(void) {
svg(" ]]>\n </style>\n</defs>\n\n");
}
-static void svg_title(const char *build) {
- char cmdline[256] = "";
- char filename[PATH_MAX];
- char buf[256];
- char rootbdev[16] = "Unknown";
- char model[256] = "Unknown";
+static int svg_title(const char *build) {
+ _cleanup_free_ char *cmdline = NULL;
+ _cleanup_free_ char *model = NULL;
+ _cleanup_free_ char *buf = NULL;
char date[256] = "Unknown";
- char cpu[256] = "Unknown";
+ char *cpu;
char *c;
- FILE *f;
time_t t;
- int fd, r;
+ int r;
struct utsname uts;
- /* grab /proc/cmdline */
- fd = openat(procfd, "cmdline", O_RDONLY);
- f = fdopen(fd, "r");
- if (f) {
- if (!fgets(cmdline, 255, f))
- sprintf(cmdline, "Unknown");
- fclose(f);
- } else {
- if (fd >= 0)
- close(fd);
+ r = read_one_line_file("/proc/cmdline", &cmdline);
+ if (r < 0) {
+ log_error_errno(r, "Unable to read cmdline: %m\n");
+ return r;
}
/* extract root fs so we can find disk model name in sysfs */
/* FIXME: this works only in the simple case */
c = strstr(cmdline, "root=/dev/");
if (c) {
- strncpy(rootbdev, &c[10], 3);
+ char rootbdev[4];
+ char filename[32];
+
+ strncpy(rootbdev, &c[10], sizeof(rootbdev) - 1);
rootbdev[3] = '\0';
- sprintf(filename, "block/%s/device/model", rootbdev);
- fd = openat(sysfd, filename, O_RDONLY);
- f = fdopen(fd, "r");
- if (f) {
- if (!fgets(model, 255, f))
- log_error("Error reading disk model for %s: %m\n", rootbdev);
- fclose(f);
- } else {
- if (fd >= 0)
- close(fd);
+ snprintf(filename, sizeof(filename), "/sys/block/%s/device/model", rootbdev);
+
+ r = read_one_line_file(filename, &model);
+ if (r < 0) {
+ log_error("Error reading disk model for %s: %m\n", rootbdev);
+ return r;
}
}
/* various utsname parameters */
- if (uname(&uts))
+ r = uname(&uts);
+ if (r < 0) {
log_error("Error getting uname info\n");
+ return -errno;
+ }
/* date */
t = time(NULL);
@@ -204,21 +198,23 @@ static void svg_title(const char *build) {
assert_se(r > 0);
/* CPU type */
- fd = openat(procfd, "cpuinfo", O_RDONLY);
- f = fdopen(fd, "r");
- if (f) {
- while (fgets(buf, 255, f)) {
- if (strstr(buf, "model name")) {
- strncpy(cpu, &buf[13], 255);
- break;
- }
- }
- fclose(f);
- } else {
- if (fd >= 0)
- close(fd);
+ r = read_full_file("/proc/cpuinfo", &buf, NULL);
+ if (r < 0) {
+ log_error_errno(r, "Unable to read cpuinfo: %m\n");
+ return r;
+ }
+
+ cpu = strstr(buf, "model name");
+ if (!cpu) {
+ log_error("Unable to read module name from cpuinfo.\n");
+ return -ENOENT;
}
+ cpu += 13;
+ c = strchr(cpu, '\n');
+ if (c)
+ *c = '\0';
+
svg("<text class=\"t1\" x=\"0\" y=\"30\">Bootchart for %s - %s</text>\n",
uts.nodename, date);
svg("<text class=\"t2\" x=\"20\" y=\"50\">System: %s %s %s %s</text>\n",
@@ -241,6 +237,8 @@ static void svg_title(const char *build) {
svg("</text>\n");
svg("<text class=\"sec\" x=\"20\" y=\"155\">Graph data: %.03f samples/sec, recorded %i total, dropped %i samples, %i processes, %i filtered</text>\n",
arg_hz, arg_samples_len, overrun, pscount, pfiltered);
+
+ return 0;
}
static void svg_graph_box(int height) {
@@ -1273,10 +1271,10 @@ static void svg_top_ten_pss(void) {
top[n]->pid);
}
-void svg_do(const char *build) {
+int svg_do(const char *build) {
struct ps_struct *ps;
double offset = 7;
- int c;
+ int r, c;
memzero(&str, sizeof(str));
@@ -1334,9 +1332,12 @@ void svg_do(const char *build) {
svg("</g>\n\n");
svg("<g transform=\"translate(10, 0)\">\n");
- svg_title(build);
+ r = svg_title(build);
svg("</g>\n\n");
+ if (r < 0)
+ return r;
+
svg("<g transform=\"translate(10,200)\">\n");
svg_top_ten_cpu();
svg("</g>\n\n");
@@ -1359,4 +1360,6 @@ void svg_do(const char *build) {
/* svg footer */
svg("\n</svg>\n");
+
+ return 0;
}