version 1.49, 2011/03/29 21:07:08 |
version 1.50, 2011/03/29 21:09:13 |
|
|
|
|
int cmd_set_option_exec(struct cmd *, struct cmd_ctx *); |
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 *, |
int cmd_set_option_unset(struct cmd *, struct cmd_ctx *, |
const struct options_table_entry *, struct options *, |
const struct options_table_entry *, struct options *, |
const char *); |
const char *); |
|
|
cmd_set_option_exec |
cmd_set_option_exec |
}; |
}; |
|
|
|
/* Look for an option in all three tables. */ |
int |
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) |
cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx) |
{ |
{ |
struct args *args = self->args; |
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 session *s; |
struct winlink *wl; |
struct winlink *wl; |
struct client *c; |
struct client *c; |
|
|
const char *optstr, *valstr; |
const char *optstr, *valstr; |
u_int i; |
u_int i; |
|
|
/* Work out the options tree and table to use. */ |
/* Get the option name and value. */ |
if (args_has(self->args, 's')) { |
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; |
oo = &global_options; |
table = server_options_table; |
else if (table == window_options_table) { |
} else if (args_has(self->args, 'w') || |
|
self->entry == &cmd_set_window_option_entry) { |
|
table = window_options_table; |
|
if (args_has(self->args, 'g')) |
if (args_has(self->args, 'g')) |
oo = &global_w_options; |
oo = &global_w_options; |
else { |
else { |
|
|
return (-1); |
return (-1); |
oo = &wl->window->options; |
oo = &wl->window->options; |
} |
} |
} else { |
} else if (table == session_options_table) { |
table = session_options_table; |
|
if (args_has(self->args, 'g')) |
if (args_has(self->args, 'g')) |
oo = &global_s_options; |
oo = &global_s_options; |
else { |
else { |
|
|
return (-1); |
return (-1); |
oo = &s->options; |
oo = &s->options; |
} |
} |
} |
} else { |
|
ctx->error(ctx, "unknown table"); |
/* 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); |
|
return (-1); |
return (-1); |
} |
} |
|
|