summaryrefslogtreecommitdiffstats
path: root/cmd-set-option.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2011-03-29 21:09:13 +0000
committerNicholas Marriott <nicm@openbsd.org>2011-03-29 21:09:13 +0000
commitf7e9aedf10b2165838daf40b6a71ab764f0a0dee (patch)
tree020f1d6f47719f8c16d8ff53da26eb269b391daa /cmd-set-option.c
parentbeb6db9b5f60b34b69b8cbe44a6422e84f582465 (diff)
For convenience, work out what type of option is being set by name
regardless of the -s or -w flags (these remain documented however).
Diffstat (limited to 'cmd-set-option.c')
-rw-r--r--cmd-set-option.c105
1 files changed, 65 insertions, 40 deletions
diff --git a/cmd-set-option.c b/cmd-set-option.c
index fffbc5b4..a0f7f447 100644
--- a/cmd-set-option.c
+++ b/cmd-set-option.c
@@ -29,6 +29,9 @@
int cmd_set_option_exec(struct cmd *, struct cmd_ctx *);
+int cmd_set_option_find(const char *, const struct options_table_entry **,
+ const struct options_table_entry **);
+
int cmd_set_option_unset(struct cmd *, struct cmd_ctx *,
const struct options_table_entry *, struct options *,
const char *);
@@ -78,11 +81,44 @@ const struct cmd_entry cmd_set_window_option_entry = {
cmd_set_option_exec
};
+/* Look for an option in all three tables. */
+int
+cmd_set_option_find(
+ const char *optstr, const struct options_table_entry **table,
+ const struct options_table_entry **oe)
+{
+ static const struct options_table_entry *tables[] = {
+ server_options_table,
+ window_options_table,
+ session_options_table
+ };
+ const struct options_table_entry *oe_loop;
+ u_int i;
+
+ for (i = 0; i < nitems(tables); i++) {
+ for (oe_loop = tables[i]; oe_loop->name != NULL; oe_loop++) {
+ if (strncmp(oe_loop->name, optstr, strlen(optstr)) != 0)
+ continue;
+
+ /* If already found, ambiguous. */
+ if (*oe != NULL)
+ return (-1);
+ *oe = oe_loop;
+ *table = tables[i];
+
+ /* Bail now if an exact match. */
+ if (strcmp((*oe)->name, optstr) == 0)
+ break;
+ }
+ }
+ return (0);
+}
+
int
cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct args *args = self->args;
- const struct options_table_entry *table, *oe, *oe_loop;
+ const struct options_table_entry *table, *oe;
struct session *s;
struct winlink *wl;
struct client *c;
@@ -90,13 +126,32 @@ cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
const char *optstr, *valstr;
u_int i;
- /* Work out the options tree and table to use. */
- if (args_has(self->args, 's')) {
+ /* Get the option name and value. */
+ optstr = args->argv[0];
+ if (*optstr == '\0') {
+ ctx->error(ctx, "invalid option");
+ return (-1);
+ }
+ if (args->argc < 2)
+ valstr = NULL;
+ else
+ valstr = args->argv[1];
+
+ /* Find the option entry, try each table. */
+ table = oe = NULL;
+ if (cmd_set_option_find(optstr, &table, &oe) != 0) {
+ ctx->error(ctx, "ambiguous option: %s", optstr);
+ return (-1);
+ }
+ if (oe == NULL) {
+ ctx->error(ctx, "unknown option: %s", optstr);
+ return (-1);
+ }
+
+ /* Work out the tree from the table. */
+ if (table == server_options_table)
oo = &global_options;
- table = server_options_table;
- } else if (args_has(self->args, 'w') ||
- self->entry == &cmd_set_window_option_entry) {
- table = window_options_table;
+ else if (table == window_options_table) {
if (args_has(self->args, 'g'))
oo = &global_w_options;
else {
@@ -105,8 +160,7 @@ cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
return (-1);
oo = &wl->window->options;
}
- } else {
- table = session_options_table;
+ } else if (table == session_options_table) {
if (args_has(self->args, 'g'))
oo = &global_s_options;
else {
@@ -115,37 +169,8 @@ cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
return (-1);
oo = &s->options;
}
- }
-
- /* Get the option name and value. */
- optstr = args->argv[0];
- if (*optstr == '\0') {
- ctx->error(ctx, "invalid option");
- return (-1);
- }
- if (args->argc < 2)
- valstr = NULL;
- else
- valstr = args->argv[1];
-
- /* Find the option table entry. */
- oe = NULL;
- for (oe_loop = table; oe_loop->name != NULL; oe_loop++) {
- if (strncmp(oe_loop->name, optstr, strlen(optstr)) != 0)
- continue;
-
- if (oe != NULL) {
- ctx->error(ctx, "ambiguous option: %s", optstr);
- return (-1);
- }
- oe = oe_loop;
-
- /* Bail now if an exact match. */
- if (strcmp(oe->name, optstr) == 0)
- break;
- }
- if (oe == NULL) {
- ctx->error(ctx, "unknown option: %s", optstr);
+ } else {
+ ctx->error(ctx, "unknown table");
return (-1);
}