aboutsummaryrefslogtreecommitdiff
path: root/cmd-queue.c
diff options
context:
space:
mode:
Diffstat (limited to 'cmd-queue.c')
-rw-r--r--cmd-queue.c66
1 files changed, 64 insertions, 2 deletions
diff --git a/cmd-queue.c b/cmd-queue.c
index 59f86c64..a40053a6 100644
--- a/cmd-queue.c
+++ b/cmd-queue.c
@@ -341,9 +341,15 @@ cmdq_insert_hook(struct session *s, struct cmdq_item *item,
struct cmd_find_state *current, const char *fmt, ...)
{
struct cmdq_state *state = item->state;
+ struct cmd *cmd = item->cmd;
+ struct args *args = cmd_get_args(cmd);
+ struct args_entry *entryp;
+ struct args_value *valuep;
struct options *oo;
va_list ap;
- char *name;
+ char *name, tmp[32], flag, *arguments;
+ int i;
+ const char *value;
struct cmdq_item *new_item;
struct cmdq_state *new_state;
struct options_entry *o;
@@ -375,6 +381,37 @@ cmdq_insert_hook(struct session *s, struct cmdq_item *item,
new_state = cmdq_new_state(current, &state->event, CMDQ_STATE_NOHOOKS);
cmdq_add_format(new_state, "hook", "%s", name);
+ arguments = args_print(args);
+ cmdq_add_format(new_state, "hook_arguments", "%s", arguments);
+ free(arguments);
+
+ for (i = 0; i < args->argc; i++) {
+ xsnprintf(tmp, sizeof tmp, "hook_argument_%d", i);
+ cmdq_add_format(new_state, tmp, "%s", args->argv[i]);
+ }
+ flag = args_first(args, &entryp);
+ while (flag != 0) {
+ value = args_get(args, flag);
+ if (value == NULL) {
+ xsnprintf(tmp, sizeof tmp, "hook_flag_%c", flag);
+ cmdq_add_format(new_state, tmp, "1");
+ } else {
+ xsnprintf(tmp, sizeof tmp, "hook_flag_%c", flag);
+ cmdq_add_format(new_state, tmp, "%s", value);
+ }
+
+ i = 0;
+ value = args_first_value(args, flag, &valuep);
+ while (value != NULL) {
+ xsnprintf(tmp, sizeof tmp, "hook_flag_%c_%d", flag, i);
+ cmdq_add_format(new_state, tmp, "%s", value);
+ i++;
+ value = args_next_value(&valuep);
+ }
+
+ flag = args_next(&entryp);
+ }
+
a = options_array_first(o);
while (a != NULL) {
cmdlist = options_array_item_value(a)->cmdlist;
@@ -497,6 +534,28 @@ cmdq_find_flag(struct cmdq_item *item, struct cmd_find_state *fs,
return (CMD_RETURN_NORMAL);
}
+/* Add message with command. */
+static void
+cmdq_add_message(struct cmdq_item *item)
+{
+ struct client *c = item->client;
+ struct cmdq_state *state = item->state;
+ const char *name, *key;
+ char *tmp;
+
+ tmp = cmd_print(item->cmd);
+ if (c != NULL) {
+ name = c->name;
+ if (c->session != NULL && state->event.key != KEYC_NONE) {
+ key = key_string_lookup_key(state->event.key);
+ server_add_message("%s key %s: %s", name, key, tmp);
+ } else
+ server_add_message("%s command: %s", name, tmp);
+ } else
+ server_add_message("command: %s", tmp);
+ free(tmp);
+}
+
/* Fire command on command queue. */
static enum cmd_retval
cmdq_fire_command(struct cmdq_item *item)
@@ -512,6 +571,8 @@ cmdq_fire_command(struct cmdq_item *item)
int flags, quiet = 0;
char *tmp;
+ if (cfg_finished)
+ cmdq_add_message(item);
if (log_get_level() > 1) {
tmp = cmd_print(cmd);
log_debug("%s %s: (%u) %s", __func__, name, item->group, tmp);
@@ -782,6 +843,7 @@ cmdq_error(struct cmdq_item *item, const char *fmt, ...)
cmd_get_source(cmd, &file, &line);
cfg_add_cause("%s:%u: %s", file, line, msg);
} else if (c->session == NULL || (c->flags & CLIENT_CONTROL)) {
+ server_add_message("%s message: %s", c->name, msg);
if (~c->flags & CLIENT_UTF8) {
tmp = msg;
msg = utf8_sanitize(tmp);
@@ -794,7 +856,7 @@ cmdq_error(struct cmdq_item *item, const char *fmt, ...)
c->retval = 1;
} else {
*msg = toupper((u_char) *msg);
- status_message_set(c, "%s", msg);
+ status_message_set(c, 1, "%s", msg);
}
free(msg);