2005-11-08 Kevin P. Fleming <kpfleming@digium.com>
+ * channels/chan_zap.c (zt_request): return AST_CAUSE_CONGESTION when a group-channel is requested and the group exists but all channels are busy (issue #3360, related fix)
+ * channels/chan_iax2.c (create_addr): treat UNREACHABLE as AST_CAUSE_UNREGISTERED so that it will generate CHANUNAVAIL from app_dial (issue #3360)
+
* res/res_features.c (ast_bridge_call_thread_launch): set SCHED_RR separately from thread creation, so it won't fail when running as non-root (issue #5601, different fix)
* pbx.c (pbx_builtin_pushvar_helper): add new API function for setting variables that can exist multiple times (issue #2720)
return tmp;
}
-static inline int available(struct zt_pvt *p, int channelmatch, int groupmatch, int *busy)
+static inline int available(struct zt_pvt *p, int channelmatch, int groupmatch, int *busy, int *channelmatched, int *groupmatched)
{
int res;
ZT_PARAMS par;
/* First, check group matching */
- if ((p->group & groupmatch) != groupmatch)
- return 0;
+ if (groupmatch) {
+ if ((p->group & groupmatch) != groupmatch)
+ return 0;
+ *groupmatched = 1;
+ }
/* Check to see if we have a channel match */
- if ((channelmatch > 0) && (p->channel != channelmatch))
- return 0;
+ if (channelmatch) {
+ if (p->channel != channelmatch)
+ return 0;
+ *channelmatched = 1;
+ }
/* We're at least busy at this point */
if (busy) {
if ((p->sig == SIG_FXOKS) || (p->sig == SIG_FXOLS) || (p->sig == SIG_FXOGS))
#endif
struct zt_pvt *exit, *start, *end;
ast_mutex_t *lock;
+ int channelmatched = 0;
+ int groupmatched = 0;
/* Assume we're locking the iflock */
lock = &iflock;
#if 0
ast_verbose("name = %s, %d, %d, %d\n",p->owner ? p->owner->name : "<none>", p->channel, channelmatch, groupmatch);
#endif
- if (p && available(p, channelmatch, groupmatch, &busy)) {
+
+ if (p && available(p, channelmatch, groupmatch, &busy, &channelmatched, &groupmatched)) {
if (option_debug)
ast_log(LOG_DEBUG, "Using channel %d\n", p->channel);
if (p->inalarm)
}
ast_mutex_unlock(lock);
restart_monitor();
- if (callwait || (!tmp && busy))
- *cause = AST_CAUSE_BUSY;
+ if (channelmatched) {
+ if (callwait || (!tmp && busy))
+ *cause = AST_CAUSE_BUSY;
+ } else if (groupmatched) {
+ *cause = AST_CAUSE_CONGESTION;
+ }
+
return tmp;
}