X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fbootchart%2Fsvg.c;h=4c78abda63af2e3d80d2c7fb342e3188b67a6d1f;hp=dc55cb3797a7fdf8813dc7fdb7a223e0a251a765;hb=e90f9fa4d1cab6f73fc502fe9ef705c1bb2912a0;hpb=b823b5e272d07d31c12625a268e8d563289a4db5;ds=sidebyside
diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c
index dc55cb379..4c78abda6 100644
--- a/src/bootchart/svg.c
+++ b/src/bootchart/svg.c
@@ -140,7 +140,7 @@ static void svg_header(void)
}
-static void svg_title(void)
+static void svg_title(const char *build)
{
char cmdline[256] = "";
char filename[PATH_MAX];
@@ -149,7 +149,6 @@ static void svg_title(void)
char model[256] = "Unknown";
char date[256] = "Unknown";
char cpu[256] = "Unknown";
- char build[256] = "Unknown";
char *c;
FILE *f;
time_t t;
@@ -166,18 +165,19 @@ static void svg_title(void)
}
/* 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);
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))
- fprintf(stderr, "Error reading disk model for %s\n", rootbdev);
- fclose(f);
+ 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);
+ fclose(f);
+ }
}
/* various utsname parameters */
@@ -201,14 +201,6 @@ static void svg_title(void)
fclose(f);
}
- /* Build - 1st line from /etc/system-release */
- f = fopen("/etc/system-release", "r");
- if (f) {
- if (fgets(buf, 255, f))
- strncpy(build, buf, 255);
- fclose(f);
- }
-
svg("Bootchart for %s - %s\n",
uts.nodename, date);
svg("System: %s %s %s %s\n",
@@ -275,6 +267,20 @@ static void svg_graph_box(int height)
}
}
+/* xml comments must not contain "--" */
+static char* xml_comment_encode(const char* name) {
+ char *enc_name, *p;
+
+ enc_name = strdup(name);
+ if (!enc_name)
+ return NULL;
+
+ for (p = enc_name; *p; p++)
+ if (p[0] == '-' && p[1] == '-')
+ p[1] = '_';
+
+ return enc_name;
+}
static void svg_pss_graph(void)
{
@@ -377,7 +383,7 @@ static void svg_pss_graph(void)
top = bottom + ps->sample[i].pss;
/* draw a label with the process / PID */
if ((i == 1) || (ps->sample[i - 1].pss <= (100 * scale_y)))
- svg(" %s [%i]\n",
+ svg(" [%i]\n",
time_to_graph(sampletime[i] - graph_start),
kb_to_graph(1000000.0 - bottom - ((top - bottom) / 2)),
ps->name,
@@ -391,10 +397,17 @@ static void svg_pss_graph(void)
svg("\n\n\n");
ps = ps_first;
while (ps->next_ps) {
+ char _cleanup_free_*enc_name;
ps = ps->next_ps;
if (!ps)
continue;
- svg("\n", ps->name, ps->pid,
+ svg("\n", enc_name, ps->pid,
ps->ppid, ps->total);
/* it would be nice if we could use exec_start from /proc/pid/sched,
@@ -906,7 +925,7 @@ static void svg_ps_bars(void)
w = ps->first;
/* text label of process name */
- svg(" %s [%i] %.03fs\n",
+ svg(" [%i]%.03fs\n",
time_to_graph(sampletime[w] - graph_start) + 5.0,
ps_to_graph(j) + 14.0,
ps->name,
@@ -1010,7 +1029,7 @@ static void svg_top_ten_cpu(void)
svg("Top CPU consumers:\n");
for (n = 0; n < 10; n++)
- svg("%3.03fs - %s[%d]\n",
+ svg("%3.03fs - [%d]\n",
20 + (n * 13),
top[n]->total,
top[n]->name,
@@ -1045,7 +1064,7 @@ static void svg_top_ten_pss(void)
svg("Top PSS consumers:\n");
for (n = 0; n < 10; n++)
- svg("%dK - %s[%d]\n",
+ svg("%dK - [%d]\n",
20 + (n * 13),
top[n]->pss_max,
top[n]->name,
@@ -1053,7 +1072,7 @@ static void svg_top_ten_pss(void)
}
-void svg_do(void)
+void svg_do(const char *build)
{
struct ps_struct *ps;
@@ -1106,7 +1125,7 @@ void svg_do(void)
svg("\n\n");
svg("\n");
- svg_title();
+ svg_title(build);
svg("\n\n");
svg("\n");