Skip to content

Commit

Permalink
perf tools: Remove subcmd dependencies on strbuf
Browse files Browse the repository at this point in the history
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 <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/957d207e1254406fa11fc2e405e75a7e405aad8f.1450193761.git.jpoimboe@redhat.com
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
  • Loading branch information
jpoimboe authored and acmel committed Dec 17, 2015
1 parent 096d355 commit 901421a
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 41 deletions.
27 changes: 14 additions & 13 deletions tools/perf/util/exec_cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include "subcmd-config.h"

#include <string.h>
#include "subcmd-util.h"

#define MAX_ARGS 32

Expand All @@ -21,14 +22,14 @@ void exec_cmd_init(const char *exec_name, const char *prefix,

char *system_path(const char *path)
{
struct strbuf d = STRBUF_INIT;
char *buf = NULL;

if (is_absolute_path(path))
return strdup(path);

strbuf_addf(&d, "%s/%s", subcmd_config.prefix, path);
path = strbuf_detach(&d, NULL);
return (char *)path;
astrcatf(&buf, "%s/%s", subcmd_config.prefix, path);

return buf;
}

const char *perf_extract_argv0_path(const char *argv0)
Expand Down Expand Up @@ -75,36 +76,36 @@ char *perf_exec_path(void)
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 (is_absolute_path(path))
strbuf_addstr(out, path);
astrcat(out, path);
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)
{
const char *old_path = getenv("PATH");
struct strbuf new_path = STRBUF_INIT;
char *new_path = NULL;
char *tmp = perf_exec_path();

add_path(&new_path, tmp);
add_path(&new_path, argv0_path);
free(tmp);

if (old_path)
strbuf_addstr(&new_path, old_path);
astrcat(&new_path, old_path);
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)
Expand Down
14 changes: 6 additions & 8 deletions tools/perf/util/help.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include "../builtin.h"
#include "exec_cmd.h"
#include "help.h"
#include "subcmd-util.h"

void add_cmdname(struct cmdnames *cmds, const char *name, size_t len)
{
Expand Down Expand Up @@ -119,27 +120,24 @@ static void list_commands_in_dir(struct cmdnames *cmds,
int prefix_len;
DIR *dir = opendir(path);
struct dirent *de;
struct strbuf buf = STRBUF_INIT;
int len;
char *buf = NULL;

if (!dir)
return;
if (!prefix)
prefix = "perf-";
prefix_len = strlen(prefix);

strbuf_addf(&buf, "%s/", path);
len = buf.len;
astrcatf(&buf, "%s/", path);

while ((de = readdir(dir)) != NULL) {
int entlen;

if (prefixcmp(de->d_name, prefix))
continue;

strbuf_setlen(&buf, len);
strbuf_addstr(&buf, de->d_name);
if (!is_executable(buf.buf))
astrcat(&buf, de->d_name);
if (!is_executable(buf))
continue;

entlen = strlen(de->d_name) - prefix_len;
Expand All @@ -149,7 +147,7 @@ static void list_commands_in_dir(struct cmdnames *cmds,
add_cmdname(cmds, de->d_name + prefix_len, entlen);
}
closedir(dir);
strbuf_release(&buf);
free(buf);
}

void load_command_list(const char *prefix,
Expand Down
42 changes: 22 additions & 20 deletions tools/perf/util/parse-options.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "util.h"
#include "subcmd-util.h"
#include "parse-options.h"
#include "cache.h"
#include "header.h"
Expand All @@ -8,7 +9,7 @@
#define OPT_SHORT 1
#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)
{
Expand Down Expand Up @@ -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 */
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++) {
if (i)
strbuf_addstr(&buf, "|");
strbuf_addstr(&buf, subcommands[i]);
astrcat(&buf, "|");
astrcat(&buf, subcommands[i]);
}
strbuf_addstr(&buf, "}");
astrcat(&buf, "}");

usagestr[0] = strdup(buf.buf);
strbuf_release(&buf);
usagestr[0] = buf;
}

parse_options_start(&ctx, argc, argv, flags);
Expand All @@ -613,13 +613,11 @@ int parse_options_subcommand(int argc, const char **argv, const struct option *o
putchar('\n');
exit(130);
default: /* PARSE_OPT_UNKNOWN */
if (ctx.argv[0][1] == '-') {
strbuf_addf(&error_buf, "unknown option `%s'",
ctx.argv[0] + 2);
} else {
strbuf_addf(&error_buf, "unknown switch `%c'",
*ctx.opt);
}
if (ctx.argv[0][1] == '-')
astrcatf(&error_buf, "unknown option `%s'",
ctx.argv[0] + 2);
else
astrcatf(&error_buf, "unknown switch `%c'", *ctx.opt);
usage_with_options(usagestr, options);
}

Expand Down Expand Up @@ -806,9 +804,9 @@ static int usage_with_options_internal(const char * const *usagestr,

setup_pager();

if (strbuf_avail(&error_buf)) {
fprintf(stderr, " Error: %s\n", error_buf.buf);
strbuf_release(&error_buf);
if (error_buf) {
fprintf(stderr, " Error: %s\n", error_buf);
zfree(&error_buf);
}

fprintf(stderr, "\n Usage: %s\n", *usagestr++);
Expand Down Expand Up @@ -852,11 +850,15 @@ void usage_with_options_msg(const char * const *usagestr,
const struct option *opts, const char *fmt, ...)
{
va_list ap;
char *tmp = error_buf;

va_start(ap, fmt);
strbuf_addv(&error_buf, fmt, ap);
if (vasprintf(&error_buf, fmt, ap) == -1)
die("vasprintf failed");
va_end(ap);

free(tmp);

usage_with_options_internal(usagestr, opts, 0, NULL);
exit(129);
}
Expand Down
24 changes: 24 additions & 0 deletions tools/perf/util/subcmd-util.h
Original file line number Diff line number Diff line change
@@ -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 */

0 comments on commit 901421a

Please sign in to comment.