aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Price <anprice@redhat.com>2013-11-08 10:06:54 +0000
committerAndrew Price <anprice@redhat.com>2013-11-08 10:13:30 +0000
commit5d845e37b509032a3154b419e2b332a3bf6101f6 (patch)
treed5fd4055aec7edf231b4f49224222c21fdb25fa3
parent50392c7ff8deede0f3500e99d1d2d401c34af21b (diff)
downloadiowatcher-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.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/tracers.c b/tracers.c
index d70c4a6..e78ecc4 100644
--- a/tracers.c
+++ b/tracers.c
@@ -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;
}