=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-queue.c,v retrieving revision 1.88 retrieving revision 1.89 diff -u -r1.88 -r1.89 --- src/usr.bin/tmux/cmd-queue.c 2020/04/13 15:55:51 1.88 +++ src/usr.bin/tmux/cmd-queue.c 2020/04/13 20:51:57 1.89 @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-queue.c,v 1.88 2020/04/13 15:55:51 nicm Exp $ */ +/* $OpenBSD: cmd-queue.c,v 1.89 2020/04/13 20:51:57 nicm Exp $ */ /* * Copyright (c) 2013 Nicholas Marriott @@ -42,6 +42,7 @@ struct cmdq_item *next; struct client *client; + struct client *target_client; enum cmdq_type type; u_int group; @@ -145,6 +146,13 @@ return (item->client); } +/* Get item target client. */ +struct client * +cmdq_get_target_client(struct cmdq_item *item) +{ + return (item->target_client); +} + /* Get item state. */ struct cmdq_state * cmdq_get_state(struct cmdq_item *item) @@ -483,14 +491,15 @@ static enum cmd_retval cmdq_fire_command(struct cmdq_item *item) { - struct client *c = item->client; - const char *name = cmdq_name(c); + const char *name = cmdq_name(item->client); struct cmdq_state *state = item->state; struct cmd *cmd = item->cmd; + struct args *args = cmd_get_args(cmd); const struct cmd_entry *entry = cmd_get_entry(cmd); + struct client *tc, *saved = item->client; enum cmd_retval retval; struct cmd_find_state *fsp, fs; - int flags; + int flags, quiet = 0; char *tmp; if (log_get_level() > 1) { @@ -504,6 +513,25 @@ if (item->client == NULL) item->client = cmd_find_client(item, NULL, 1); + + if (entry->flags & CMD_CLIENT_CANFAIL) + quiet = 1; + if (entry->flags & CMD_CLIENT_CFLAG) { + tc = cmd_find_client(item, args_get(args, 'c'), quiet); + if (tc == NULL && !quiet) { + retval = CMD_RETURN_ERROR; + goto out; + } + } else if (entry->flags & CMD_CLIENT_TFLAG) { + tc = cmd_find_client(item, args_get(args, 't'), quiet); + if (tc == NULL && !quiet) { + retval = CMD_RETURN_ERROR; + goto out; + } + } else + tc = cmd_find_client(item, NULL, 1); + item->target_client = tc; + retval = cmdq_find_flag(item, &item->source, &entry->source); if (retval == CMD_RETURN_ERROR) goto out; @@ -511,6 +539,7 @@ if (retval == CMD_RETURN_ERROR) goto out; + retval = entry->exec(cmd, item); if (retval == CMD_RETURN_ERROR) goto out; @@ -528,7 +557,7 @@ } out: - item->client = c; + item->client = saved; if (retval == CMD_RETURN_ERROR) cmdq_guard(item, "error", flags); else