Commit 901421a5 authored by Josh Poimboeuf's avatar Josh Poimboeuf Committed by Arnaldo Carvalho de Melo

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: default avatarJosh 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.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 096d3558
...@@ -4,6 +4,7 @@ ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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,
......
#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 @@ ...@@ -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 ...@@ -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 ...@@ -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, ...@@ -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, ...@@ -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);
} }
......
#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 */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment