From 98d156c5dd2238d13c88b4a92c3d909c6bcbbe21 Mon Sep 17 00:00:00 2001
From: Richard Mudgett <rmudgett@digium.com>
Date: Thu, 10 Sep 2009 00:35:30 +0000
Subject: [PATCH] Fix available() for SS7, MFC/R2, and pseudo channels.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@217560 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channels/chan_dahdi.c | 42 ++++++++++++++++++++++++++----------------
 1 file changed, 26 insertions(+), 16 deletions(-)

diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index 53ddf2a1be..f5217ea533 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -946,12 +946,12 @@ static struct dahdi_pvt {
 	unsigned int inservice:1;
 	/*!
 	 * \brief TRUE if the channel is locally blocked.
-	 * \note Applies to SS7 channels.
+	 * \note Applies to SS7 and MFCR2 channels.
 	 */
 	unsigned int locallyblocked:1;
 	/*!
 	 * \brief TRUE if the channel is remotely blocked.
-	 * \note Applies to SS7 channels.
+	 * \note Applies to SS7 and MFCR2 channels.
 	 */
 	unsigned int remotelyblocked:1;
 #if defined(HAVE_PRI)
@@ -11400,24 +11400,34 @@ static inline int available(struct dahdi_pvt *p, int channelmatch, ast_group_t g
 	}
 #endif
 
-#ifdef HAVE_SS7
-	/* Trust SS7 */
-	if (p->ss7) {
-		if (p->ss7call)
-			return 0;
-		else
-			return 1;
+	if (p->locallyblocked || p->remotelyblocked) {
+		return 0;
 	}
+
+	/* If no owner definitely available */
+	if (!p->owner) {
+#ifdef HAVE_SS7
+		/* Trust SS7 */
+		if (p->ss7) {
+			if (p->ss7call) {
+				return 0;
+			} else {
+				return 1;
+			}
+		}
 #endif
 #ifdef HAVE_OPENR2
-	/* Trust MFC/R2 */
-	if (p->mfcr2) {
-		if (p->mfcr2call)
-			return 0;
-		else
-			return 1;
-	}
+		/* Trust MFC/R2 */
+		if (p->mfcr2) {
+			if (p->mfcr2call) {
+				return 0;
+			} else {
+				return 1;
+			}
+		}
 #endif
+		return 1;
+	}
 
 	return 0;
 }
-- 
GitLab