perf record: auto detect when stdout is a pipe
authorFranck Bui-Huu <fbuihuu@gmail.com>
Sun, 16 Jan 2011 16:14:45 +0000 (17:14 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 24 Jan 2011 12:58:27 +0000 (10:58 -0200)
This patch gives the ability to 'perf record' to detect when its stdout
has been redirected to a pipe. There's now no more need to add '-o -'
switch in this case.

However '-o <path>' option has always precedence, that is if specified
and stdout has been connected via a pipe then the output will go into
the specified output.

LKML-Reference: <m3ipxo966i.fsf@gmail.com>
Signed-off-by: Franck Bui-Huu <fbuihuu@gmail.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-record.c

index 45a3689f9ed6e9d391a50ffa3e6cfdb9e126a952..1346d4230bc00f50acce72a261e3188c19618454 100644 (file)
@@ -48,7 +48,7 @@ static unsigned int           user_freq                       = UINT_MAX;
 static int                     freq                            =   1000;
 static int                     output;
 static int                     pipe_output                     =      0;
-static const char              *output_name                    = "perf.data";
+static const char              *output_name                    = NULL;
 static int                     group                           =      0;
 static int                     realtime_prio                   =      0;
 static bool                    nodelay                         =  false;
@@ -497,18 +497,26 @@ static int __cmd_record(int argc, const char **argv)
                exit(-1);
        }
 
-       if (!strcmp(output_name, "-"))
-               pipe_output = 1;
-       else if (!stat(output_name, &st) && st.st_size) {
-               if (write_mode == WRITE_FORCE) {
-                       char oldname[PATH_MAX];
-                       snprintf(oldname, sizeof(oldname), "%s.old",
-                                output_name);
-                       unlink(oldname);
-                       rename(output_name, oldname);
+       if (!output_name) {
+               if (!fstat(STDOUT_FILENO, &st) && S_ISFIFO(st.st_mode))
+                       pipe_output = 1;
+               else
+                       output_name = "perf.data";
+       }
+       if (output_name) {
+               if (!strcmp(output_name, "-"))
+                       pipe_output = 1;
+               else if (!stat(output_name, &st) && st.st_size) {
+                       if (write_mode == WRITE_FORCE) {
+                               char oldname[PATH_MAX];
+                               snprintf(oldname, sizeof(oldname), "%s.old",
+                                        output_name);
+                               unlink(oldname);
+                               rename(output_name, oldname);
+                       }
+               } else if (write_mode == WRITE_APPEND) {
+                       write_mode = WRITE_FORCE;
                }
-       } else if (write_mode == WRITE_APPEND) {
-               write_mode = WRITE_FORCE;
        }
 
        flags = O_CREAT|O_RDWR;