Simplified dahdi_request() channel selection failed reason/cause code.
authorRichard Mudgett <rmudgett@digium.com>
Wed, 10 Mar 2010 16:55:34 +0000 (16:55 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Wed, 10 Mar 2010 16:55:34 +0000 (16:55 +0000)
Also avoid potential crash because cause could be NULL.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@251585 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_dahdi.c
channels/sig_analog.c
channels/sig_analog.h
channels/sig_pri.c
channels/sig_pri.h

index 5f1377e..18942a4 100644 (file)
@@ -11880,7 +11880,7 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
        return tmp;
 }
 
-static inline int available(struct dahdi_pvt *p, int channelmatch, ast_group_t groupmatch, int *reason, int *channelmatched, int *groupmatched)
+static inline int available(struct dahdi_pvt *p, int channelmatch, ast_group_t groupmatch, int *channelmatched, int *groupmatched)
 {
        /* First, check group matching */
        if (groupmatch) {
@@ -11899,12 +11899,12 @@ static inline int available(struct dahdi_pvt *p, int channelmatch, ast_group_t g
                return 0;
 
        if (analog_lib_handles(p->sig, p->radio, p->oprmode))
-               return analog_available(p->sig_pvt, reason);
+               return analog_available(p->sig_pvt);
 
 #ifdef HAVE_PRI
        switch (p->sig) {
        case SIG_PRI_LIB_HANDLE_CASES:
-               return sig_pri_available(p->sig_pvt, reason);
+               return sig_pri_available(p->sig_pvt);
        default:
                break;
        }
@@ -12094,7 +12094,6 @@ static struct ast_channel *dahdi_request(const char *type, format_t format, cons
        int channelmatch = -1;
        int roundrobin = 0;
        int callwait = 0;
-       int unavailreason = 0;
        struct dahdi_pvt *p;
        struct ast_channel *tmp = NULL;
        char *dest;
@@ -12200,7 +12199,7 @@ static struct ast_channel *dahdi_request(const char *type, format_t format, cons
                ast_verbose("name = %s, %d, %d, %llu\n",p->owner ? p->owner->name : "<none>", p->channel, channelmatch, groupmatch);
 #endif
 
-               if (p && available(p, channelmatch, groupmatch, &unavailreason, &channelmatched, &groupmatched)) {
+               if (p && available(p, channelmatch, groupmatch, &channelmatched, &groupmatched)) {
                        ast_debug(1, "Using channel %d\n", p->channel);
 
                        callwait = (p->owner != NULL);
@@ -12277,14 +12276,16 @@ next:
        }
        ast_mutex_unlock(&iflock);
        restart_monitor();
-       if (callwait)
-               *cause = AST_CAUSE_BUSY;
-       else if (!tmp) {
-               if (channelmatched) {
-                       if (unavailreason)
-                               *cause = AST_CAUSE_BUSY;
+       if (cause && !tmp) {
+               if (callwait || channelmatched) {
+                       *cause = AST_CAUSE_BUSY;
                } else if (groupmatched) {
-                       *cause = (unavailreason) ? unavailreason : AST_CAUSE_CONGESTION;
+                       *cause = AST_CAUSE_CONGESTION;
+               } else {
+                       /*
+                        * We did not match any channel requested.
+                        * Dialplan error requesting non-existant channel?
+                        */
                }
        }
 
index 3e8e9f3..8e4aa33 100644 (file)
@@ -649,17 +649,11 @@ struct ast_channel * analog_request(struct analog_pvt *p, int *callwait, const s
        return analog_new_ast_channel(p, AST_STATE_RESERVED, 0, p->owner ? ANALOG_SUB_CALLWAIT : ANALOG_SUB_REAL, requestor);
 }
 
-int analog_available(struct analog_pvt *p, int *busy)
+int analog_available(struct analog_pvt *p)
 {
        int offhook;
 
        ast_log(LOG_DEBUG, "%s %d\n", __FUNCTION__, p->channel);
-       /* We're at least busy at this point */
-       if (busy) {
-               if ((p->sig == ANALOG_SIG_FXOKS) || (p->sig == ANALOG_SIG_FXOLS) || (p->sig == ANALOG_SIG_FXOGS)) {
-                       *busy = 1;
-               }
-       }
        /* If do not disturb, definitely not */
        if (p->dnd) {
                return 0;
index 76972fe..33b6422 100644 (file)
@@ -336,7 +336,7 @@ struct ast_frame *analog_exception(struct analog_pvt *p, struct ast_channel *ast
 
 struct ast_channel * analog_request(struct analog_pvt *p, int *callwait, const struct ast_channel *requestor);
 
-int analog_available(struct analog_pvt *p, int *busy);
+int analog_available(struct analog_pvt *p);
 
 void *analog_handle_init_event(struct analog_pvt *i, int event);
 
index c655e6d..c1dff5f 100644 (file)
@@ -3863,22 +3863,17 @@ int sig_pri_answer(struct sig_pri_chan *p, struct ast_channel *ast)
        return res;
 }
 
-int sig_pri_available(struct sig_pri_chan *p, int *reason)
+int sig_pri_available(struct sig_pri_chan *p)
 {
        /* If no owner and interface has a B channel then likely available */
        if (!p->owner && !p->no_b_channel && p->pri) {
+               if (p->resetting || p->call
 #if defined(HAVE_PRI_SERVICE_MESSAGES)
-               if (p->resetting || p->call || p->service_status) {
-                       if (p->service_status) {
-                               *reason = AST_CAUSE_REQUESTED_CHAN_UNAVAIL;
-                       }
-                       return 0;
-               }
-#else
-               if (p->resetting || p->call) {
+                       || p->service_status
+#endif /* defined(HAVE_PRI_SERVICE_MESSAGES) */
+                       ) {
                        return 0;
                }
-#endif /* defined(HAVE_PRI_SERVICE_MESSAGES) */
                return 1;
        }
 
index ed42ffd..2bb7ffc 100644 (file)
@@ -261,7 +261,7 @@ int sig_pri_indicate(struct sig_pri_chan *p, struct ast_channel *chan, int condi
 
 int sig_pri_answer(struct sig_pri_chan *p, struct ast_channel *ast);
 
-int sig_pri_available(struct sig_pri_chan *p, int *reason);
+int sig_pri_available(struct sig_pri_chan *p);
 
 void sig_pri_init_pri(struct sig_pri_pri *pri);