Merge branch 'obsd-master'

This commit is contained in:
Thomas Adam 2016-03-03 16:01:11 +00:00
commit 6c35d17800
5 changed files with 82 additions and 33 deletions

View File

@ -400,6 +400,7 @@ int
cmd_find_get_session(struct cmd_find_state *fs, const char *session) cmd_find_get_session(struct cmd_find_state *fs, const char *session)
{ {
struct session *s, *s_loop; struct session *s, *s_loop;
struct client *c;
log_debug("%s: %s", __func__, session); log_debug("%s: %s", __func__, session);
@ -416,6 +417,13 @@ cmd_find_get_session(struct cmd_find_state *fs, const char *session)
if (fs->s != NULL) if (fs->s != NULL)
return (0); return (0);
/* Look for as a client. */
c = cmd_find_client(NULL, session, 1);
if (c != NULL && c->session != NULL) {
fs->s = c->session;
return (0);
}
/* Stop now if exact only. */ /* Stop now if exact only. */
if (fs->flags & CMD_FIND_EXACT_SESSION) if (fs->flags & CMD_FIND_EXACT_SESSION)
return (-1); return (-1);
@ -1208,7 +1216,7 @@ cmd_find_client(struct cmd_q *cmdq, const char *target, int quiet)
const char *path; const char *path;
/* A NULL argument means the current client. */ /* A NULL argument means the current client. */
if (target == NULL) { if (cmdq != NULL && target == NULL) {
c = cmd_find_current_client(cmdq); c = cmd_find_current_client(cmdq);
if (c == NULL && !quiet) if (c == NULL && !quiet)
cmdq_error(cmdq, "no current client"); cmdq_error(cmdq, "no current client");

View File

@ -47,7 +47,7 @@ cmd_set_environment_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct args *args = self->args; struct args *args = self->args;
struct environ *env; struct environ *env;
const char *name, *value; const char *name, *value, *target;
name = args->argv[0]; name = args->argv[0];
if (*name == '\0') { if (*name == '\0') {
@ -64,10 +64,19 @@ cmd_set_environment_exec(struct cmd *self, struct cmd_q *cmdq)
else else
value = args->argv[1]; value = args->argv[1];
if (args_has(self->args, 'g') || cmdq->state.tflag.s == NULL) if (args_has(self->args, 'g'))
env = global_environ; env = global_environ;
else else {
if (cmdq->state.tflag.s == NULL) {
target = args_get(args, 't');
if (target != NULL)
cmdq_error(cmdq, "no such session: %s", target);
else
cmdq_error(cmdq, "no current session");
return (CMD_RETURN_ERROR);
}
env = cmdq->state.tflag.s->environ; env = cmdq->state.tflag.s->environ;
}
if (args_has(self->args, 'u')) { if (args_has(self->args, 'u')) {
if (value != NULL) { if (value != NULL) {

View File

@ -100,7 +100,7 @@ cmd_set_option_exec(struct cmd *self, struct cmd_q *cmdq)
struct client *c; struct client *c;
const struct options_table_entry *oe; const struct options_table_entry *oe;
struct options *oo; struct options *oo;
const char *optstr, *valstr; const char *optstr, *valstr, *target;
/* Get the option name and value. */ /* Get the option name and value. */
optstr = args->argv[0]; optstr = args->argv[0];
@ -140,29 +140,29 @@ cmd_set_option_exec(struct cmd *self, struct cmd_q *cmdq)
else if (oe->scope == OPTIONS_TABLE_WINDOW) { else if (oe->scope == OPTIONS_TABLE_WINDOW) {
if (args_has(self->args, 'g')) if (args_has(self->args, 'g'))
oo = global_w_options; oo = global_w_options;
else { else if (wl == NULL) {
if (wl == NULL) { target = args_get(args, 't');
cmdq_error(cmdq, if (target != NULL) {
"couldn't set '%s'%s", optstr, cmdq_error(cmdq, "no such window: %s",
(!args_has(args, 't') && !args_has(args, target);
'g')) ? " need target window or -g" : ""); } else
return (CMD_RETURN_ERROR); cmdq_error(cmdq, "no current window");
} return (CMD_RETURN_ERROR);
} else
oo = wl->window->options; oo = wl->window->options;
}
} else if (oe->scope == OPTIONS_TABLE_SESSION) { } else if (oe->scope == OPTIONS_TABLE_SESSION) {
if (args_has(self->args, 'g')) if (args_has(self->args, 'g'))
oo = global_s_options; oo = global_s_options;
else { else if (s == NULL) {
if (s == NULL) { target = args_get(args, 't');
cmdq_error(cmdq, if (target != NULL) {
"couldn't set '%s'%s", optstr, cmdq_error(cmdq, "no such session: %s",
(!args_has(args, 't') && !args_has(args, target);
'g')) ? " need target session or -g" : ""); } else
return (CMD_RETURN_ERROR); cmdq_error(cmdq, "no current session");
} return (CMD_RETURN_ERROR);
} else
oo = s->options; oo = s->options;
}
} else { } else {
cmdq_error(cmdq, "unknown table"); cmdq_error(cmdq, "unknown table");
return (CMD_RETURN_ERROR); return (CMD_RETURN_ERROR);

View File

@ -93,11 +93,28 @@ cmd_show_environment_exec(struct cmd *self, struct cmd_q *cmdq)
struct args *args = self->args; struct args *args = self->args;
struct environ *env; struct environ *env;
struct environ_entry *envent; struct environ_entry *envent;
const char *target;
if (args_has(self->args, 'g') || cmdq->state.tflag.s == NULL) if ((target = args_get(args, 't')) != NULL) {
if (cmdq->state.tflag.s == NULL) {
cmdq_error(cmdq, "no such session: %s", target);
return (CMD_RETURN_ERROR);
}
}
if (args_has(self->args, 'g'))
env = global_environ; env = global_environ;
else else {
if (cmdq->state.tflag.s == NULL) {
target = args_get(args, 't');
if (target != NULL)
cmdq_error(cmdq, "no such session: %s", target);
else
cmdq_error(cmdq, "no current session");
return (CMD_RETURN_ERROR);
}
env = cmdq->state.tflag.s->environ; env = cmdq->state.tflag.s->environ;
}
if (args->argc != 0) { if (args->argc != 0) {
envent = environ_find(env, args->argv[0]); envent = environ_find(env, args->argv[0]);

View File

@ -63,12 +63,13 @@ const struct cmd_entry cmd_show_window_options_entry = {
enum cmd_retval enum cmd_retval
cmd_show_options_exec(struct cmd *self, struct cmd_q *cmdq) cmd_show_options_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct args *args = self->args; struct args *args = self->args;
struct session *s = cmdq->state.tflag.s; struct session *s = cmdq->state.tflag.s;
struct winlink *wl = cmdq->state.tflag.wl; struct winlink *wl = cmdq->state.tflag.wl;
struct options *oo; struct options *oo;
enum options_table_scope scope; enum options_table_scope scope;
int quiet; int quiet;
const char *target;
if (args_has(self->args, 's')) { if (args_has(self->args, 's')) {
oo = global_options; oo = global_options;
@ -78,13 +79,27 @@ cmd_show_options_exec(struct cmd *self, struct cmd_q *cmdq)
scope = OPTIONS_TABLE_WINDOW; scope = OPTIONS_TABLE_WINDOW;
if (args_has(self->args, 'g')) if (args_has(self->args, 'g'))
oo = global_w_options; oo = global_w_options;
else else if (wl == NULL) {
target = args_get(args, 't');
if (target != NULL) {
cmdq_error(cmdq, "no such window: %s", target);
} else
cmdq_error(cmdq, "no current window");
return (CMD_RETURN_ERROR);
} else
oo = wl->window->options; oo = wl->window->options;
} else { } else {
scope = OPTIONS_TABLE_SESSION; scope = OPTIONS_TABLE_SESSION;
if (args_has(self->args, 'g')) if (args_has(self->args, 'g'))
oo = global_s_options; oo = global_s_options;
else else if (s == NULL) {
target = args_get(args, 't');
if (target != NULL) {
cmdq_error(cmdq, "no such session: %s", target);
} else
cmdq_error(cmdq, "no current session");
return (CMD_RETURN_ERROR);
} else
oo = s->options; oo = s->options;
} }