perf tools: Provide subcmd configuration at runtime

Create init functions for exec_cmd.c and pager.c.  This allows their
configuration to be specified at runtime so they can be split out into a
separate library which can be used by other programs.  Their
configuration is stored in a shared subcmd_config struct.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/21f5f6b38da72c985a8dcfa185700d03e7eecd1d.1450193761.git.jpoimboe@redhat.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Josh Poimboeuf 2015-12-15 09:39:35 -06:00 committed by Arnaldo Carvalho de Melo
parent 24a88bdd05
commit 096d35585b
11 changed files with 67 additions and 12 deletions

View file

@ -1,6 +1,7 @@
#include "cache.h"
#include "exec_cmd.h"
#include "quote.h"
#include "subcmd-config.h"
#include <string.h>
@ -9,15 +10,23 @@
static const char *argv_exec_path;
static const char *argv0_path;
void exec_cmd_init(const char *exec_name, const char *prefix,
const char *exec_path, const char *exec_path_env)
{
subcmd_config.exec_name = exec_name;
subcmd_config.prefix = prefix;
subcmd_config.exec_path = exec_path;
subcmd_config.exec_path_env = exec_path_env;
}
char *system_path(const char *path)
{
static const char *prefix = PREFIX;
struct strbuf d = STRBUF_INIT;
if (is_absolute_path(path))
return strdup(path);
strbuf_addf(&d, "%s/%s", prefix, path);
strbuf_addf(&d, "%s/%s", subcmd_config.prefix, path);
path = strbuf_detach(&d, NULL);
return (char *)path;
}
@ -47,7 +56,7 @@ void perf_set_argv_exec_path(const char *exec_path)
/*
* Propagate this setting to external programs.
*/
setenv(EXEC_PATH_ENVIRONMENT, exec_path, 1);
setenv(subcmd_config.exec_path_env, exec_path, 1);
}
@ -59,11 +68,11 @@ char *perf_exec_path(void)
if (argv_exec_path)
return strdup(argv_exec_path);
env = getenv(EXEC_PATH_ENVIRONMENT);
env = getenv(subcmd_config.exec_path_env);
if (env && *env)
return strdup(env);
return system_path(PERF_EXEC_PATH);
return system_path(subcmd_config.exec_path);
}
static void add_path(struct strbuf *out, const char *path)
@ -107,7 +116,7 @@ static const char **prepare_perf_cmd(const char **argv)
; /* just counting */
nargv = malloc(sizeof(*nargv) * (argc + 2));
nargv[0] = "perf";
nargv[0] = subcmd_config.exec_name;
for (argc = 0; argv[argc]; argc++)
nargv[argc + 1] = argv[argc];
nargv[argc + 1] = NULL;
@ -118,7 +127,7 @@ int execv_perf_cmd(const char **argv) {
const char **nargv = prepare_perf_cmd(argv);
/* execvp() can only ever return if it fails */
execvp("perf", (char **)nargv);
execvp(subcmd_config.exec_name, (char **)nargv);
free(nargv);
return -1;