=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-if-shell.c,v retrieving revision 1.79 retrieving revision 1.80 diff -c -r1.79 -r1.80 *** src/usr.bin/tmux/cmd-if-shell.c 2021/08/21 17:25:32 1.79 --- src/usr.bin/tmux/cmd-if-shell.c 2021/08/23 12:33:55 1.80 *************** *** 1,4 **** ! /* $OpenBSD: cmd-if-shell.c,v 1.79 2021/08/21 17:25:32 nicm Exp $ */ /* * Copyright (c) 2009 Tiago Cunha --- 1,4 ---- ! /* $OpenBSD: cmd-if-shell.c,v 1.80 2021/08/23 12:33:55 nicm Exp $ */ /* * Copyright (c) 2009 Tiago Cunha *************** *** 31,38 **** static enum cmd_retval cmd_if_shell_exec(struct cmd *, struct cmdq_item *); ! static void cmd_if_shell_callback(struct job *); ! static void cmd_if_shell_free(void *); const struct cmd_entry cmd_if_shell_entry = { .name = "if-shell", --- 31,38 ---- static enum cmd_retval cmd_if_shell_exec(struct cmd *, struct cmdq_item *); ! static void cmd_if_shell_callback(struct job *); ! static void cmd_if_shell_free(void *); const struct cmd_entry cmd_if_shell_entry = { .name = "if-shell", *************** *** 49,59 **** }; struct cmd_if_shell_data { ! struct cmd_parse_input input; - char *cmd_if; - char *cmd_else; - struct client *client; struct cmdq_item *item; }; --- 49,57 ---- }; struct cmd_if_shell_data { ! struct cmd_list *cmd_if; ! struct cmd_list *cmd_else; struct client *client; struct cmdq_item *item; }; *************** *** 63,108 **** { struct args *args = cmd_get_args(self); 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, *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_string(args, 0)); if (args_has(args, 'F')) { if (*shellcmd != '0' && *shellcmd != '\0') ! cmd = args_string(args, 1); else if (count == 3) ! cmd = args_string(args, 2); ! free(shellcmd); ! if (cmd == NULL) return (CMD_RETURN_NORMAL); - - memset(&pi, 0, sizeof pi); - cmd_get_source(self, &pi.file, &pi.line); - pi.item = item; - pi.c = tc; - cmd_find_copy_state(&pi.fs, target); - - status = cmd_parse_and_insert(cmd, &pi, item, state, &error); - if (status == CMD_PARSE_ERROR) { - cmdq_error(item, "%s", error); - free(error); - return (CMD_RETURN_ERROR); } return (CMD_RETURN_NORMAL); } cdata = xcalloc(1, sizeof *cdata); ! 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); --- 61,102 ---- { struct args *args = cmd_get_args(self); struct cmd_find_state *target = cmdq_get_target(item); struct cmd_if_shell_data *cdata; ! struct cmdq_item *new_item; ! char *shellcmd; struct client *tc = cmdq_get_target_client(item); struct session *s = target->s; ! struct cmd_list *cmdlist = NULL; u_int count = args_count(args); shellcmd = format_single_from_target(item, args_string(args, 0)); if (args_has(args, 'F')) { if (*shellcmd != '0' && *shellcmd != '\0') ! cmdlist = args_make_commands_now(self, item, 1); else if (count == 3) ! cmdlist = args_make_commands_now(self, item, 2); ! else { ! free(shellcmd); return (CMD_RETURN_NORMAL); } + free(shellcmd); + if (cmdlist == NULL) + return (CMD_RETURN_ERROR); + new_item = cmdq_get_command(cmdlist, cmdq_get_state(item)); + cmdq_insert_after(item, new_item); return (CMD_RETURN_NORMAL); } cdata = xcalloc(1, sizeof *cdata); ! cdata->cmd_if = args_make_commands_now(self, item, 1); ! if (cdata->cmd_if == NULL) ! return (CMD_RETURN_ERROR); ! if (count == 3) { ! cdata->cmd_else = args_make_commands_now(self, item, 2); ! if (cdata->cmd_else == NULL) ! return (CMD_RETURN_ERROR); ! } if (!args_has(args, 'b')) cdata->client = cmdq_get_client(item); *************** *** 114,127 **** if (!args_has(args, 'b')) cdata->item = item; - cmd_get_source(self, &file, &cdata->input.line); - if (file != NULL) - cdata->input.file = xstrdup(file); - cdata->input.c = tc; - if (cdata->input.c != NULL) - cdata->input.c->references++; - cmd_find_copy_state(&cdata->input.fs, target); - if (job_run(shellcmd, 0, NULL, s, server_client_get_cwd(cmdq_get_client(item), s), NULL, cmd_if_shell_callback, cmd_if_shell_free, cdata, 0, -1, --- 108,113 ---- *************** *** 143,186 **** { struct cmd_if_shell_data *cdata = job_get_data(job); struct client *c = cdata->client; ! struct cmdq_item *new_item = NULL; ! struct cmdq_state *new_state = NULL; ! char *cmd; int status; - struct cmd_parse_result *pr; status = job_get_status(job); if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) ! cmd = cdata->cmd_else; else ! cmd = cdata->cmd_if; ! if (cmd == NULL) goto out; ! pr = cmd_parse_from_string(cmd, &cdata->input); ! switch (pr->status) { ! case CMD_PARSE_ERROR: ! if (cdata->item != NULL) ! cmdq_error(cdata->item, "%s", pr->error); ! free(pr->error); ! break; ! case CMD_PARSE_SUCCESS: ! if (cdata->item == NULL) ! new_state = cmdq_new_state(NULL, NULL, 0); ! else ! new_state = cmdq_get_state(cdata->item); ! new_item = cmdq_get_command(pr->cmdlist, new_state); ! if (cdata->item == NULL) ! cmdq_free_state(new_state); ! cmd_list_free(pr->cmdlist); ! break; } - if (new_item != NULL) { - if (cdata->item == NULL) - cmdq_append(c, new_item); - else - cmdq_insert_after(cdata->item, new_item); - } out: if (cdata->item != NULL) --- 129,153 ---- { struct cmd_if_shell_data *cdata = job_get_data(job); struct client *c = cdata->client; ! struct cmdq_item *item = cdata->item, *new_item; ! struct cmd_list *cmdlist; int status; status = job_get_status(job); if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) ! cmdlist = cdata->cmd_else; else ! cmdlist = cdata->cmd_if; ! if (cmdlist == NULL) goto out; ! if (item == NULL) { ! new_item = cmdq_get_command(cmdlist, NULL); ! cmdq_append(c, new_item); ! } else { ! new_item = cmdq_get_command(cmdlist, cmdq_get_state(item)); ! cmdq_insert_after(item, new_item); } out: if (cdata->item != NULL) *************** *** 195,206 **** if (cdata->client != NULL) server_client_unref(cdata->client); ! free(cdata->cmd_else); ! free(cdata->cmd_if); ! ! if (cdata->input.c != NULL) ! server_client_unref(cdata->input.c); ! free((void *)cdata->input.file); free(cdata); } --- 162,170 ---- if (cdata->client != NULL) server_client_unref(cdata->client); ! if (cdata->cmd_else != NULL) ! cmd_list_free(cdata->cmd_else); ! cmd_list_free(cdata->cmd_if); free(cdata); }