示例#1
0
文件: control.c 项目: vzar/asterisk
char *stasis_app_control_get_channel_var(struct stasis_app_control *control, const char *variable)
{
    RAII_VAR(struct ast_str *, tmp, ast_str_create(32), ast_free);

    /* You may be tempted to lock the channel you're about to read from. You
     * would be wrong. Some dialplan functions put the channel into
     * autoservice, which deadlocks if the channel is already locked.
     * ast_str_retrieve_variable() does its own locking, and the dialplan
     * functions need to as well. We should be fine without the lock.
     */

    if (!tmp) {
        return NULL;
    }

    if (variable[strlen(variable) - 1] == ')') {
        if (ast_func_read2(control->channel, variable, &tmp, 0)) {
            return NULL;
        }
    } else {
        if (!ast_str_retrieve_variable(&tmp, 0, control->channel, NULL, variable)) {
            return NULL;
        }
    }

    return ast_strdup(ast_str_buffer(tmp));
}
示例#2
0
char *stasis_app_control_get_channel_var(struct stasis_app_control *control, const char *variable)
{
	RAII_VAR(struct ast_str *, tmp, ast_str_create(32), ast_free);
	SCOPED_CHANNELLOCK(lockvar, control->channel);

	if (!tmp) {
		return NULL;
	}

	if (variable[strlen(variable) - 1] == ')') {
		if (ast_func_read2(control->channel, variable, &tmp, 0)) {
			return NULL;
		}
	} else {
		if (!ast_str_retrieve_variable(&tmp, 0, control->channel, NULL, variable)) {
			return NULL;
		}
	}

	return ast_strdup(ast_str_buffer(tmp));
}