|
@@ -267,71 +267,6 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
|
|
|
return handled;
|
|
|
}
|
|
|
|
|
|
-static int handle_alias(int *argcp, const char ***argv)
|
|
|
-{
|
|
|
- int envchanged = 0, ret = 0, saved_errno = errno;
|
|
|
- int count, option_count;
|
|
|
- const char **new_argv;
|
|
|
- const char *alias_command;
|
|
|
- char *alias_string;
|
|
|
-
|
|
|
- alias_command = (*argv)[0];
|
|
|
- alias_string = alias_lookup(alias_command);
|
|
|
- if (alias_string) {
|
|
|
- if (alias_string[0] == '!') {
|
|
|
- if (*argcp > 1) {
|
|
|
- struct strbuf buf;
|
|
|
-
|
|
|
- if (strbuf_init(&buf, PATH_MAX) < 0 ||
|
|
|
- strbuf_addstr(&buf, alias_string) < 0 ||
|
|
|
- sq_quote_argv(&buf, (*argv) + 1,
|
|
|
- PATH_MAX) < 0)
|
|
|
- die("Failed to allocate memory.");
|
|
|
- free(alias_string);
|
|
|
- alias_string = buf.buf;
|
|
|
- }
|
|
|
- ret = system(alias_string + 1);
|
|
|
- if (ret >= 0 && WIFEXITED(ret) &&
|
|
|
- WEXITSTATUS(ret) != 127)
|
|
|
- exit(WEXITSTATUS(ret));
|
|
|
- die("Failed to run '%s' when expanding alias '%s'",
|
|
|
- alias_string + 1, alias_command);
|
|
|
- }
|
|
|
- count = split_cmdline(alias_string, &new_argv);
|
|
|
- if (count < 0)
|
|
|
- die("Bad alias.%s string", alias_command);
|
|
|
- option_count = handle_options(&new_argv, &count, &envchanged);
|
|
|
- if (envchanged)
|
|
|
- die("alias '%s' changes environment variables\n"
|
|
|
- "You can use '!perf' in the alias to do this.",
|
|
|
- alias_command);
|
|
|
- memmove(new_argv - option_count, new_argv,
|
|
|
- count * sizeof(char *));
|
|
|
- new_argv -= option_count;
|
|
|
-
|
|
|
- if (count < 1)
|
|
|
- die("empty alias for %s", alias_command);
|
|
|
-
|
|
|
- if (!strcmp(alias_command, new_argv[0]))
|
|
|
- die("recursive alias: %s", alias_command);
|
|
|
-
|
|
|
- new_argv = realloc(new_argv, sizeof(char *) *
|
|
|
- (count + *argcp + 1));
|
|
|
- /* insert after command name */
|
|
|
- memcpy(new_argv + count, *argv + 1, sizeof(char *) * *argcp);
|
|
|
- new_argv[count + *argcp] = NULL;
|
|
|
-
|
|
|
- *argv = new_argv;
|
|
|
- *argcp += count - 1;
|
|
|
-
|
|
|
- ret = 1;
|
|
|
- }
|
|
|
-
|
|
|
- errno = saved_errno;
|
|
|
-
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
#define RUN_SETUP (1<<0)
|
|
|
#define USE_PAGER (1<<1)
|
|
|
|
|
@@ -455,25 +390,12 @@ do_die:
|
|
|
|
|
|
static int run_argv(int *argcp, const char ***argv)
|
|
|
{
|
|
|
- int done_alias = 0;
|
|
|
-
|
|
|
- while (1) {
|
|
|
- /* See if it's an internal command */
|
|
|
- handle_internal_command(*argcp, *argv);
|
|
|
-
|
|
|
- /* .. then try the external ones */
|
|
|
- execv_dashed_external(*argv);
|
|
|
+ /* See if it's an internal command */
|
|
|
+ handle_internal_command(*argcp, *argv);
|
|
|
|
|
|
- /* It could be an alias -- this works around the insanity
|
|
|
- * of overriding "perf log" with "perf show" by having
|
|
|
- * alias.log = show
|
|
|
- */
|
|
|
- if (done_alias || !handle_alias(argcp, argv))
|
|
|
- break;
|
|
|
- done_alias = 1;
|
|
|
- }
|
|
|
-
|
|
|
- return done_alias;
|
|
|
+ /* .. then try the external ones */
|
|
|
+ execv_dashed_external(*argv);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static void pthread__block_sigwinch(void)
|
|
@@ -606,17 +528,12 @@ int main(int argc, const char **argv)
|
|
|
|
|
|
while (1) {
|
|
|
static int done_help;
|
|
|
- int was_alias = run_argv(&argc, &argv);
|
|
|
+
|
|
|
+ run_argv(&argc, &argv);
|
|
|
|
|
|
if (errno != ENOENT)
|
|
|
break;
|
|
|
|
|
|
- if (was_alias) {
|
|
|
- fprintf(stderr, "Expansion of alias '%s' failed; "
|
|
|
- "'%s' is not a perf-command\n",
|
|
|
- cmd, argv[0]);
|
|
|
- goto out;
|
|
|
- }
|
|
|
if (!done_help) {
|
|
|
cmd = argv[0] = help_unknown_cmd(cmd);
|
|
|
done_help = 1;
|