X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fbootchart%2Fsvg.c;h=e5569e1622a6b7fc2123e27ea599ef52b13a0701;hb=85a8eeee36b57c1ab382b0225fa9a87525bbeee9;hp=81211995292761140f3a9aa7daf90fd8895d7408;hpb=a7997073ac07add6cb30dcd9491c0179b2d6ad52;p=elogind.git diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c index 812119952..e5569e162 100644 --- a/src/bootchart/svg.c +++ b/src/bootchart/svg.c @@ -39,6 +39,7 @@ #include "svg.h" #include "bootchart.h" #include "list.h" +#include "utf8.h" #define time_to_graph(t) ((t) * arg_scale_x) #define ps_to_graph(n) ((n) * arg_scale_y) @@ -80,6 +81,8 @@ static void svg_header(void) { double h; struct list_sample_data *sampledata_last; + assert(head); + sampledata = head; LIST_FIND_TAIL(link, sampledata, head); sampledata_last = head; @@ -160,7 +163,7 @@ static void svg_title(const char *build) { char *c; FILE *f; time_t t; - int fd; + int fd, r; struct utsname uts; /* grab /proc/cmdline */ @@ -194,7 +197,8 @@ static void svg_title(const char *build) { /* date */ t = time(NULL); - strftime(date, sizeof(date), "%a, %d %b %Y %H:%M:%S %z", localtime(&t)); + r = strftime(date, sizeof(date), "%a, %d %b %Y %H:%M:%S %z", localtime(&t)); + assert_se(r > 0); /* CPU type */ fd = openat(procfd, "cpuinfo", O_RDONLY); @@ -879,21 +883,21 @@ static struct ps_struct *get_next_ps(struct ps_struct *ps) { return NULL; } -static int ps_filter(struct ps_struct *ps) { +static bool ps_filter(struct ps_struct *ps) { if (!arg_filter) - return 0; + return false; /* can't draw data when there is only 1 sample (need start + stop) */ if (ps->first == ps->last) - return -1; + return true; /* don't filter kthreadd */ if (ps->pid == 2) - return 0; + return false; /* drop stuff that doesn't use any real CPU time */ if (ps->total <= 0.001) - return -1; + return true; return 0; } @@ -1003,12 +1007,15 @@ static void svg_ps_bars(void) { /* pass 2 - ps boxes */ ps = ps_first; while ((ps = get_next_ps(ps))) { - _cleanup_free_ char *enc_name = NULL; + _cleanup_free_ char *enc_name = NULL, *escaped = NULL; double endtime; double starttime; int t; - enc_name = xml_comment_encode(ps->name); + if (!utf8_is_printable(ps->name, strlen(ps->name))) + escaped = utf8_escape_non_printable(ps->name); + + enc_name = xml_comment_encode(escaped ? escaped : ps->name); if (!enc_name) continue; @@ -1097,7 +1104,7 @@ static void svg_ps_bars(void) { svg(" [%i]%.03fs %s\n", time_to_graph(w - graph_start) + 5.0, ps_to_graph(j) + 14.0, - ps->name, + escaped ? escaped : ps->name, ps->pid, (ps->last->runtime - ps->first->runtime) / 1000000000.0, arg_show_cgroup ? ps->cgroup : "");