diff options
author | Andrew Price <anprice@redhat.com> | 2013-11-08 10:06:54 +0000 |
---|---|---|
committer | Andrew Price <anprice@redhat.com> | 2013-11-08 10:13:30 +0000 |
commit | 5d845e37b509032a3154b419e2b332a3bf6101f6 (patch) | |
tree | d5fd4055aec7edf231b4f49224222c21fdb25fa3 | |
parent | 50392c7ff8deede0f3500e99d1d2d401c34af21b (diff) | |
download | iowatcher-5d845e37b509032a3154b419e2b332a3bf6101f6.tar.gz |
Fix processing of trace filenames containing spaces
blktrace_to_dump passes filenames containing spaces to blkparse via
system() so only the first chunk of the string is taken to be the
filename by the subprocess.
This switches to using posix_spawnp() so that we can present the
filename as an element of argv and avoid iowatcher failing in these
cases.
Signed-off-by: Andrew Price <anprice@redhat.com>
-rw-r--r-- | tracers.c | 28 |
1 files changed, 25 insertions, 3 deletions
@@ -31,11 +31,14 @@ #include <time.h> #include <signal.h> #include <sys/wait.h> +#include <spawn.h> #include "plot.h" #include "blkparse.h" #include "list.h" +extern char **environ; + static int line_len = 1024; static char line[1024]; @@ -191,10 +194,29 @@ int wait_for_tracers(void) int blktrace_to_dump(char *trace_name) { - snprintf(line, line_len, "blkparse -O -i %s -d '%s.%s'", - trace_name, trace_name, "dump"); + pid_t pid; + int err; + int i; + char *argv[] = { + "blkparse", "-O", + "-i", NULL, + "-d", NULL, + NULL + }; + + argv[3] = trace_name; + snprintf(line, line_len, "%s.dump", trace_name); + argv[5] = line; + + fprintf(stderr, "running blkparse"); + for (i = 0; i < 6; i++) + fprintf(stderr, " %s", argv[i]); + fprintf(stderr, "\n"); - system(line); + err = posix_spawnp(&pid, "blkparse", NULL, NULL, argv, environ); + if (err != 0) + return err; + waitpid(pid, NULL, 0); return 0; } |