diff options
author | Thomas Adam <thomas@xteddy.org> | 2019-04-27 20:09:07 +0100 |
---|---|---|
committer | Thomas Adam <thomas@xteddy.org> | 2019-04-27 20:09:07 +0100 |
commit | 5489796737108cb9bba01f831421e531a50b946b (patch) | |
tree | 4f3c2727315adabaf5d932a1d81d4fad3e491752 /cmd-queue.c | |
parent | 85f09f9a4cf52b5af6b84464ea643c7c3686b0ad (diff) | |
parent | dfb7bb683057d08303955c49073f4b475bd0e2d6 (diff) | |
download | rtmux-5489796737108cb9bba01f831421e531a50b946b.tar.gz rtmux-5489796737108cb9bba01f831421e531a50b946b.tar.bz2 rtmux-5489796737108cb9bba01f831421e531a50b946b.zip |
Merge branch 'obsd-master'
Diffstat (limited to 'cmd-queue.c')
-rw-r--r-- | cmd-queue.c | 56 |
1 files changed, 55 insertions, 1 deletions
diff --git a/cmd-queue.c b/cmd-queue.c index 03fd5f10..9ce25f5f 100644 --- a/cmd-queue.c +++ b/cmd-queue.c @@ -98,6 +98,60 @@ cmdq_insert_after(struct cmdq_item *after, struct cmdq_item *item) } while (item != NULL); } + +/* Insert a hook. */ +void +cmdq_insert_hook(struct session *s, struct cmdq_item *item, + struct cmd_find_state *fs, const char *fmt, ...) +{ + struct options *oo; + va_list ap; + char *name; + struct cmdq_item *new_item; + struct options_entry *o; + struct options_array_item *a; + struct cmd_list *cmdlist; + + if (item->flags & CMDQ_NOHOOKS) + return; + if (s == NULL) + oo = global_s_options; + else + oo = s->options; + + va_start(ap, fmt); + xvasprintf(&name, fmt, ap); + va_end(ap); + + o = options_get(oo, name); + if (o == NULL) { + free(name); + return; + } + log_debug("running hook %s (parent %p)", name, item); + + a = options_array_first(o); + while (a != NULL) { + cmdlist = options_array_item_value(a)->cmdlist; + if (cmdlist == NULL) { + a = options_array_next(a); + continue; + } + + new_item = cmdq_get_command(cmdlist, fs, NULL, CMDQ_NOHOOKS); + cmdq_format(new_item, "hook", "%s", name); + if (item != NULL) { + cmdq_insert_after(item, new_item); + item = new_item; + } else + cmdq_append(NULL, new_item); + + a = options_array_next(a); + } + + free(name); +} + /* Remove an item. */ static void cmdq_remove(struct cmdq_item *item) @@ -245,7 +299,7 @@ cmdq_fire_command(struct cmdq_item *item) fsp = &fs; else goto out; - hooks_insert(fsp->s->hooks, item, fsp, "after-%s", entry->name); + cmdq_insert_hook(fsp->s, item, fsp, "after-%s", entry->name); } out: |