mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-01 14:52:32 +00:00
perf tools: Remove subcmd dependencies on strbuf
Introduce and use new astrcat() and astrcatf() functions which replace the strbuf functionality for subcmd. For now they duplicate strbuf's die-on-allocation-error policy. 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/957d207e1254406fa11fc2e405e75a7e405aad8f.1450193761.git.jpoimboe@redhat.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
096d35585b
commit
901421a5bd
@ -4,6 +4,7 @@
|
|||||||
#include "subcmd-config.h"
|
#include "subcmd-config.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include "subcmd-util.h"
|
||||||
|
|
||||||
#define MAX_ARGS 32
|
#define MAX_ARGS 32
|
||||||
|
|
||||||
@ -21,14 +22,14 @@ void exec_cmd_init(const char *exec_name, const char *prefix,
|
|||||||
|
|
||||||
char *system_path(const char *path)
|
char *system_path(const char *path)
|
||||||
{
|
{
|
||||||
struct strbuf d = STRBUF_INIT;
|
char *buf = NULL;
|
||||||
|
|
||||||
if (is_absolute_path(path))
|
if (is_absolute_path(path))
|
||||||
return strdup(path);
|
return strdup(path);
|
||||||
|
|
||||||
strbuf_addf(&d, "%s/%s", subcmd_config.prefix, path);
|
astrcatf(&buf, "%s/%s", subcmd_config.prefix, path);
|
||||||
path = strbuf_detach(&d, NULL);
|
|
||||||
return (char *)path;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *perf_extract_argv0_path(const char *argv0)
|
const char *perf_extract_argv0_path(const char *argv0)
|
||||||
@ -75,22 +76,22 @@ char *perf_exec_path(void)
|
|||||||
return system_path(subcmd_config.exec_path);
|
return system_path(subcmd_config.exec_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_path(struct strbuf *out, const char *path)
|
static void add_path(char **out, const char *path)
|
||||||
{
|
{
|
||||||
if (path && *path) {
|
if (path && *path) {
|
||||||
if (is_absolute_path(path))
|
if (is_absolute_path(path))
|
||||||
strbuf_addstr(out, path);
|
astrcat(out, path);
|
||||||
else
|
else
|
||||||
strbuf_addstr(out, make_nonrelative_path(path));
|
astrcat(out, make_nonrelative_path(path));
|
||||||
|
|
||||||
strbuf_addch(out, PATH_SEP);
|
astrcat(out, ":");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup_path(void)
|
void setup_path(void)
|
||||||
{
|
{
|
||||||
const char *old_path = getenv("PATH");
|
const char *old_path = getenv("PATH");
|
||||||
struct strbuf new_path = STRBUF_INIT;
|
char *new_path = NULL;
|
||||||
char *tmp = perf_exec_path();
|
char *tmp = perf_exec_path();
|
||||||
|
|
||||||
add_path(&new_path, tmp);
|
add_path(&new_path, tmp);
|
||||||
@ -98,13 +99,13 @@ void setup_path(void)
|
|||||||
free(tmp);
|
free(tmp);
|
||||||
|
|
||||||
if (old_path)
|
if (old_path)
|
||||||
strbuf_addstr(&new_path, old_path);
|
astrcat(&new_path, old_path);
|
||||||
else
|
else
|
||||||
strbuf_addstr(&new_path, "/usr/local/bin:/usr/bin:/bin");
|
astrcat(&new_path, "/usr/local/bin:/usr/bin:/bin");
|
||||||
|
|
||||||
setenv("PATH", new_path.buf, 1);
|
setenv("PATH", new_path, 1);
|
||||||
|
|
||||||
strbuf_release(&new_path);
|
free(new_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char **prepare_perf_cmd(const char **argv)
|
static const char **prepare_perf_cmd(const char **argv)
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include "../builtin.h"
|
#include "../builtin.h"
|
||||||
#include "exec_cmd.h"
|
#include "exec_cmd.h"
|
||||||
#include "help.h"
|
#include "help.h"
|
||||||
|
#include "subcmd-util.h"
|
||||||
|
|
||||||
void add_cmdname(struct cmdnames *cmds, const char *name, size_t len)
|
void add_cmdname(struct cmdnames *cmds, const char *name, size_t len)
|
||||||
{
|
{
|
||||||
@ -119,8 +120,7 @@ static void list_commands_in_dir(struct cmdnames *cmds,
|
|||||||
int prefix_len;
|
int prefix_len;
|
||||||
DIR *dir = opendir(path);
|
DIR *dir = opendir(path);
|
||||||
struct dirent *de;
|
struct dirent *de;
|
||||||
struct strbuf buf = STRBUF_INIT;
|
char *buf = NULL;
|
||||||
int len;
|
|
||||||
|
|
||||||
if (!dir)
|
if (!dir)
|
||||||
return;
|
return;
|
||||||
@ -128,8 +128,7 @@ static void list_commands_in_dir(struct cmdnames *cmds,
|
|||||||
prefix = "perf-";
|
prefix = "perf-";
|
||||||
prefix_len = strlen(prefix);
|
prefix_len = strlen(prefix);
|
||||||
|
|
||||||
strbuf_addf(&buf, "%s/", path);
|
astrcatf(&buf, "%s/", path);
|
||||||
len = buf.len;
|
|
||||||
|
|
||||||
while ((de = readdir(dir)) != NULL) {
|
while ((de = readdir(dir)) != NULL) {
|
||||||
int entlen;
|
int entlen;
|
||||||
@ -137,9 +136,8 @@ static void list_commands_in_dir(struct cmdnames *cmds,
|
|||||||
if (prefixcmp(de->d_name, prefix))
|
if (prefixcmp(de->d_name, prefix))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
strbuf_setlen(&buf, len);
|
astrcat(&buf, de->d_name);
|
||||||
strbuf_addstr(&buf, de->d_name);
|
if (!is_executable(buf))
|
||||||
if (!is_executable(buf.buf))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
entlen = strlen(de->d_name) - prefix_len;
|
entlen = strlen(de->d_name) - prefix_len;
|
||||||
@ -149,7 +147,7 @@ static void list_commands_in_dir(struct cmdnames *cmds,
|
|||||||
add_cmdname(cmds, de->d_name + prefix_len, entlen);
|
add_cmdname(cmds, de->d_name + prefix_len, entlen);
|
||||||
}
|
}
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
strbuf_release(&buf);
|
free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void load_command_list(const char *prefix,
|
void load_command_list(const char *prefix,
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
#include "subcmd-util.h"
|
||||||
#include "parse-options.h"
|
#include "parse-options.h"
|
||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
#include "header.h"
|
#include "header.h"
|
||||||
@ -8,7 +9,7 @@
|
|||||||
#define OPT_SHORT 1
|
#define OPT_SHORT 1
|
||||||
#define OPT_UNSET 2
|
#define OPT_UNSET 2
|
||||||
|
|
||||||
static struct strbuf error_buf = STRBUF_INIT;
|
char *error_buf;
|
||||||
|
|
||||||
static int opterror(const struct option *opt, const char *reason, int flags)
|
static int opterror(const struct option *opt, const char *reason, int flags)
|
||||||
{
|
{
|
||||||
@ -576,19 +577,18 @@ int parse_options_subcommand(int argc, const char **argv, const struct option *o
|
|||||||
|
|
||||||
/* build usage string if it's not provided */
|
/* build usage string if it's not provided */
|
||||||
if (subcommands && !usagestr[0]) {
|
if (subcommands && !usagestr[0]) {
|
||||||
struct strbuf buf = STRBUF_INIT;
|
char *buf = NULL;
|
||||||
|
|
||||||
|
astrcatf(&buf, "%s %s [<options>] {", subcmd_config.exec_name, argv[0]);
|
||||||
|
|
||||||
strbuf_addf(&buf, "%s %s [<options>] {",
|
|
||||||
subcmd_config.exec_name, argv[0]);
|
|
||||||
for (int i = 0; subcommands[i]; i++) {
|
for (int i = 0; subcommands[i]; i++) {
|
||||||
if (i)
|
if (i)
|
||||||
strbuf_addstr(&buf, "|");
|
astrcat(&buf, "|");
|
||||||
strbuf_addstr(&buf, subcommands[i]);
|
astrcat(&buf, subcommands[i]);
|
||||||
}
|
}
|
||||||
strbuf_addstr(&buf, "}");
|
astrcat(&buf, "}");
|
||||||
|
|
||||||
usagestr[0] = strdup(buf.buf);
|
usagestr[0] = buf;
|
||||||
strbuf_release(&buf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
parse_options_start(&ctx, argc, argv, flags);
|
parse_options_start(&ctx, argc, argv, flags);
|
||||||
@ -613,13 +613,11 @@ int parse_options_subcommand(int argc, const char **argv, const struct option *o
|
|||||||
putchar('\n');
|
putchar('\n');
|
||||||
exit(130);
|
exit(130);
|
||||||
default: /* PARSE_OPT_UNKNOWN */
|
default: /* PARSE_OPT_UNKNOWN */
|
||||||
if (ctx.argv[0][1] == '-') {
|
if (ctx.argv[0][1] == '-')
|
||||||
strbuf_addf(&error_buf, "unknown option `%s'",
|
astrcatf(&error_buf, "unknown option `%s'",
|
||||||
ctx.argv[0] + 2);
|
ctx.argv[0] + 2);
|
||||||
} else {
|
else
|
||||||
strbuf_addf(&error_buf, "unknown switch `%c'",
|
astrcatf(&error_buf, "unknown switch `%c'", *ctx.opt);
|
||||||
*ctx.opt);
|
|
||||||
}
|
|
||||||
usage_with_options(usagestr, options);
|
usage_with_options(usagestr, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -806,9 +804,9 @@ static int usage_with_options_internal(const char * const *usagestr,
|
|||||||
|
|
||||||
setup_pager();
|
setup_pager();
|
||||||
|
|
||||||
if (strbuf_avail(&error_buf)) {
|
if (error_buf) {
|
||||||
fprintf(stderr, " Error: %s\n", error_buf.buf);
|
fprintf(stderr, " Error: %s\n", error_buf);
|
||||||
strbuf_release(&error_buf);
|
zfree(&error_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "\n Usage: %s\n", *usagestr++);
|
fprintf(stderr, "\n Usage: %s\n", *usagestr++);
|
||||||
@ -852,11 +850,15 @@ void usage_with_options_msg(const char * const *usagestr,
|
|||||||
const struct option *opts, const char *fmt, ...)
|
const struct option *opts, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
char *tmp = error_buf;
|
||||||
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
strbuf_addv(&error_buf, fmt, ap);
|
if (vasprintf(&error_buf, fmt, ap) == -1)
|
||||||
|
die("vasprintf failed");
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
|
free(tmp);
|
||||||
|
|
||||||
usage_with_options_internal(usagestr, opts, 0, NULL);
|
usage_with_options_internal(usagestr, opts, 0, NULL);
|
||||||
exit(129);
|
exit(129);
|
||||||
}
|
}
|
||||||
|
24
tools/perf/util/subcmd-util.h
Normal file
24
tools/perf/util/subcmd-util.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#ifndef __PERF_SUBCMD_UTIL_H
|
||||||
|
#define __PERF_SUBCMD_UTIL_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define astrcatf(out, fmt, ...) \
|
||||||
|
({ \
|
||||||
|
char *tmp = *(out); \
|
||||||
|
if (asprintf((out), "%s" fmt, tmp ?: "", ## __VA_ARGS__) == -1) \
|
||||||
|
die("asprintf failed"); \
|
||||||
|
free(tmp); \
|
||||||
|
})
|
||||||
|
|
||||||
|
static inline void astrcat(char **out, const char *add)
|
||||||
|
{
|
||||||
|
char *tmp = *out;
|
||||||
|
|
||||||
|
if (asprintf(out, "%s%s", tmp ?: "", add) == -1)
|
||||||
|
die("asprintf failed");
|
||||||
|
|
||||||
|
free(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __PERF_SUBCMD_UTIL_H */
|
Loading…
Reference in New Issue
Block a user