static int cmd_try_alias(int *argc, char ***argv) { struct options_entry *o; int old_argc = *argc, new_argc; char **old_argv = *argv, **new_argv; u_int size, idx; int i; size_t wanted; const char *s, *cp = NULL; o = options_get_only(global_options, "command-alias"); if (o == NULL || options_array_size(o, &size) == -1 || size == 0) return (-1); wanted = strlen(old_argv[0]); for (idx = 0; idx < size; idx++) { s = options_array_get(o, idx); if (s == NULL) continue; cp = strchr(s, '='); if (cp == NULL || (size_t)(cp - s) != wanted) continue; if (strncmp(old_argv[0], s, wanted) == 0) break; } if (idx == size) return (-1); if (cmd_string_split(cp + 1, &new_argc, &new_argv) != 0) return (-1); *argc = new_argc + old_argc - 1; *argv = xcalloc((*argc) + 1, sizeof **argv); for (i = 0; i < new_argc; i++) (*argv)[i] = xstrdup(new_argv[i]); for (i = 1; i < old_argc; i++) (*argv)[new_argc + i - 1] = xstrdup(old_argv[i]); log_debug("alias: %s=%s", old_argv[0], cp + 1); for (i = 0; i < *argc; i++) log_debug("alias: argv[%d] = %s", i, (*argv)[i]); cmd_free_argv(new_argc, new_argv); return (0); }
static int cmd_try_alias(int *argc, char ***argv) { struct options_entry *o; struct options_array_item *a; union options_value *ov; int old_argc = *argc, new_argc, i; char **old_argv = *argv, **new_argv; size_t wanted; const char *cp = NULL; o = options_get_only(global_options, "command-alias"); if (o == NULL) return (-1); wanted = strlen(old_argv[0]); a = options_array_first(o); while (a != NULL) { ov = options_array_item_value(a); cp = strchr(ov->string, '='); if (cp != NULL && (size_t)(cp - ov->string) == wanted && strncmp(old_argv[0], ov->string, wanted) == 0) break; a = options_array_next(a); } if (a == NULL) return (-1); if (cmd_string_split(cp + 1, &new_argc, &new_argv) != 0) return (-1); *argc = new_argc + old_argc - 1; *argv = xcalloc((*argc) + 1, sizeof **argv); for (i = 0; i < new_argc; i++) (*argv)[i] = xstrdup(new_argv[i]); for (i = 1; i < old_argc; i++) (*argv)[new_argc + i - 1] = xstrdup(old_argv[i]); log_debug("alias: %s=%s", old_argv[0], cp + 1); for (i = 0; i < *argc; i++) log_debug("alias: argv[%d] = %s", i, (*argv)[i]); cmd_free_argv(new_argc, new_argv); return (0); }
struct cmd_list * cmd_string_parse(const char *s, const char *file, u_int line, char **cause) { struct cmd_list *cmdlist = NULL; int argc; char **argv; *cause = NULL; if (cmd_string_split(s, &argc, &argv) != 0) goto error; if (argc != 0) { cmdlist = cmd_list_parse(argc, argv, file, line, cause); if (cmdlist == NULL) { cmd_free_argv(argc, argv); goto error; } } cmd_free_argv(argc, argv); return (cmdlist); error: xasprintf(cause, "invalid or unknown command: %s", s); return (NULL); }