"ends the call.\n"
" The optional URL will be sent to the called party if the channel supports it.\n"
" If the OUTBOUND_GROUP variable is set, all peer channels created by this\n"
-"application will be put into that group (as in Set(GROUP()=...).\n\n"
+"application will be put into that group (as in Set(GROUP()=...).\n"
+" If the OUTBOUND_GROUP_ONCE variable is set, all peer channels created by this\n"
+"application will be put into that group (as in Set(GROUP()=...). Unlike OUTBOUND_GROUP,\n"
+"however, the variable will be unset after use.\n\n"
" Options:\n"
" A(x) - Play an announcement to the called party, using 'x' as the file.\n"
" C - Reset the CDR for this call.\n"
if (continue_exec)
*continue_exec = 0;
-
+
/* If a channel group has been specified, get it for use when we create peer channels */
- outbound_group = pbx_builtin_getvar_helper(chan, "OUTBOUND_GROUP");
-
+ if ((outbound_group = pbx_builtin_getvar_helper(chan, "OUTBOUND_GROUP_ONCE"))) {
+ outbound_group = ast_strdupa(outbound_group);
+ pbx_builtin_setvar_helper(chan, "OUTBOUND_GROUP_ONCE", NULL);
+ } else {
+ outbound_group = pbx_builtin_getvar_helper(chan, "OUTBOUND_GROUP");
+ }
+
ast_copy_flags(peerflags, &opts, OPT_DTMF_EXIT | OPT_GO_ON | OPT_ORIGINAL_CLID | OPT_CALLER_HANGUP);
cur = args.peers;
do {
ast_frfree(f);
return NULL;
}
- if ((f->frametype == AST_FRAME_DTMF) && (f->subclass != '*') && valid_exit(qe, f->subclass)) {
+ if ((f->frametype == AST_FRAME_DTMF) && valid_exit(qe, f->subclass)) {
if (option_verbose > 3)
ast_verbose(VERBOSE_PREFIX_3 "User pressed digit: %c\n", f->subclass);
*to=0;
if ((resp >= 300) && (resp < 700)) {
if ((option_verbose > 2) && (resp != 487))
ast_verbose(VERBOSE_PREFIX_3 "Got SIP response %d \"%s\" back from %s\n", resp, rest, ast_inet_ntoa(iabuf, sizeof(iabuf), p->sa.sin_addr));
- if (p->rtp) {
- /* Immediately stop RTP */
- ast_rtp_stop(p->rtp);
- }
- if (p->vrtp) {
- /* Immediately stop VRTP */
- ast_rtp_stop(p->vrtp);
+ if (sipmethod == SIP_INVITE) {
+ if (p->rtp) {
+ /* Immediately stop RTP */
+ ast_rtp_stop(p->rtp);
+ }
+ if (p->vrtp) {
+ /* Immediately stop VRTP */
+ ast_rtp_stop(p->vrtp);
+ }
}
/* XXX Locking issues?? XXX */
switch(resp) {
/* ACK on invite */
if (sipmethod == SIP_INVITE)
transmit_request(p, SIP_ACK, seqno, 0, 0);
- ast_set_flag(p, SIP_ALREADYGONE);
+ if (sipmethod != SIP_MESSAGE && sipmethod != SIP_INFO)
+ ast_set_flag(p, SIP_ALREADYGONE);
if (!p->owner)
ast_set_flag(p, SIP_NEEDDESTROY);
} else if ((resp >= 100) && (resp < 200)) {
ast_copy_string(p->context, p->subscribecontext, sizeof(p->context));
else if (ast_strlen_zero(p->context))
strcpy(p->context, default_context);
+
+ /* Get full contact header - this needs to be used as a request URI in NOTIFY's */
+ parse_ok_contact(p, req);
+
/* Get destination right away */
build_contact(p);
if (gotdest) {
static char *callerid_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
{
+ if (!chan)
+ return "";
+
if (!strncasecmp("all", data, 3)) {
snprintf(buf, len, "\"%s\" <%s>", chan->cid.cid_name ? chan->cid.cid_name : "", chan->cid.cid_num ? chan->cid.cid_num : "");
} else if (!strncasecmp("name", data, 4)) {
static void callerid_write(struct ast_channel *chan, char *cmd, char *data, const char *value)
{
- if (!value)
+ if (!value || !chan)
return;
-
+
if (!strncasecmp("all", data, 3)) {
char name[256];
char num[256];
int argc;
char *argv[2];
int recursive = 0;
- struct ast_cdr *cdr = chan->cdr;
+ struct ast_cdr *cdr = chan ? chan->cdr : NULL;
if (ast_strlen_zero(data))
return NULL;
char *argv[2];
int recursive = 0;
- if (ast_strlen_zero(data) || !value)
+ if (ast_strlen_zero(data) || !value || !chan)
return;
-
+
mydata = ast_strdupa(data);
argc = ast_app_separate_args(mydata, '|', argv, sizeof(argv) / sizeof(argv[0]));
char tmp1[1024] = "";
char tmp2[1024] = "";
+ if (!chan)
+ return "";
+
headp=&chan->varshead;
AST_LIST_TRAVERSE(headp,current,entries) {
if (!strncmp(ast_var_name(current), GROUP_CATEGORY_PREFIX "_", strlen(GROUP_CATEGORY_PREFIX) + 1)) {
static char *builtin_function_language_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
{
- ast_copy_string(buf, chan->language, len);
+ ast_copy_string(buf, chan ? chan->language : "", len);
return buf;
}
static void builtin_function_language_write(struct ast_channel *chan, char *cmd, char *data, const char *value)
{
- if (value)
+ if (chan && value)
ast_copy_string(chan->language, value, sizeof(chan->language));
}
static char *function_moh_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
{
- ast_copy_string(buf, chan->musicclass, len);
+ ast_copy_string(buf, chan ? chan->musicclass : "", len);
return buf;
}
static void function_moh_write(struct ast_channel *chan, char *cmd, char *data, const char *value)
{
- ast_copy_string(chan->musicclass, value, sizeof(chan->musicclass));
+ if (chan)
+ ast_copy_string(chan->musicclass, value, sizeof(chan->musicclass));
}
#ifndef BUILTIN_FUNC
{
time_t myt;
+ if (!chan)
+ return "";
+
if (!data) {
ast_log(LOG_ERROR, "Must specify type of timeout to get.\n");
return NULL;
char timestr[64];
struct tm myt;
+ if (!chan)
+ return;
+
if (!data) {
ast_log(LOG_ERROR, "Must specify type of timeout to set.\n");
return;
ast_verbose("The previous reload command didn't finish yet\n");
return -1;
}
+ time(&ast_lastreloadtime);
+
if (!name || !strcasecmp(name, "extconfig")) {
read_config_maps();
reloaded = 2;
dnsmgr_reload();
reloaded = 2;
}
- time(&ast_lastreloadtime);
ast_mutex_lock(&modlock);
oldversion = modlistver;