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:
parent
24a88bdd05
commit
096d35585b
11 changed files with 67 additions and 12 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue