|
|
@ -122,6 +122,7 @@ struct localuser {
|
|
|
|
int allowdisconnect_in;
|
|
|
|
int allowdisconnect_in;
|
|
|
|
int allowdisconnect_out;
|
|
|
|
int allowdisconnect_out;
|
|
|
|
int forcecallerid;
|
|
|
|
int forcecallerid;
|
|
|
|
|
|
|
|
int forwards;
|
|
|
|
struct localuser *next;
|
|
|
|
struct localuser *next;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
@ -141,6 +142,8 @@ static void hanguptree(struct localuser *outgoing, struct ast_channel *exception
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define AST_MAX_FORWARDS 8
|
|
|
|
|
|
|
|
|
|
|
|
#define AST_MAX_WATCHERS 256
|
|
|
|
#define AST_MAX_WATCHERS 256
|
|
|
|
|
|
|
|
|
|
|
|
#define HANDLE_CAUSE(blah, bleh) do { \
|
|
|
|
#define HANDLE_CAUSE(blah, bleh) do { \
|
|
|
@ -255,12 +258,21 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
|
|
|
|
tech = "Local";
|
|
|
|
tech = "Local";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* Before processing channel, go ahead and check for forwarding */
|
|
|
|
/* Before processing channel, go ahead and check for forwarding */
|
|
|
|
|
|
|
|
o->forwards++;
|
|
|
|
|
|
|
|
if (o->forwards < AST_MAX_FORWARDS) {
|
|
|
|
if (option_verbose > 2)
|
|
|
|
if (option_verbose > 2)
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3 "Now forwarding %s to '%s/%s' (thanks to %s)\n", in->name, tech, stuff, o->chan->name);
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3 "Now forwarding %s to '%s/%s' (thanks to %s)\n", in->name, tech, stuff, o->chan->name);
|
|
|
|
/* Setup parameters */
|
|
|
|
/* Setup parameters */
|
|
|
|
o->chan = ast_request(tech, in->nativeformats, stuff, &cause);
|
|
|
|
o->chan = ast_request(tech, in->nativeformats, stuff, &cause);
|
|
|
|
if (!o->chan) {
|
|
|
|
if (!o->chan)
|
|
|
|
ast_log(LOG_NOTICE, "Unable to create local channel for call forward to '%s/%s' (cause = %d)\n", tech, stuff, cause);
|
|
|
|
ast_log(LOG_NOTICE, "Unable to create local channel for call forward to '%s/%s' (cause = %d)\n", tech, stuff, cause);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
if (option_verbose > 2)
|
|
|
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3 "Too many forwards from %s\n", o->chan->name);
|
|
|
|
|
|
|
|
cause = AST_CAUSE_CONGESTION;
|
|
|
|
|
|
|
|
o->chan = NULL;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!o->chan) {
|
|
|
|
o->stillgoing = 0;
|
|
|
|
o->stillgoing = 0;
|
|
|
|
HANDLE_CAUSE(cause, in);
|
|
|
|
HANDLE_CAUSE(cause, in);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
@ -804,14 +816,23 @@ static int dial_exec(struct ast_channel *chan, void *data)
|
|
|
|
stuff = tmpchan;
|
|
|
|
stuff = tmpchan;
|
|
|
|
tech = "Local";
|
|
|
|
tech = "Local";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* Before processing channel, go ahead and check for forwarding */
|
|
|
|
tmp->forwards++;
|
|
|
|
|
|
|
|
if (tmp->forwards < AST_MAX_FORWARDS) {
|
|
|
|
if (option_verbose > 2)
|
|
|
|
if (option_verbose > 2)
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3 "Forwarding %s to '%s/%s' (thanks to %s)\n", chan->name, tech, stuff, tmp->chan->name);
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3 "Now forwarding %s to '%s/%s' (thanks to %s)\n", chan->name, tech, stuff, tmp->chan->name);
|
|
|
|
/* Setup parameters */
|
|
|
|
|
|
|
|
ast_hangup(tmp->chan);
|
|
|
|
ast_hangup(tmp->chan);
|
|
|
|
|
|
|
|
/* Setup parameters */
|
|
|
|
tmp->chan = ast_request(tech, chan->nativeformats, stuff, &cause);
|
|
|
|
tmp->chan = ast_request(tech, chan->nativeformats, stuff, &cause);
|
|
|
|
|
|
|
|
if (!tmp->chan)
|
|
|
|
|
|
|
|
ast_log(LOG_NOTICE, "Unable to create local channel for call forward to '%s/%s' (cause = %d)\n", tech, stuff, cause);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
if (option_verbose > 2)
|
|
|
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3 "Too many forwards from %s\n", tmp->chan->name);
|
|
|
|
|
|
|
|
ast_hangup(tmp->chan);
|
|
|
|
|
|
|
|
tmp->chan = NULL;
|
|
|
|
|
|
|
|
cause = AST_CAUSE_CONGESTION;
|
|
|
|
|
|
|
|
}
|
|
|
|
if (!tmp->chan) {
|
|
|
|
if (!tmp->chan) {
|
|
|
|
ast_log(LOG_NOTICE, "Unable to create local channel for call forward to '%s/%s' (cause %d)\n", tech, stuff, cause);
|
|
|
|
|
|
|
|
HANDLE_CAUSE(cause, chan);
|
|
|
|
HANDLE_CAUSE(cause, chan);
|
|
|
|
cur = rest;
|
|
|
|
cur = rest;
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|