summaryrefslogtreecommitdiffstats
path: root/server-client.c
diff options
context:
space:
mode:
authornicm <nicm>2022-05-30 12:55:25 +0000
committernicm <nicm>2022-05-30 12:55:25 +0000
commit0a8f356c7278dba34a526adea03561f2063df359 (patch)
tree94ec991bb58019e824a6142f8711aa982d91a24c /server-client.c
parentaf611815ea70d687a15e20426ed1b88017d3d248 (diff)
Spacing/style nits.
Diffstat (limited to 'server-client.c')
-rw-r--r--server-client.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/server-client.c b/server-client.c
index a2a367be..7c4c2fdd 100644
--- a/server-client.c
+++ b/server-client.c
@@ -2775,6 +2775,14 @@ server_client_dispatch(struct imsg *imsg, void *arg)
}
}
+/* Callback when command is not allowed. */
+static enum cmd_retval
+server_client_read_only(struct cmdq_item *item, __unused void *data)
+{
+ cmdq_error(item, "client is read-only");
+ return (CMD_RETURN_ERROR);
+}
+
/* Callback when command is done. */
static enum cmd_retval
server_client_command_done(struct cmdq_item *item, __unused void *data)
@@ -2799,6 +2807,7 @@ server_client_dispatch_command(struct client *c, struct imsg *imsg)
char **argv, *cause;
struct cmd_parse_result *pr;
struct args_value *values;
+ struct cmdq_item *new_item;
if (c->flags & CLIENT_EXIT)
return;
@@ -2837,7 +2846,12 @@ server_client_dispatch_command(struct client *c, struct imsg *imsg)
free(values);
cmd_free_argv(argc, argv);
- cmdq_append(c, cmdq_get_command(pr->cmdlist, NULL));
+ if ((c->flags & CLIENT_READONLY) &&
+ !cmd_list_all_have(pr->cmdlist, CMD_READONLY))
+ new_item = cmdq_get_callback(server_client_read_only, NULL);
+ else
+ new_item = cmdq_get_command(pr->cmdlist, NULL);
+ cmdq_append(c, new_item);
cmdq_append(c, cmdq_get_callback(server_client_command_done, NULL));
cmd_list_free(pr->cmdlist);
@@ -3071,9 +3085,11 @@ server_client_set_flags(struct client *c, const char *flags)
continue;
log_debug("client %s set flag %s", c->name, next);
- if (not)
+ if (not) {
+ if (c->flags & CLIENT_READONLY)
+ flag &= ~CLIENT_READONLY;
c->flags &= ~flag;
- else
+ } else
c->flags |= flag;
if (flag == CLIENT_CONTROL_NOOUTPUT)
control_reset_offsets(c);
@@ -3141,7 +3157,7 @@ server_client_add_client_window(struct client *c, u_int id)
cw->window = id;
RB_INSERT(client_windows, &c->windows, cw);
}
- return cw;
+ return (cw);
}
/* Get client active pane. */