Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 096d3558
Loading
Loading
Loading
Loading
+14 −13
Original line number Original line Diff line number Diff line
@@ -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)
+6 −8
Original line number Original line Diff line number Diff line
@@ -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,
+22 −20
Original line number Original line Diff line number Diff line
#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 −0
Original line number Original line Diff line number Diff line
#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 */