perf trace/scripting: Add support for script args
[safe/jmp/linux-2.6] / tools / perf / util / trace-event-perl.c
index a5ffe60..6f10e76 100644 (file)
@@ -267,7 +267,7 @@ int common_lock_depth(struct scripting_context *context)
 }
 
 static void perl_process_event(int cpu, void *data,
-                              int size __attribute((unused)),
+                              int size __unused,
                               unsigned long long nsecs, char *comm)
 {
        struct format_field *field;
@@ -359,28 +359,42 @@ static void run_start_sub(void)
 /*
  * Start trace script
  */
-static int perl_start_script(const char *script)
+static int perl_start_script(const char *script, int argc, const char **argv)
 {
-       const char *command_line[2] = { "", NULL };
+       const char **command_line;
+       int i, err = 0;
 
+       command_line = malloc((argc + 2) * sizeof(const char *));
+       command_line[0] = "";
        command_line[1] = script;
+       for (i = 2; i < argc + 2; i++)
+               command_line[i] = argv[i - 2];
 
        my_perl = perl_alloc();
        perl_construct(my_perl);
 
-       if (perl_parse(my_perl, xs_init, 2, (char **)command_line,
-                      (char **)NULL))
-               return -1;
+       if (perl_parse(my_perl, xs_init, argc + 2, (char **)command_line,
+                      (char **)NULL)) {
+               err = -1;
+               goto error;
+       }
 
        perl_run(my_perl);
-       if (SvTRUE(ERRSV))
-               return -1;
+       if (SvTRUE(ERRSV)) {
+               err = -1;
+               goto error;
+       }
 
        run_start_sub();
 
+       free(command_line);
        fprintf(stderr, "perf trace started with Perl script %s\n\n", script);
-
        return 0;
+error:
+       perl_free(my_perl);
+       free(command_line);
+
+       return err;
 }
 
 /*
@@ -579,7 +593,9 @@ static void print_unsupported_msg(void)
                "\n  etc.\n");
 }
 
-static int perl_start_script_unsupported(const char *script __unused)
+static int perl_start_script_unsupported(const char *script __unused,
+                                        int argc __unused,
+                                        const char **argv __unused)
 {
        print_unsupported_msg();