summaryrefslogtreecommitdiffstats
path: root/cmd-queue.c
diff options
context:
space:
mode:
authornicm <nicm>2020-04-13 20:51:57 +0000
committernicm <nicm>2020-04-13 20:51:57 +0000
commit3f7f9a0e20522c73e33480673496240f1bac724b (patch)
treec0ec19a026014bfd6981622ecd9ee2783344ef25 /cmd-queue.c
parent187277eaadc4a675659bf7ede88f50bfe6cc7be9 (diff)
Make client -c and -t handling common in cmd-queue.c and try to be
clearer about whether the client is the target client (must have a session) or not.
Diffstat (limited to 'cmd-queue.c')
-rw-r--r--cmd-queue.c37
1 files changed, 33 insertions, 4 deletions
diff --git a/cmd-queue.c b/cmd-queue.c
index 97d19f81..16c58401 100644
--- a/cmd-queue.c
+++ b/cmd-queue.c
@@ -42,6 +42,7 @@ struct cmdq_item {
struct cmdq_item *next;
struct client *client;
+ struct client *target_client;
enum cmdq_type type;
u_int group;
@@ -145,6 +146,13 @@ cmdq_get_client(struct cmdq_item *item)
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 @@ cmdq_find_flag(struct cmdq_item *item, struct cmd_find_state *fs,
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 @@ cmdq_fire_command(struct cmdq_item *item)
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 @@ cmdq_fire_command(struct cmdq_item *item)
if (retval == CMD_RETURN_ERROR)
goto out;
+
retval = entry->exec(cmd, item);
if (retval == CMD_RETURN_ERROR)
goto out;
@@ -528,7 +557,7 @@ cmdq_fire_command(struct cmdq_item *item)
}
out:
- item->client = c;
+ item->client = saved;
if (retval == CMD_RETURN_ERROR)
cmdq_guard(item, "error", flags);
else