diff --git a/apps/app_queue.c b/apps/app_queue.c index 8bbf733dd1fe9aee58a72e50c77618f98a735dc5..5420708e98e57d40f27559ffb3dae00fcf4e0aea 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -3438,11 +3438,15 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce set_queue_variables(qe); ao2_unlock(qe->parent); + ast_channel_lock(qe->chan); + if ((monitorfilename = pbx_builtin_getvar_helper(qe->chan, "MONITOR_FILENAME"))) { + monitorfilename = ast_strdupa(monitorfilename); + } + ast_channel_unlock(qe->chan); /* Begin Monitoring */ if (qe->parent->monfmt && *qe->parent->monfmt) { if (!qe->parent->montype) { ast_debug(1, "Starting Monitor as requested.\n"); - monitorfilename = pbx_builtin_getvar_helper(qe->chan, "MONITOR_FILENAME"); if (pbx_builtin_getvar_helper(qe->chan, "MONITOR_EXEC") || pbx_builtin_getvar_helper(qe->chan, "MONITOR_EXEC_ARGS")) which = qe->chan; else @@ -3457,75 +3461,79 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce ast_monitor_start(which, qe->parent->monfmt, tmpid, 1, X_REC_IN | X_REC_OUT); } } else { - ast_debug(1, "Starting MixMonitor as requested.\n"); - monitorfilename = pbx_builtin_getvar_helper(qe->chan, "MONITOR_FILENAME"); - if (!monitorfilename) { - if (qe->chan->cdr) - ast_copy_string(tmpid, qe->chan->cdr->uniqueid, sizeof(tmpid)); - else - snprintf(tmpid, sizeof(tmpid), "chan-%lx", ast_random()); - } else { - const char *m = monitorfilename; - for (p = tmpid2; p < tmpid2 + sizeof(tmpid2) - 1; p++, m++) { - switch (*m) { - case '^': - if (*(m + 1) == '{') - *p = '$'; - break; - case ',': - *p++ = '\\'; - /* Fall through */ - default: - *p = *m; + mixmonapp = pbx_findapp("MixMonitor"); + + if (mixmonapp) { + ast_debug(1, "Starting MixMonitor as requested.\n"); + if (!monitorfilename) { + if (qe->chan->cdr) + ast_copy_string(tmpid, qe->chan->cdr->uniqueid, sizeof(tmpid)); + else + snprintf(tmpid, sizeof(tmpid), "chan-%lx", ast_random()); + } else { + const char *m = monitorfilename; + for (p = tmpid2; p < tmpid2 + sizeof(tmpid2) - 1; p++, m++) { + switch (*m) { + case '^': + if (*(m + 1) == '{') + *p = '$'; + break; + case ',': + *p++ = '\\'; + /* Fall through */ + default: + *p = *m; + } + if (*m == '\0') + break; } - if (*m == '\0') - break; - } - if (p == tmpid2 + sizeof(tmpid2)) - tmpid2[sizeof(tmpid2) - 1] = '\0'; + if (p == tmpid2 + sizeof(tmpid2)) + tmpid2[sizeof(tmpid2) - 1] = '\0'; - pbx_substitute_variables_helper(qe->chan, tmpid2, tmpid, sizeof(tmpid) - 1); - } - - monitor_exec = pbx_builtin_getvar_helper(qe->chan, "MONITOR_EXEC"); - monitor_options = pbx_builtin_getvar_helper(qe->chan, "MONITOR_OPTIONS"); + pbx_substitute_variables_helper(qe->chan, tmpid2, tmpid, sizeof(tmpid) - 1); + } - if (monitor_exec) { - const char *m = monitor_exec; - for (p = meid2; p < meid2 + sizeof(meid2) - 1; p++, m++) { - switch (*m) { - case '^': - if (*(m + 1) == '{') - *p = '$'; - break; - case ',': - *p++ = '\\'; - /* Fall through */ - default: - *p = *m; - } - if (*m == '\0') - break; + ast_channel_lock(qe->chan); + if ((monitor_exec = pbx_builtin_getvar_helper(qe->chan, "MONITOR_EXEC"))) { + monitor_exec = ast_strdupa(monitor_exec); + } + if ((monitor_options = pbx_builtin_getvar_helper(qe->chan, "MONITOR_OPTIONS"))) { + monitor_options = ast_strdupa(monitor_options); + } else { + monitor_options = ""; } - if (p == meid2 + sizeof(meid2)) - meid2[sizeof(meid2) - 1] = '\0'; + ast_channel_unlock(qe->chan); + + if (monitor_exec) { + const char *m = monitor_exec; + for (p = meid2; p < meid2 + sizeof(meid2) - 1; p++, m++) { + switch (*m) { + case '^': + if (*(m + 1) == '{') + *p = '$'; + break; + case ',': + *p++ = '\\'; + /* Fall through */ + default: + *p = *m; + } + if (*m == '\0') + break; + } + if (p == meid2 + sizeof(meid2)) + meid2[sizeof(meid2) - 1] = '\0'; - pbx_substitute_variables_helper(qe->chan, meid2, meid, sizeof(meid) - 1); - } + pbx_substitute_variables_helper(qe->chan, meid2, meid, sizeof(meid) - 1); + } - snprintf(tmpid2, sizeof(tmpid2), "%s.%s", tmpid, qe->parent->monfmt); + snprintf(tmpid2, sizeof(tmpid2), "%s.%s", tmpid, qe->parent->monfmt); - mixmonapp = pbx_findapp("MixMonitor"); - - if (!monitor_options) - monitor_options = ""; - - if (mixmonapp) { if (!ast_strlen_zero(monitor_exec)) snprintf(mixmonargs, sizeof(mixmonargs), "%s,b%s,%s", tmpid2, monitor_options, monitor_exec); else snprintf(mixmonargs, sizeof(mixmonargs), "%s,b%s", tmpid2, monitor_options); - + ast_debug(1, "Arguments being passed to MixMonitor: %s\n", mixmonargs); /* We purposely lock the CDR so that pbx_exec does not update the application data */ if (qe->chan->cdr) @@ -3534,9 +3542,9 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce if (qe->chan->cdr) ast_clear_flag(qe->chan->cdr, AST_CDR_FLAG_LOCKED); - } else + } else { ast_log(LOG_WARNING, "Asked to run MixMonitor on this call, but cannot find the MixMonitor app!\n"); - + } } } /* Drop out of the queue at this point, to prepare for next caller */ @@ -4449,6 +4457,7 @@ static int queue_exec(struct ast_channel *chan, void *data) qe.expire = 0; /* Get the priority from the variable ${QUEUE_PRIO} */ + ast_channel_lock(chan); user_priority = pbx_builtin_getvar_helper(chan, "QUEUE_PRIO"); if (user_priority) { if (sscanf(user_priority, "%d", &prio) == 1) { @@ -4488,6 +4497,7 @@ static int queue_exec(struct ast_channel *chan, void *data) } else { min_penalty = 0; } + ast_channel_unlock(chan); if (args.options && (strchr(args.options, 'r'))) ringing = 1;