=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-queue.c,v retrieving revision 1.53 retrieving revision 1.54 diff -c -r1.53 -r1.54 *** src/usr.bin/tmux/cmd-queue.c 2017/04/21 22:23:24 1.53 --- src/usr.bin/tmux/cmd-queue.c 2017/04/22 10:22:39 1.54 *************** *** 1,4 **** ! /* $OpenBSD: cmd-queue.c,v 1.53 2017/04/21 22:23:24 nicm Exp $ */ /* * Copyright (c) 2013 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-queue.c,v 1.54 2017/04/22 10:22:39 nicm Exp $ */ /* * Copyright (c) 2013 Nicholas Marriott *************** *** 189,202 **** return (first); } /* Fire command on command queue. */ static enum cmd_retval cmdq_fire_command(struct cmdq_item *item) { struct client *c = item->client; struct cmd *cmd = item->cmd; enum cmd_retval retval; - const char *name; struct cmd_find_state *fsp, fs; int flags; --- 189,222 ---- return (first); } + /* Fill in flag for a command. */ + static enum cmd_retval + cmdq_find_flag(struct cmdq_item *item, struct cmd_find_state *fs, + const struct cmd_entry_flag *flag) + { + const char *value; + + if (flag->flag == 0) { + cmd_find_clear_state(fs, 0); + return (CMD_RETURN_NORMAL); + } + + value = args_get(item->cmd->args, flag->flag); + if (cmd_find_target(fs, item, value, flag->type, flag->flags) != 0) { + cmd_find_clear_state(fs, 0); + return (CMD_RETURN_ERROR); + } + return (CMD_RETURN_NORMAL); + } + /* Fire command on command queue. */ static enum cmd_retval cmdq_fire_command(struct cmdq_item *item) { struct client *c = item->client; struct cmd *cmd = item->cmd; + const struct cmd_entry *entry = cmd->entry; enum cmd_retval retval; struct cmd_find_state *fsp, fs; int flags; *************** *** 205,231 **** if (item->client == NULL) item->client = cmd_find_client(item, NULL, 1); ! ! if (cmd_prepare_state(cmd, item) != 0) { ! retval = CMD_RETURN_ERROR; goto out; ! } ! retval = cmd->entry->exec(cmd, item); if (retval == CMD_RETURN_ERROR) goto out; ! if (cmd->entry->flags & CMD_AFTERHOOK) { ! name = cmd->entry->name; ! if (cmd_find_valid_state(&item->state.tflag)) ! fsp = &item->state.tflag; else if (cmd_find_valid_state(&item->shared->current)) fsp = &item->shared->current; else if (cmd_find_from_client(&fs, item->client) == 0) fsp = &fs; else goto out; ! hooks_insert(fsp->s->hooks, item, fsp, "after-%s", name); } out: --- 225,251 ---- if (item->client == NULL) item->client = cmd_find_client(item, NULL, 1); ! retval = cmdq_find_flag(item, &item->source, &entry->source); ! if (retval == CMD_RETURN_ERROR) goto out; ! retval = cmdq_find_flag(item, &item->target, &entry->target); ! if (retval == CMD_RETURN_ERROR) ! goto out; ! retval = entry->exec(cmd, item); if (retval == CMD_RETURN_ERROR) goto out; ! if (entry->flags & CMD_AFTERHOOK) { ! if (cmd_find_valid_state(&item->target)) ! fsp = &item->target; else if (cmd_find_valid_state(&item->shared->current)) fsp = &item->shared->current; else if (cmd_find_from_client(&fs, item->client) == 0) fsp = &fs; else goto out; ! hooks_insert(fsp->s->hooks, item, fsp, "after-%s", entry->name); } out: