diff options
44 files changed, 431 insertions, 390 deletions
diff --git a/arguments.c b/arguments.c index f6f6ecaf..92072ad5 100644 --- a/arguments.c +++ b/arguments.c @@ -28,10 +28,6 @@ * Manipulate command arguments. */ -struct args_value { - char *value; - TAILQ_ENTRY(args_value) entry; -}; TAILQ_HEAD(args_values, args_value); struct args_entry { @@ -41,6 +37,12 @@ struct args_entry { RB_ENTRY(args_entry) entry; }; +struct args { + struct args_tree tree; + int argc; + char **argv; +}; + static struct args_entry *args_find(struct args *, u_char); static int args_cmp(struct args_entry *, struct args_entry *); @@ -76,7 +78,7 @@ args_create(void) /* Parse an argv and argc into a new argument set. */ struct args * -args_parse(const char *template, int argc, char **argv) +args_parse(const char *template, int argc, char **argv, int lower, int upper) { struct args *args; int opt; @@ -102,6 +104,10 @@ args_parse(const char *template, int argc, char **argv) args->argc = argc; args->argv = cmd_copy_argv(argc, argv); + if ((lower != -1 && argc < lower) || (upper != -1 && argc > upper)) { + args_free(args); + return (NULL); + } return (args); } @@ -129,11 +135,19 @@ args_free(struct args *args) free(args); } +/* Convert arguments to vector. */ +void +args_vector(struct args *args, int *argc, char ***argv) +{ + *argc = args->argc; + *argv = cmd_copy_argv(args->argc, args->argv); +} + /* Add to string. */ static void printflike(3, 4) args_print_add(char **buf, size_t *len, const char *fmt, ...) { - va_list ap; + va_list ap; char *s; size_t slen; @@ -148,23 +162,6 @@ args_print_add(char **buf, size_t *len, const char *fmt, ...) free(s); } -/* Add value to string. */ -static void -args_print_add_value(char **buf, size_t *len, struct args_entry *entry, - struct args_value *value) -{ - char *escaped; - - if (**buf != '\0') - args_print_add(buf, len, " -%c ", entry->flag); - else - args_print_add(buf, len, "-%c ", entry->flag); - - escaped = args_escape(value->value); - args_print_add(buf, len, "%s", escaped); - free(escaped); -} - /* Add argument to string. */ static void args_print_add_argument(char **buf, size_t *len, const char *argument) @@ -183,7 +180,7 @@ args_print_add_argument(char **buf, size_t *len, const char *argument) char * args_print(struct args *args) { - size_t len; + size_t len; char *buf; int i; u_int j; @@ -206,8 +203,13 @@ args_print(struct args *args) /* Then the flags with arguments. */ RB_FOREACH(entry, args_tree, &args->tree) { - TAILQ_FOREACH(value, &entry->values, entry) - args_print_add_value(&buf, &len, entry, value); + TAILQ_FOREACH(value, &entry->values, entry) { + if (*buf != '\0') + args_print_add(&buf, &len, " -%c", entry->flag); + else + args_print_add(&buf, &len, "-%c", entry->flag); + args_print_add_argument(&buf, &len, value->value); + } } /* And finally the argument vector. */ @@ -333,31 +335,38 @@ args_next(struct args_entry **entry) return ((*entry)->flag); } -/* Get first value in argument. */ +/* Get argument count. */ +u_int +args_count(struct args *args) +{ + return (args->argc); +} + +/* Return argument as string. */ const char * -args_first_value(struct args *args, u_char flag, struct args_value **value) +args_string(struct args *args, u_int idx) +{ + if (idx >= (u_int)args->argc) + return (NULL); + return (args->argv[idx]); +} + +/* Get first value in argument. */ +struct args_value * +args_first_value(struct args *args, u_char flag) { struct args_entry *entry; if ((entry = args_find(args, flag)) == NULL) return (NULL); - - *value = TAILQ_FIRST(&entry->values); - if (*value == NULL) - return (NULL); - return ((*value)->value); + return (TAILQ_FIRST(&entry->values)); } /* Get next value in argument. */ -const char * -args_next_value(struct args_value **value) +struct args_value * +args_next_value(struct args_value *value) { - if (*value == NULL) - return (NULL); - *value = TAILQ_NEXT(*value, entry); - if (*value == NULL) - return (NULL); - return ((*value)->value); + return (TAILQ_NEXT(value, entry)); } /* Convert an argument value to a number. */ @@ -366,7 +375,7 @@ args_strtonum(struct args *args, u_char flag, long long minval, long long maxval, char **cause) { const char *errstr; - long long ll; + long long ll; struct args_entry *entry; struct args_value *value; @@ -408,7 +417,7 @@ args_string_percentage(const char *value, long long minval, long long maxval, long long curval, char **cause) { const char *errstr; - long long ll; + long long ll; size_t valuelen = strlen(value); char *copy; diff --git a/cmd-bind-key.c b/cmd-bind-key.c index b4e4167c..87dd3cf7 100644 --- a/cmd-bind-key.c +++ b/cmd-bind-key.c @@ -48,12 +48,13 @@ cmd_bind_key_exec(struct cmd *self, struct cmdq_item *item) key_code key; const char *tablename, *note = args_get(args, 'N'); struct cmd_parse_result *pr; - char **argv = args->argv; - int argc = args->argc, repeat; + char **argv; + int argc, repeat; + u_int count = args_count(args); - key = key_string_lookup_string(argv[0]); + key = key_string_lookup_string(args_string(args, 0)); if (key == KEYC_NONE || key == KEYC_UNKNOWN) { - cmdq_error(item, "unknown key: %s", argv[0]); + cmdq_error(item, "unknown key: %s", args_string(args, 0)); return (CMD_RETURN_ERROR); } @@ -65,11 +66,14 @@ cmd_bind_key_exec(struct cmd *self, struct cmdq_item *item) tablename = "prefix"; repeat = args_has(args, 'r'); - if (argc != 1) { - if (argc == 2) - pr = cmd_parse_from_string(argv[1], NULL); - else + if (count != 1) { + if (count == 2) + pr = cmd_parse_from_string(args_string(args, 1), NULL); + else { + args_vector(args, &argc, &argv); pr = cmd_parse_from_arguments(argc - 1, argv + 1, NULL); + cmd_free_argv(argc, argv); + } switch (pr->status) { case CMD_PARSE_EMPTY: cmdq_error(item, "empty command"); diff --git a/cmd-command-prompt.c b/cmd-command-prompt.c index 4943bc15..25ec6817 100644 --- a/cmd-command-prompt.c +++ b/cmd-command-prompt.c @@ -71,9 +71,10 @@ cmd_command_prompt_exec(struct cmd *self, struct cmdq_item *item) struct args *args = cmd_get_args(self); struct client *tc = cmdq_get_target_client(item); struct cmd_find_state *target = cmdq_get_target(item); - const char *inputs, *prompts, *type; + const char *inputs, *prompts, *type, *s; struct cmd_command_prompt_cdata *cdata; - char *prompt, *ptr, *input = NULL; + char *prompt, *comma, *input = NULL; + u_int count = args_count(args); size_t n; int wait = !args_has(args, 'b'); @@ -94,28 +95,30 @@ cmd_command_prompt_exec(struct cmd *self, struct cmdq_item *item) if (wait) cdata->item = item; - if (args->argc != 0 && args_has(args, 'F')) - cdata->template = format_single_from_target(item, args->argv[0]); - else if (args->argc != 0) - cdata->template = xstrdup(args->argv[0]); - else + if (count != 0) { + s = args_string(args, 0); + if (args_has(args, 'F')) + cdata->template = format_single_from_target(item, s); + else + cdata->template = xstrdup(s); + } else cdata->template = xstrdup("%1"); if ((prompts = args_get(args, 'p')) != NULL) cdata->prompts = xstrdup(prompts); - else if (args->argc != 0) { + else if (count != 0) { n = strcspn(cdata->template, " ,"); - xasprintf(&cdata->prompts, "(%.*s) ", (int) n, cdata->template); + xasprintf(&cdata->prompts, "(%.*s) ", (int)n, cdata->template); } else cdata->prompts = xstrdup(":"); /* Get first prompt. */ cdata->next_prompt = cdata->prompts; - ptr = strsep(&cdata->next_prompt, ","); + comma = strsep(&cdata->next_prompt, ","); if (prompts == NULL) - prompt = xstrdup(ptr); + prompt = xstrdup(comma); else - xasprintf(&prompt, "%s ", ptr); + xasprintf(&prompt, "%s ", comma); /* Get initial prompt input. */ if ((inputs = args_get(args, 'I')) != NULL) { @@ -157,7 +160,7 @@ cmd_command_prompt_callback(struct client *c, void *data, const char *s, int done) { struct cmd_command_prompt_cdata *cdata = data; - char *new_template, *prompt, *ptr, *error; + char *new_template, *prompt, *comma, *error; char *input = NULL; struct cmdq_item *item = cdata->item; enum cmd_parse_status status; @@ -177,8 +180,8 @@ cmd_command_prompt_callback(struct client *c, void *data, const char *s, * Check if there are more prompts; if so, get its respective input * and update the prompt data. */ - if (done && (ptr = strsep(&cdata->next_prompt, ",")) != NULL) { - xasprintf(&prompt, "%s ", ptr); + if (done && (comma = strsep(&cdata->next_prompt, ",")) != NULL) { + xasprintf(&prompt, "%s ", comma); input = strsep(&cdata->next_input, ","); status_prompt_update(c, prompt, input); diff --git a/cmd-confirm-before.c b/cmd-confirm-before.c index 51c2fe8e..9f179aaf 100644 --- a/cmd-confirm-before.c +++ b/cmd-confirm-before.c @@ -59,22 +59,22 @@ cmd_confirm_before_exec(struct cmd *self, struct cmdq_item *item) struct cmd_confirm_before_data *cdata; struct client *tc = cmdq_get_target_client(item); struct cmd_find_state *target = cmdq_get_target(item); - char *cmd, *copy, *new_prompt, *ptr; + char *cmd, *copy, *new_prompt, *tmp; const char *prompt; int wait = !args_has(args, 'b'); + cdata = xcalloc(1, sizeof *cdata); + cdata->cmd = xstrdup(args_string(args, 0)); + if ((prompt = args_get(args, 'p')) != NULL) xasprintf(&new_prompt, "%s ", prompt); else { - ptr = copy = xstrdup(args->argv[0]); - cmd = strsep(&ptr, " \t"); + tmp = copy = xstrdup(cdata->cmd); + cmd = strsep(&tmp, " \t"); xasprintf(&new_prompt, "Confirm '%s'? (y/n) ", cmd); free(copy); } - cdata = xcalloc(1, sizeof *cdata); - cdata->cmd = xstrdup(args->argv[0]); - cmd_get_source(self, &cdata->pi.file, &cdata->pi.line); if (wait) cdata->pi.item = item; diff --git a/cmd-display-menu.c b/cmd-display-menu.c index 9e7bc3a2..49ddf13d 100644 --- a/cmd-display-menu.c +++ b/cmd-display-menu.c @@ -260,10 +260,10 @@ cmd_display_menu_exec(struct cmd *self, struct cmdq_item *item) struct client *tc = cmdq_get_target_client(item); struct menu *menu = NULL; struct menu_item menu_item; - const char *key; - char *title, *name; - int flags = 0, i; - u_int px, py; + const char *key, *name; + char *title; + int flags = 0; + u_int px, py, i, count = args_count(args); if (tc->overlay_draw != NULL) return (CMD_RETURN_NORMAL); @@ -274,24 +274,24 @@ cmd_display_menu_exec(struct cmd *self, struct cmdq_item *item) title = xstrdup(""); menu = menu_create(title); - for (i = 0; i != args->argc; /* nothing */) { - name = args->argv[i++]; + for (i = 0; i != count; /* nothing */) { + name = args_string(args, i++); if (*name == '\0') { menu_add_item(menu, NULL, item, tc, target); continue; } - if (args->argc - i < 2) { + if (count - i < 2) { cmdq_error(item, "not enough arguments"); free(title); menu_free(menu); return (CMD_RETURN_ERROR); } - key = args->argv[i++]; + key = args_string(args, i++); menu_item.name = name; menu_item.key = key_string_lookup_string(key); - menu_item.command = args->argv[i++]; + menu_item.command = args_string(args, i++); menu_add_item(menu, &menu_item, item, tc, target); } @@ -328,11 +328,10 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item) struct session *s = target->s; struct client *tc = cmdq_get_target_client(item); struct tty *tty = &tc->tty; - const char *value, *shell[] = { NULL, NULL }; - const char *shellcmd = NULL; - char *cwd, *cause, **argv = args->argv; - int flags = 0, argc = args->argc; - u_int px, py, w, h; + const char *value, *shell, *shellcmd = NULL; + char *cwd, *cause, **argv = NULL; + int flags = 0, argc = 0; + u_int px, py, w, h, count = args_count(args); if (args_has(args, 'C')) { server_client_clear_overlay(tc); @@ -373,18 +372,18 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item) cwd = format_single_from_target(item, value); else cwd = xstrdup(server_client_get_cwd(tc, s)); - if (argc == 0) + if (count == 0) shellcmd = options_get_string(s->options, "default-command"); - else if (argc == 1) - shellcmd = argv[0]; - if (argc <= 1 && (shellcmd == NULL || *shellcmd == '\0')) { + else if (count == 1) + shellcmd = args_string(args, 0); + if (count <= 1 && (shellcmd == NULL || *shellcmd == '\0')) { shellcmd = NULL; - shell[0] = options_get_string(s->options, "default-shell"); - if (!checkshell(shell[0])) - shell[0] = _PATH_BSHELL; - argc = 1; - argv = (char**)shell; - } + shell = options_get_string(s->options, "default-shell"); + if (!checkshell(shell)) + shell = _PATH_BSHELL; + cmd_append_argv(&argc, &argv, shell); + } else + args_vector(args, &argc, &argv); if (args_has(args, 'E') > 1) flags |= POPUP_CLOSEEXITZERO; @@ -393,7 +392,10 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item) if (args_has(args, 'B')) flags |= POPUP_NOBORDER; if (popup_display(flags, item, px, py, w, h, shellcmd, argc, argv, cwd, - tc, s, NULL, NULL) != 0) + tc, s, NULL, NULL) != 0) { + cmd_free_argv(argc, argv); return (CMD_RETURN_NORMAL); + } + cmd_free_argv(argc, argv); return (CMD_RETURN_WAIT); } diff --git a/cmd-display-message.c b/cmd-display-message.c index 8fd6a8ff..f4d41e6c 100644 --- a/cmd-display-message.c +++ b/cmd-display-message.c @@ -68,9 +68,9 @@ cmd_display_message_exec(struct cmd *self, struct cmdq_item *item) struct window_pane *wp = target->wp; const char *template; char *msg, *cause; - int delay = -1; + int delay = -1, flags; struct format_tree *ft; - int flags; + u_int count = args_count(args); if (args_has(args, 'I')) { if (wp == NULL) @@ -83,7 +83,7 @@ cmd_display_message_exec(struct cmd *self, struct cmdq_item *item) return (CMD_RETURN_WAIT); } - if (args_has(args, 'F') && args->argc != 0) { + if (args_has(args, 'F') && count != 0) { cmdq_error(item, "only one of -F or argument must be given"); return (CMD_RETURN_ERROR); } @@ -97,9 +97,10 @@ cmd_display_message_exec(struct cmd *self, struct cmdq_item *item) } } - template = args_get(args, 'F'); - if (args->argc != 0) - template = args->argv[0]; + if (count != 0) + template = args_string(args, 0); + else + template = args_get(args, 'F'); if (template == NULL) template = DISPLAY_MESSAGE_TEMPLATE; diff --git a/cmd-display-panes.c b/cmd-display-panes.c index beadae53..59484872 100644 --- a/cmd-display-panes.c +++ b/cmd-display-panes.c @@ -276,8 +276,8 @@ cmd_display_panes_exec(struct cmd *self, struct cmdq_item *item) delay = options_get_number(s->options, "display-panes-time"); cdata = xmalloc(sizeof *cdata); - if (args->argc != 0) - cdata->command = xstrdup(args->argv[0]); + if (args_count(args)) + cdata->command = xstrdup(args_string(args, 0)); else cdata->command = xstrdup("select-pane -t '%%'"); if (args_has(args, 'b')) diff --git a/cmd-find-window.c b/cmd-find-window.c index 43f5f9be..691baf85 100644 --- a/cmd-find-window.c +++ b/cmd-find-window.c @@ -47,7 +47,7 @@ cmd_find_window_exec(struct cmd *self, struct cmdq_item *item) struct args *args = cmd_get_args(self), *new_args; struct cmd_find_state *target = cmdq_get_target(item); struct window_pane *wp = target->wp; - const char *s = args->argv[0], *suffix = ""; + const char *s = args_string(args, 0), *suffix = ""; char *filter; int C, N, T; diff --git a/cmd-if-shell.c b/cmd-if-shell.c index f4c81074..df06a0b6 100644 --- a/cmd-if-shell.c +++ b/cmd-if-shell.c @@ -65,21 +65,20 @@ cmd_if_shell_exec(struct cmd *self, struct cmdq_item *item) struct cmd_find_state *target = cmdq_get_target(item); struct cmdq_state *state = cmdq_get_state(item); struct cmd_if_shell_data *cdata; - char *shellcmd, *cmd, *error; - const char *file; + char *shellcmd, *error; + const char *cmd = NULL, *file; struct client *tc = cmdq_get_target_client(item); struct session *s = target->s; struct cmd_parse_input pi; enum cmd_parse_status status; + u_int count = args_count(args); - shellcmd = format_single_from_target(item, args->argv[0]); + shellcmd = format_single_from_target(item, args_string(args, 0)); if (args_has(args, 'F')) { if (*shellcmd != '0' && *shellcmd != '\0') - cmd = args->argv[1]; - else if (args->argc == 3) - cmd = args->argv[2]; - else - cmd = NULL; + cmd = args_string(args, 1); + else if (count == 3) + cmd = args_string(args, 2); free(shellcmd); if (cmd == NULL) return (CMD_RETURN_NORMAL); @@ -101,9 +100,9 @@ cmd_if_shell_exec(struct cmd *self, struct cmdq_item *item) cdata = xcalloc(1, sizeof *cdata); - cdata->cmd_if = xstrdup(args->argv[1]); - if (args->argc == 3) - cdata->cmd_else = xstrdup(args->argv[2]); + cdata->cmd_if = xstrdup(args_string(args, 1)); + if (count == 3) + cdata->cmd_else = xstrdup(args_string(args, 2)); if (!args_has(args, 'b')) cdata->client = cmdq_get_client(item); diff --git a/cmd-list-keys.c b/cmd-list-keys.c index dbb510fb..1484af6d 100644 --- a/cmd-list-keys.c +++ b/cmd-list-keys.c @@ -150,7 +150,7 @@ cmd_list_keys_exec(struct cmd *self, struct cmdq_item *item) struct args *args = cmd_get_args(self); struct key_table *table; struct key_binding *bd; - const char *tablename, *r; + const char *tablename, *r, *keystr; char *key, *cp, *tmp, *start, *empty; key_code prefix, only = KEYC_UNKNOWN; int repeat, width, tablewidth, keywidth, found = 0; @@ -159,10 +159,10 @@ cmd_list_keys_exec(struct cmd *self, struct cmdq_item *item) if (cmd_get_entry(self) == &cmd_list_commands_entry) return (cmd_list_keys_commands(self, item)); - if (args->argc != 0) { - only = key_string_lookup_string(args->argv[0]); + if ((keystr = args_string(args, 0)) != NULL) { + only = key_string_lookup_string(keystr); if (only == KEYC_UNKNOWN) { - cmdq_error(item, "invalid key: %s", args->argv[0]); + cmdq_error(item, "invalid key: %s", keystr); return (CMD_RETURN_ERROR); } only &= (KEYC_MASK_KEY|KEYC_MASK_MODIFIERS); @@ -243,6 +243,7 @@ cmd_list_keys_exec(struct cmd *self, struct cmdq_item *item) tmpsize = 256; tmp = xmalloc(tmpsize); + table = key_bindings_first_table(); while (table != NULL) { if (tablename != NULL && strcmp(table->name, tablename) != 0) { @@ -307,7 +308,7 @@ cmd_list_keys_exec(struct cmd *self, struct cmdq_item *item) out: if (only != KEYC_UNKNOWN && !found) { - cmdq_error(item, "unknown key: %s", args->argv[0]); + cmdq_error(item, "unknown key: %s", args_string(args, 0)); return (CMD_RETURN_ERROR); } return (CMD_RETURN_NORMAL); @@ -320,12 +321,9 @@ cmd_list_keys_commands(struct cmd *self, struct cmdq_item *item) const struct cmd_entry **entryp; const struct cmd_entry *entry; struct format_tree *ft; - const char *template, *s, *command = NULL; + const char *template, *s, *command; char *line; - if (args->argc != 0) - command = args->argv[0]; - if ((template = args_get(args, 'F')) == NULL) { template = "#{command_list_name}" "#{?command_list_alias, (#{command_list_alias}),} " @@ -335,6 +333,7 @@ cmd_list_keys_commands(struct cmd *self, struct cmdq_item *item) ft = format_create(cmdq_get_client(item), item, FORMAT_NONE, 0); format_defaults(ft, NULL, NULL, NULL, NULL); + command = args_string(args, 0); for (entryp = cmd_table; *entryp != NULL; entryp++) { entry = *entryp; if (command != NULL && diff --git a/cmd-load-buffer.c b/cmd-load-buffer.c index bca9a860..318a7467 100644 --- a/cmd-load-buffer.c +++ b/cmd-load-buffer.c @@ -105,7 +105,7 @@ cmd_load_buffer_exec(struct cmd *self, struct cmdq_item *item) cdata->client->references++; } - path = format_single_from_target(item, args->argv[0]); + path = format_single_from_target(item, args_string(args, 0)); file_read(cmdq_get_client(item), path, cmd_load_buffer_done, cdata); free(path); diff --git a/cmd-new-session.c b/cmd-new-session.c index f3a5de26..0cc6b9da 100644 --- a/cmd-new-session.c +++ b/cmd-new-session.c @@ -75,15 +75,15 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item) struct options *oo; struct termios tio, *tiop; struct session_group *sg = NULL; - const char *errstr, *template, *group, *tmp, *add; + const char *errstr, *template, *group, *tmp; char *cause, *cwd = NULL, *cp, *newname = NULL; char *name, *prefix = NULL; int detached, already_attached, is_control = 0; - u_int sx, sy, dsx, dsy; - struct spawn_context sc; + u_int sx, sy, dsx, dsy, count = args_count(args); + struct spawn_context sc = { 0 }; enum cmd_retval retval; struct cmd_find_state fs; - struct args_value *value; + struct args_value *av; if (cmd_get_entry(self) == &cmd_has_session_entry) { /* @@ -93,7 +93,7 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item) return (CMD_RETURN_NORMAL); } - if (args_has(args, 't') && (args->argc != 0 || args_has(args, 'n'))) { + if (args_has(args, 't') && (count != 0 || args_has(args, 'n'))) { cmdq_error(item, "command or window name given with target"); return (CMD_RETURN_ERROR); } @@ -269,23 +269,21 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item) env = environ_create(); if (c != NULL && !args_has(args, 'E')) environ_update(global_s_options, c->environ, env); - add = args_first_value(args, 'e', &value); - while (add != NULL) { - environ_put(env, add, 0); - add = args_next_value(&value); + av = args_first_value(args, 'e'); + while (av != NULL) { + environ_put(env, av->value, 0); + av = args_next_value(av); } s = session_create(prefix, newname, cwd, env, oo, tiop); /* Spawn the initial window. */ - memset(&sc, 0, sizeof sc); sc.item = item; sc.s = s; if (!detached) sc.tc = c; sc.name = args_get(args, 'n'); - sc.argc = args->argc; - sc.argv = args->argv; + args_vector(args, &sc.argc, &sc.argv); sc.idx = -1; sc.cwd = args_get(args, 'c'); @@ -358,12 +356,16 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item) cmd_find_from_session(&fs, s, 0); cmdq_insert_hook(s, item, &fs, "after-new-session"); + if (sc.argv != NULL) + cmd_free_argv(sc.argc, sc.argv); free(cwd); free(newname); free(prefix); return (CMD_RETURN_NORMAL); fail: + if (sc.argv != NULL) + cmd_free_argv(sc.argc, sc.argv); free(cwd); free(newname); free(prefix); diff --git a/cmd-new-window.c b/cmd-new-window.c index 712e2a79..f24de8e9 100644 --- a/cmd-new-window.c +++ b/cmd-new-window.c @@ -55,16 +55,15 @@ cmd_new_window_exec(struct cmd *self, struct cmdq_item *item) struct client *c = cmdq_get_client(item); struct cmd_find_state *current = cmdq_get_current(item); struct cmd_find_state *target = cmdq_get_target(item); - struct spawn_context sc; + struct spawn_context sc = { 0 }; struct client *tc = cmdq_get_target_client(item); struct session *s = target->s; - struct winlink *wl = target->wl; + struct winlink *wl = target->wl, *new_wl = NULL; int idx = target->idx, before; - struct winlink *new_wl = NULL; char *ca |