Esempio n. 1
0
size_t
cmd_bind_key_print(struct cmd *self, char *buf, size_t len)
{
	struct cmd_bind_key_data	*data = self->data;
	size_t				 off = 0;
	const char			*skey;

	off += xsnprintf(buf, len, "%s", self->entry->name);
	if (data == NULL)
		return (off);

	if (off < len && data->command_key)
		off += xsnprintf(buf + off, len - off, " -c");
	if (off < len && !(data->key & KEYC_PREFIX))
		off += xsnprintf(buf + off, len - off, " -n");
	if (off < len && data->can_repeat)
		off += xsnprintf(buf + off, len - off, " -r");
	if (off < len && data->tablename != NULL)
		off += cmd_prarg(buf + off, len - off, " -t ", data->tablename);
	if (off < len) {
		skey = key_string_lookup_key(data->key & ~KEYC_PREFIX);
		off += xsnprintf(buf + off, len - off, " %s ", skey);
	}
	if (off < len)
		off += cmd_list_print(data->cmdlist, buf + off, len - off);
	return (off);
}
Esempio n. 2
0
static enum cmd_retval
cmd_set_hook_exec(struct cmd *self, struct cmdq_item *item)
{
    struct args	*args = self->args;
    struct cmd_list	*cmdlist;
    struct hooks	*hooks;
    struct hook	*hook;
    char		*cause, *tmp;
    const char	*name, *cmd, *target;

    if (args_has(args, 'g'))
        hooks = global_hooks;
    else {
        if (item->state.tflag.s == NULL) {
            target = args_get(args, 't');
            if (target != NULL)
                cmdq_error(item, "no such session: %s", target);
            else
                cmdq_error(item, "no current session");
            return (CMD_RETURN_ERROR);
        }
        hooks = item->state.tflag.s->hooks;
    }

    if (self->entry == &cmd_show_hooks_entry) {
        hook = hooks_first(hooks);
        while (hook != NULL) {
            tmp = cmd_list_print(hook->cmdlist);
            cmdq_print(item, "%s -> %s", hook->name, tmp);
            free(tmp);

            hook = hooks_next(hook);
        }
        return (CMD_RETURN_NORMAL);
    }

    name = args->argv[0];
    if (*name == '\0') {
        cmdq_error(item, "invalid hook name");
        return (CMD_RETURN_ERROR);
    }
    if (args->argc < 2)
        cmd = NULL;
    else
        cmd = args->argv[1];

    if (args_has(args, 'u')) {
        if (cmd != NULL) {
            cmdq_error(item, "command passed to unset hook: %s",
                       name);
            return (CMD_RETURN_ERROR);
        }
        hooks_remove(hooks, name);
        return (CMD_RETURN_NORMAL);
    }

    if (cmd == NULL) {
        cmdq_error(item, "no command to set hook: %s", name);
        return (CMD_RETURN_ERROR);
    }
    if (cmd_string_parse(cmd, &cmdlist, NULL, 0, &cause) != 0) {
        if (cause != NULL) {
            cmdq_error(item, "%s", cause);
            free(cause);
        }
        return (CMD_RETURN_ERROR);
    }
    hooks_add(hooks, name, cmdlist);
    cmd_list_free(cmdlist);

    return (CMD_RETURN_NORMAL);
}