[asterisk-commits] branch russell/menuselect_buildoptions r34344 - in /team/russell/menuselect_b...

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Thu Jun 15 16:35:53 MST 2006


Author: russell
Date: Thu Jun 15 18:35:52 2006
New Revision: 34344

URL: http://svn.digium.com/view/asterisk?rev=34344&view=rev
Log:
Merged revisions 34043,34065,34090,34093,34126,34161-34162,34193-34194,34217,34240-34241,34243,34247,34275,34307 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/trunk

................
r34043 | kpfleming | 2006-06-14 00:03:45 -0400 (Wed, 14 Jun 2006) | 2 lines

add Grandstream to credits too

................
r34065 | oej | 2006-06-14 07:40:31 -0400 (Wed, 14 Jun 2006) | 2 lines

Formatting fixes

................
r34090 | kpfleming | 2006-06-14 10:12:56 -0400 (Wed, 14 Jun 2006) | 10 lines

Merged revisions 34087 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r34087 | kpfleming | 2006-06-14 09:07:53 -0500 (Wed, 14 Jun 2006) | 2 lines

clarify file headers that mention disclaimer usage

........

................
r34093 | oej | 2006-06-14 10:46:19 -0400 (Wed, 14 Jun 2006) | 3 lines

- Use our standard of doxygen comments, not javadoc style
- small reformatting changes

................
r34126 | oej | 2006-06-14 11:15:29 -0400 (Wed, 14 Jun 2006) | 2 lines

Add some debug logging

................
r34161 | kpfleming | 2006-06-14 18:35:49 -0400 (Wed, 14 Jun 2006) | 15 lines

Merged revisions 34159-34160 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r34159 | kpfleming | 2006-06-14 17:17:37 -0500 (Wed, 14 Jun 2006) | 2 lines

use existing dial string parser for strings supplied to iax2_devicestate, because they can be complete dial strings, not just device names

........
r34160 | kpfleming | 2006-06-14 17:22:21 -0500 (Wed, 14 Jun 2006) | 2 lines

coding style cleanups on queue interface handling code that was committed for the last release

........

................
r34162 | kpfleming | 2006-06-14 18:39:19 -0400 (Wed, 14 Jun 2006) | 2 lines

make Local channel return sensible device state values

................
r34193 | kpfleming | 2006-06-14 19:20:08 -0400 (Wed, 14 Jun 2006) | 2 lines

various coding style cleanup and minor fixes

................
r34194 | kpfleming | 2006-06-14 19:24:26 -0400 (Wed, 14 Jun 2006) | 2 lines

use the proper named constants for checking device state, and don't treat UNKNOWN as not available in autofill mode

................
r34217 | oej | 2006-06-15 02:35:55 -0400 (Thu, 15 Jun 2006) | 5 lines

- Do not require a space at the end of the m= string in a T38 re-invite
  Bug reported in the t38 issue report, but by mistake ignored before commit.
  Thanks to everyone informing me about this, and Corydon for helping me sort
  out sscanf :-)

................
r34240 | tilghman | 2006-06-15 08:26:50 -0400 (Thu, 15 Jun 2006) | 2 lines

ast_calloc already reports out of memory conditions (issue 7343)

................
r34241 | tilghman | 2006-06-15 08:30:45 -0400 (Thu, 15 Jun 2006) | 2 lines

ast_calloc() already reports OOM conditions

................
r34243 | tilghman | 2006-06-15 08:41:24 -0400 (Thu, 15 Jun 2006) | 11 lines

Merged revisions 34242 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r34242 | tilghman | 2006-06-15 07:40:10 -0500 (Thu, 15 Jun 2006) | 3 lines

VoicemailMain exits on any key, when the language is set to Italian, instead of
properly handling the key (issue 7353).

........

................
r34247 | oej | 2006-06-15 09:00:55 -0400 (Thu, 15 Jun 2006) | 2 lines

Hoppsan!

................
r34275 | kpfleming | 2006-06-15 09:35:04 -0400 (Thu, 15 Jun 2006) | 11 lines

Merged revisions 34274 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r34274 | kpfleming | 2006-06-15 08:30:22 -0500 (Thu, 15 Jun 2006) | 3 lines

don't use prefixed structure names for internal structures
don't use a plural structure name for a singular object

........

................
r34307 | oej | 2006-06-15 10:14:23 -0400 (Thu, 15 Jun 2006) | 2 lines

Block patch for 1.2 already fixed in trunk, but in another way

................

Modified:
    team/russell/menuselect_buildoptions/   (props changed)
    team/russell/menuselect_buildoptions/CREDITS
    team/russell/menuselect_buildoptions/abstract_jb.c
    team/russell/menuselect_buildoptions/apps/app_amd.c
    team/russell/menuselect_buildoptions/apps/app_chanspy.c
    team/russell/menuselect_buildoptions/apps/app_dumpchan.c
    team/russell/menuselect_buildoptions/apps/app_queue.c
    team/russell/menuselect_buildoptions/apps/app_voicemail.c
    team/russell/menuselect_buildoptions/channels/chan_agent.c
    team/russell/menuselect_buildoptions/channels/chan_iax2.c
    team/russell/menuselect_buildoptions/channels/chan_local.c
    team/russell/menuselect_buildoptions/channels/chan_sip.c
    team/russell/menuselect_buildoptions/fixedjitterbuf.c
    team/russell/menuselect_buildoptions/include/asterisk/abstract_jb.h
    team/russell/menuselect_buildoptions/include/asterisk/plc.h
    team/russell/menuselect_buildoptions/include/asterisk/udptl.h
    team/russell/menuselect_buildoptions/jitterbuf.c
    team/russell/menuselect_buildoptions/plc.c
    team/russell/menuselect_buildoptions/res/res_odbc.c
    team/russell/menuselect_buildoptions/res/res_osp.c
    team/russell/menuselect_buildoptions/udptl.c

Propchange: team/russell/menuselect_buildoptions/
------------------------------------------------------------------------------
Binary property 'branch-1.2-blocked' - no diff available.

Propchange: team/russell/menuselect_buildoptions/
------------------------------------------------------------------------------
Binary property 'branch-1.2-merged' - no diff available.

Propchange: team/russell/menuselect_buildoptions/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Thu Jun 15 18:35:52 2006
@@ -1,1 +1,1 @@
-/trunk:1-34022
+/trunk:1-34343

Modified: team/russell/menuselect_buildoptions/CREDITS
URL: http://svn.digium.com/view/asterisk/team/russell/menuselect_buildoptions/CREDITS?rev=34344&r1=34343&r2=34344&view=diff
==============================================================================
--- team/russell/menuselect_buildoptions/CREDITS (original)
+++ team/russell/menuselect_buildoptions/CREDITS Thu Jun 15 18:35:52 2006
@@ -27,8 +27,11 @@
 * Thanks to QuickNet Technologies for their donation of an Internet
 PhoneJack and Linejack card to the project.  (http://www.quicknet.net)
 
-* Thanks to VoipSupply for their donation of Sipuras to the project for
-	t38 testing. (http://www.voipsupply.com)
+* Thanks to VoipSupply for their donation of Sipura ATAs to the project for
+T.38 testing. (http://www.voipsupply.com)
+
+* Thanks to Grandstream for their donation of ATAs to the project for
+T.38 testing. (http://www.grandstream.com)
 
 === MISCELLANEOUS PATCHES ===
 Jim Dixon - Zapata Telephony and app_rpt

Modified: team/russell/menuselect_buildoptions/abstract_jb.c
URL: http://svn.digium.com/view/asterisk/team/russell/menuselect_buildoptions/abstract_jb.c?rev=34344&r1=34343&r2=34344&view=diff
==============================================================================
--- team/russell/menuselect_buildoptions/abstract_jb.c (original)
+++ team/russell/menuselect_buildoptions/abstract_jb.c Thu Jun 15 18:35:52 2006
@@ -5,8 +5,6 @@
  *
  * Contributors:
  * Slav Klenov <slav at securax.org>
- *
- * Copyright on this file is disclaimed to Digium for inclusion in Asterisk
  *
  * See http://www.asterisk.org for more information about
  * the Asterisk project. Please do not directly contact
@@ -17,6 +15,9 @@
  * This program is free software, distributed under the terms of
  * the GNU General Public License Version 2. See the LICENSE file
  * at the top of the source tree.
+ *
+ * A license has been granted to Digium (via disclaimer) for the use of
+ * this code.
  */
 
 /*! \file

Modified: team/russell/menuselect_buildoptions/apps/app_amd.c
URL: http://svn.digium.com/view/asterisk/team/russell/menuselect_buildoptions/apps/app_amd.c?rev=34344&r1=34343&r2=34344&view=diff
==============================================================================
--- team/russell/menuselect_buildoptions/apps/app_amd.c (original)
+++ team/russell/menuselect_buildoptions/apps/app_amd.c Thu Jun 15 18:35:52 2006
@@ -4,8 +4,6 @@
  * Copyright (C) 2003 - 2006, Aheeva Technology.
  *
  * Claude Klimos (claude.klimos at aheeva.com)
- *
- * Disclaimed to Digium
  *
  * See http://www.asterisk.org for more information about
  * the Asterisk project. Please do not directly contact
@@ -16,6 +14,9 @@
  * This program is free software, distributed under the terms of
  * the GNU General Public License Version 2. See the LICENSE file
  * at the top of the source tree.
+ *
+ * A license has been granted to Digium (via disclaimer) for the use of
+ * this code.
  */
 
 #include "asterisk.h"

Modified: team/russell/menuselect_buildoptions/apps/app_chanspy.c
URL: http://svn.digium.com/view/asterisk/team/russell/menuselect_buildoptions/apps/app_chanspy.c?rev=34344&r1=34343&r2=34344&view=diff
==============================================================================
--- team/russell/menuselect_buildoptions/apps/app_chanspy.c (original)
+++ team/russell/menuselect_buildoptions/apps/app_chanspy.c Thu Jun 15 18:35:52 2006
@@ -4,7 +4,8 @@
  * Copyright (C) 2005 Anthony Minessale II (anthmct at yahoo.com)
  * Copyright (C) 2005 - 2006, Digium, Inc.
  *
- * Disclaimed to Digium
+ * A license has been granted to Digium (via disclaimer) for the use of
+ * this code.
  *
  * See http://www.asterisk.org for more information about
  * the Asterisk project. Please do not directly contact

Modified: team/russell/menuselect_buildoptions/apps/app_dumpchan.c
URL: http://svn.digium.com/view/asterisk/team/russell/menuselect_buildoptions/apps/app_dumpchan.c?rev=34344&r1=34343&r2=34344&view=diff
==============================================================================
--- team/russell/menuselect_buildoptions/apps/app_dumpchan.c (original)
+++ team/russell/menuselect_buildoptions/apps/app_dumpchan.c Thu Jun 15 18:35:52 2006
@@ -5,7 +5,8 @@
  *
  * Anthony Minessale <anthmct at yahoo.com>
  *
- * disclaimed to Digium
+ * A license has been granted to Digium (via disclaimer) for the use of
+ * this code.
  *
  * See http://www.asterisk.org for more information about
  * the Asterisk project. Please do not directly contact

Modified: team/russell/menuselect_buildoptions/apps/app_queue.c
URL: http://svn.digium.com/view/asterisk/team/russell/menuselect_buildoptions/apps/app_queue.c?rev=34344&r1=34343&r2=34344&view=diff
==============================================================================
--- team/russell/menuselect_buildoptions/apps/app_queue.c (original)
+++ team/russell/menuselect_buildoptions/apps/app_queue.c Thu Jun 15 18:35:52 2006
@@ -285,7 +285,7 @@
 LOCAL_USER_DECL;
 
 struct queue_ent {
-	struct ast_call_queue *parent;	/*!< What queue is our parent */
+	struct call_queue *parent;	/*!< What queue is our parent */
 	char moh[80];			/*!< Name of musiconhold to be used */
 	char announce[80];		/*!< Announcement to play for member when call is answered */
 	char context[AST_MAX_CONTEXT];	/*!< Context when user exits queue */
@@ -318,20 +318,20 @@
 	struct member *next;		/*!< Next member */
 };
 
-struct ast_member_interfaces {
+struct member_interface {
 	char interface[80];
-	AST_LIST_ENTRY(ast_member_interfaces) list;    /*!< Next call queue */
+	AST_LIST_ENTRY(member_interface) list;    /*!< Next call queue */
 };
 
-static AST_LIST_HEAD_STATIC(interfaces, ast_member_interfaces);
-
-/* values used in multi-bit flags in ast_call_queue */
+static AST_LIST_HEAD_STATIC(interfaces, member_interface);
+
+/* values used in multi-bit flags in call_queue */
 #define QUEUE_EMPTY_NORMAL 1
 #define QUEUE_EMPTY_STRICT 2
 #define ANNOUNCEHOLDTIME_ALWAYS 1
 #define ANNOUNCEHOLDTIME_ONCE 2
 
-struct ast_call_queue {
+struct call_queue {
 	ast_mutex_t lock;	
 	char name[80];			/*!< Name */
 	char moh[80];			/*!< Music On Hold class to be used */
@@ -388,10 +388,10 @@
 	
 	struct member *members;		/*!< Head of the list of members */
 	struct queue_ent *head;		/*!< Head of the list of callers */
-	AST_LIST_ENTRY(ast_call_queue) list;	/*!< Next call queue */
+	AST_LIST_ENTRY(call_queue) list;	/*!< Next call queue */
 };
 
-static AST_LIST_HEAD_STATIC(queues, ast_call_queue);
+static AST_LIST_HEAD_STATIC(queues, call_queue);
 
 static int set_member_paused(char *queuename, char *interface, int paused);
 
@@ -420,25 +420,29 @@
 static char *int2strat(int strategy)
 {
 	int x;
-	for (x=0;x<sizeof(strategies) / sizeof(strategies[0]);x++) {
+
+	for (x = 0; x < sizeof(strategies) / sizeof(strategies[0]); x++) {
 		if (strategy == strategies[x].strategy)
 			return strategies[x].name;
 	}
+
 	return "<unknown>";
 }
 
 static int strat2int(const char *strategy)
 {
 	int x;
-	for (x=0;x<sizeof(strategies) / sizeof(strategies[0]);x++) {
+
+	for (x = 0; x < sizeof(strategies) / sizeof(strategies[0]); x++) {
 		if (!strcasecmp(strategy, strategies[x].name))
 			return strategies[x].strategy;
 	}
+
 	return -1;
 }
 
 /*! \brief Insert the 'new' entry after the 'prev' entry of queue 'q' */
-static inline void insert_entry(struct ast_call_queue *q, struct queue_ent *prev, struct queue_ent *new, int *pos)
+static inline void insert_entry(struct call_queue *q, struct queue_ent *prev, struct queue_ent *new, int *pos)
 {
 	struct queue_ent *cur;
 
@@ -463,7 +467,7 @@
 	QUEUE_NORMAL
 };
 
-static enum queue_member_status get_member_status(const struct ast_call_queue *q, int max_penalty)
+static enum queue_member_status get_member_status(const struct call_queue *q, int max_penalty)
 {
 	struct member *member;
 	enum queue_member_status result = QUEUE_NO_MEMBERS;
@@ -496,18 +500,17 @@
 
 static void *changethread(void *data)
 {
-	struct ast_call_queue *q;
+	struct call_queue *q;
 	struct statechange *sc = data;
 	struct member *cur;
-	struct ast_member_interfaces *curint;
+	struct member_interface *curint;
 	char *loc;
 	char *technology;
 
 	technology = ast_strdupa(sc->dev);
 	loc = strchr(technology, '/');
 	if (loc) {
-		*loc = '\0';
-		loc++;
+		*loc++ = '\0';
 	} else {
 		free(sc);
 		return NULL;
@@ -520,43 +523,44 @@
 	}
 	AST_LIST_UNLOCK(&interfaces);
 
-	if (curint) {
-
-		if (option_debug)
-			ast_log(LOG_DEBUG, "Device '%s/%s' changed to state '%d' (%s)\n", technology, loc, sc->state, devstate2str(sc->state));
-		AST_LIST_LOCK(&queues);
-		AST_LIST_TRAVERSE(&queues, q, list) {
-			ast_mutex_lock(&q->lock);
-			cur = q->members;
-			while(cur) {
-				if (!strcasecmp(sc->dev, cur->interface)) {
-					if (cur->status != sc->state) {
-						cur->status = sc->state;
-						if (!q->maskmemberstatus) {
-							manager_event(EVENT_FLAG_AGENT, "QueueMemberStatus",
-								"Queue: %s\r\n"
-								"Location: %s\r\n"
-								"Membership: %s\r\n"
-								"Penalty: %d\r\n"
-								"CallsTaken: %d\r\n"
-								"LastCall: %d\r\n"
-								"Status: %d\r\n"
-								"Paused: %d\r\n",
-							q->name, cur->interface, cur->dynamic ? "dynamic" : "static",
-							cur->penalty, cur->calls, (int)cur->lastcall, cur->status, cur->paused);
-						}
-					}
-				}
-				cur = cur->next;
-			}
-			ast_mutex_unlock(&q->lock);
-		}
-		AST_LIST_UNLOCK(&queues);
-	} else {
+	if (!curint) {
 		if (option_debug)
 			ast_log(LOG_DEBUG, "Device '%s/%s' changed to state '%d' (%s) but we don't care because they're not a member of any queue.\n", technology, loc, sc->state, devstate2str(sc->state));
-	}
-	free(sc);
+		free(sc);
+		return NULL;
+        }
+
+	if (option_debug)
+		ast_log(LOG_DEBUG, "Device '%s/%s' changed to state '%d' (%s)\n", technology, loc, sc->state, devstate2str(sc->state));
+	AST_LIST_LOCK(&queues);
+	AST_LIST_TRAVERSE(&queues, q, list) {
+		ast_mutex_lock(&q->lock);
+		for (cur = q->members; cur; cur = cur->next) {
+			if (strcasecmp(sc->dev, cur->interface))
+				continue;
+
+			if (cur->status != sc->state) {
+				cur->status = sc->state;
+				if (q->maskmemberstatus)
+					continue;
+
+				manager_event(EVENT_FLAG_AGENT, "QueueMemberStatus",
+					      "Queue: %s\r\n"
+					      "Location: %s\r\n"
+					      "Membership: %s\r\n"
+					      "Penalty: %d\r\n"
+					      "CallsTaken: %d\r\n"
+					      "LastCall: %d\r\n"
+					      "Status: %d\r\n"
+					      "Paused: %d\r\n",
+					      q->name, cur->interface, cur->dynamic ? "dynamic" : "static",
+					      cur->penalty, cur->calls, (int)cur->lastcall, cur->status, cur->paused);
+			}
+		}
+		ast_mutex_unlock(&q->lock);
+	}
+	AST_LIST_UNLOCK(&queues);
+
 	return NULL;
 }
 
@@ -567,17 +571,19 @@
 	struct statechange *sc;
 	pthread_t t;
 	pthread_attr_t attr;
-	
-	if ((sc = ast_calloc(1, sizeof(*sc) + strlen(dev) + 1))) {
-		sc->state = state;
-		strcpy(sc->dev, dev);
-		pthread_attr_init(&attr);
-		pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-		if (ast_pthread_create(&t, &attr, changethread, sc)) {
-			ast_log(LOG_WARNING, "Failed to create update thread!\n");
-			free(sc);
-		}
-	}
+
+	if (!(sc = ast_calloc(1, sizeof(*sc) + strlen(dev) + 1)))
+		return 0;
+
+	sc->state = state;
+	strcpy(sc->dev, dev);
+	pthread_attr_init(&attr);
+	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+	if (ast_pthread_create(&t, &attr, changethread, sc)) {
+		ast_log(LOG_WARNING, "Failed to create update thread!\n");
+		free(sc);
+	}
+
 	return 0;
 }
 
@@ -585,8 +591,6 @@
 {
 	struct member *cur;
 	
-	/* Add a new member */
-
 	if ((cur = ast_calloc(1, sizeof(*cur)))) {
 		cur->penalty = penalty;
 		cur->paused = paused;
@@ -599,9 +603,9 @@
 	return cur;
 }
 
-static struct ast_call_queue *alloc_queue(const char *queuename)
-{
-	struct ast_call_queue *q;
+static struct call_queue *alloc_queue(const char *queuename)
+{
+	struct call_queue *q;
 
 	if ((q = ast_calloc(1, sizeof(*q)))) {
 		ast_mutex_init(&q->lock);
@@ -610,9 +614,10 @@
 	return q;
 }
 
-static void init_queue(struct ast_call_queue *q)
+static void init_queue(struct call_queue *q)
 {
 	int i;
+
 	q->dead = 0;
 	q->retry = DEFAULT_RETRY;
 	q->timeout = -1;
@@ -640,12 +645,12 @@
 	ast_copy_string(q->sound_lessthan, "queue-less-than", sizeof(q->sound_lessthan));
 	ast_copy_string(q->sound_reporthold, "queue-reporthold", sizeof(q->sound_reporthold));
 	ast_copy_string(q->sound_periodicannounce[0], "queue-periodic-announce", sizeof(q->sound_periodicannounce[0]));
-	for (i=1;i<MAX_PERIODIC_ANNOUNCEMENTS;i++) {
+	for (i = 1; i < MAX_PERIODIC_ANNOUNCEMENTS; i++) {
 		q->sound_periodicannounce[i][0]='\0';
 	}
 }
 
-static void clear_queue(struct ast_call_queue *q)
+static void clear_queue(struct call_queue *q)
 {
 	q->holdtime = 0;
 	q->callscompleted = 0;
@@ -656,7 +661,7 @@
 
 static int add_to_interfaces(char *interface) 
 {
-	struct ast_member_interfaces *curint, *newint;
+	struct member_interface *curint;
 
 	AST_LIST_LOCK(&interfaces);
 	AST_LIST_TRAVERSE(&interfaces, curint, list) {
@@ -664,54 +669,59 @@
 			break; 
 	}
 
-	if (!curint) {
-		if (option_debug)
-			ast_log(LOG_DEBUG, "Adding %s to the list of interfaces that make up all of our queue members.\n", interface);
-
-	        if ((newint = ast_calloc(1, sizeof(*newint)))) {
-			ast_copy_string(newint->interface, interface, sizeof(newint->interface));
-			AST_LIST_INSERT_HEAD(&interfaces, newint, list);
-		}
+	if (curint) {
+		AST_LIST_UNLOCK(&interfaces);
+		return 0;
+	}
+
+	if (option_debug)
+		ast_log(LOG_DEBUG, "Adding %s to the list of interfaces that make up all of our queue members.\n", interface);
+	
+	if ((curint = ast_calloc(1, sizeof(*curint)))) {
+		ast_copy_string(curint->interface, interface, sizeof(curint->interface));
+		AST_LIST_INSERT_HEAD(&interfaces, curint, list);
 	}
 	AST_LIST_UNLOCK(&interfaces);
 
- return 0;
+	return 0;
 }
 
 static int interface_exists_global(char *interface)
 {
-	struct ast_call_queue *q;
+	struct call_queue *q;
 	struct member *mem;
 	int ret = 0;
 
 	AST_LIST_LOCK(&queues);
 	AST_LIST_TRAVERSE(&queues, q, list) {
 		ast_mutex_lock(&q->lock);
-		for (mem = q->members; mem; mem = mem->next)
-			if (!strcasecmp(interface, mem->interface)) {
-				ast_mutex_unlock(&q->lock);
+		for (mem = q->members; mem && !ret; mem = mem->next) {
+			if (!strcasecmp(interface, mem->interface))
 				ret = 1;
-				break;
-			}
+		}
 		ast_mutex_unlock(&q->lock);
+		if (ret)
+			break;
 	}
 	AST_LIST_UNLOCK(&queues);
 
 	return ret;
 }
 
-
 static int remove_from_interfaces(char *interface)
 {
-	struct ast_member_interfaces *curint;
+	struct member_interface *curint;
 
 	AST_LIST_LOCK(&interfaces);
 	AST_LIST_TRAVERSE_SAFE_BEGIN(&interfaces, curint, list) {
-		if (!strcasecmp(curint->interface, interface) && !interface_exists_global(interface)) {
-			if (option_debug)
-				ast_log(LOG_DEBUG, "Removing %s from the list of interfaces that make up all of our queue members.\n", interface);
-			AST_LIST_REMOVE_CURRENT(&interfaces, list);
-			free(curint);
+		if (!strcasecmp(curint->interface, interface)) {
+			if (!interface_exists_global(interface)) {
+				if (option_debug)
+					ast_log(LOG_DEBUG, "Removing %s from the list of interfaces that make up all of our queue members.\n", interface);
+				AST_LIST_REMOVE_CURRENT(&interfaces, list);
+				free(curint);
+			}
+			break;
 		}
 	}
 	AST_LIST_TRAVERSE_SAFE_END;
@@ -722,17 +732,12 @@
 
 static void clear_and_free_interfaces(void)
 {
-	struct ast_member_interfaces *curint;
+	struct member_interface *curint;
 
 	AST_LIST_LOCK(&interfaces);
-	AST_LIST_TRAVERSE_SAFE_BEGIN(&interfaces, curint, list) {
-		AST_LIST_REMOVE_CURRENT(&interfaces, list);
+	while ((curint = AST_LIST_REMOVE_HEAD(&interfaces, list)))
 		free(curint);
-	}
-	AST_LIST_TRAVERSE_SAFE_END;
 	AST_LIST_UNLOCK(&interfaces);
-
- 	return;
 }
 
 /*! \brief Configure a queue parameter.
@@ -742,11 +747,12 @@
    The failunknown flag is set for config files (and static realtime) to show
    errors for unknown parameters. It is cleared for dynamic realtime to allow
    extra fields in the tables. */
-static void queue_set_param(struct ast_call_queue *q, const char *param, const char *val, int linenum, int failunknown)
+static void queue_set_param(struct call_queue *q, const char *param, const char *val, int linenum, int failunknown)
 {
 	int i = 0;
 	char *c, *lastc;
 	char buff[80];
+
 	if (!strcasecmp(param, "music") || !strcasecmp(param, "musiconhold")) {
 		ast_copy_string(q->moh, val, sizeof(q->moh));
 	} else if (!strcasecmp(param, "announce")) {
@@ -891,29 +897,25 @@
 	}
 }
 
-static void rt_handle_member_record(struct ast_call_queue *q, char *interface, const char *penalty_str)
+static void rt_handle_member_record(struct call_queue *q, char *interface, const char *penalty_str)
 {
 	struct member *m, *prev_m;
 	int penalty = 0;
 
-	if(penalty_str) {
+	if (penalty_str) {
 		penalty = atoi(penalty_str);
-		if(penalty < 0)
+		if (penalty < 0)
 			penalty = 0;
 	}
 
 	/* Find the member, or the place to put a new one. */
-	prev_m = NULL;
-	m = q->members;
-	while (m && strcmp(m->interface, interface)) {
-		prev_m = m;
-		m = m->next;
-	}
+	for (m = q->members, prev_m = NULL;
+	     m && strcmp(m->interface, interface);
+	     prev_m = m, m = m->next);
 
 	/* Create a new one if not found, else update penalty */
 	if (!m) {
-		m = create_queue_member(interface, penalty, 0);
-		if (m) {
+		if ((m = create_queue_member(interface, penalty, 0))) {
 			m->dead = 0;
 			add_to_interfaces(interface);
 			if (prev_m) {
@@ -928,7 +930,7 @@
 	}
 }
 
-static void free_members(struct ast_call_queue *q, int all)
+static void free_members(struct call_queue *q, int all)
 {
 	/* Free non-dynamic members */
 	struct member *curm, *next, *prev = NULL;
@@ -947,7 +949,7 @@
 	}
 }
 
-static void destroy_queue(struct ast_call_queue *q)
+static void destroy_queue(struct call_queue *q)
 {
 	free_members(q, 1);
 	ast_mutex_destroy(&q->lock);
@@ -957,10 +959,10 @@
 /*!\brief Reload a single queue via realtime.
    \return Return the queue, or NULL if it doesn't exist.
    \note Should be called with the global qlock locked. */
-static struct ast_call_queue *find_queue_by_name_rt(const char *queuename, struct ast_variable *queue_vars, struct ast_config *member_config)
+static struct call_queue *find_queue_by_name_rt(const char *queuename, struct ast_variable *queue_vars, struct ast_config *member_config)
 {
 	struct ast_variable *v;
-	struct ast_call_queue *q;
+	struct call_queue *q;
 	struct member *m, *prev_m, *next_m;
 	char *interface;
 	char *tmp, *tmp_name;
@@ -968,9 +970,8 @@
 
 	/* Find the queue in the in-core list (we will create a new one if not found). */
 	AST_LIST_TRAVERSE(&queues, q, list) {
-		if (!strcasecmp(q->name, queuename)) {
+		if (!strcasecmp(q->name, queuename))
 			break;
-		}
 	}
 
 	/* Static queues override realtime. */
@@ -1022,38 +1023,32 @@
 	}
 	init_queue(q);		/* Ensure defaults for all parameters not set explicitly. */
 
-	v = queue_vars;
 	memset(tmpbuf, 0, sizeof(tmpbuf));
-	while(v) {
+	for (v = queue_vars; v; v = v->next) {
 		/* Convert to dashes `-' from underscores `_' as the latter are more SQL friendly. */
-		if((tmp = strchr(v->name, '_')) != NULL) {
+		if ((tmp = strchr(v->name, '_'))) {
 			ast_copy_string(tmpbuf, v->name, sizeof(tmpbuf));
 			tmp_name = tmpbuf;
 			tmp = tmp_name;
-			while((tmp = strchr(tmp, '_')) != NULL)
+			while ((tmp = strchr(tmp, '_')))
 				*tmp++ = '-';
 		} else
 			tmp_name = v->name;
 		queue_set_param(q, tmp_name, v->value, -1, 0);
-		v = v->next;
 	}
 
 	if (q->strategy == QUEUE_STRATEGY_ROUNDROBIN)
 		rr_dep_warning();
 
 	/* Temporarily set non-dynamic members dead so we can detect deleted ones. */
-	m = q->members;
-	while (m) {
+	for (m = q->members; m; m = m->next) {
 		if (!m->dynamic)
 			m->dead = 1;
-		m = m->next;
-	}
-
-	interface = ast_category_browse(member_config, NULL);
-	while (interface) {
+	}
+
+	interface = NULL;
+	while (ast_category_browse(member_config, interface))
 		rt_handle_member_record(q, interface, ast_variable_retrieve(member_config, interface, "penalty"));
-		interface = ast_category_browse(member_config, interface);
-	}
 
 	/* Delete all realtime members that have been deleted in DB. */
 	m = q->members;
@@ -1079,11 +1074,11 @@
 	return q;
 }
 
-static struct ast_call_queue *load_realtime_queue(char *queuename)
-{
-	struct ast_variable *queue_vars = NULL;
+static struct call_queue *load_realtime_queue(char *queuename)
+{
+	struct ast_variable *queue_vars;
 	struct ast_config *member_config = NULL;
-	struct ast_call_queue *q;
+	struct call_queue *q;
 
 	/* Find the queue in the in-core list first. */
 	AST_LIST_LOCK(&queues);
@@ -1128,15 +1123,14 @@
 
 static int join_queue(char *queuename, struct queue_ent *qe, enum queue_result *reason)
 {
-	struct ast_call_queue *q;
+	struct call_queue *q;
 	struct queue_ent *cur, *prev = NULL;
 	int res = -1;
 	int pos = 0;
 	int inserted = 0;
 	enum queue_member_status stat;
 
-	q = load_realtime_queue(queuename);
-	if (!q)
+	if (!(q = load_realtime_queue(queuename)))
 		return res;
 
 	AST_LIST_LOCK(&queues);
@@ -1157,7 +1151,7 @@
 		inserted = 0;
 		prev = NULL;
 		cur = q->head;
-		while(cur) {
+		while (cur) {
 			/* We have higher priority than the current user, enter
 			 * before him, after all the other users with priority
 			 * higher or equal to our priority. */
@@ -1177,7 +1171,6 @@
 		ast_copy_string(qe->context, q->context, sizeof(qe->context));
 		q->count++;
 		res = 0;
-		/* XXX missing CalledIDnum ? */
 		manager_event(EVENT_FLAG_CALL, "Join", 
 			      "Channel: %s\r\nCallerID: %s\r\nCallerIDName: %s\r\nQueue: %s\r\nPosition: %d\r\nCount: %d\r\nUniqueid: %s\r\n",
 			      qe->chan->name, 
@@ -1189,6 +1182,7 @@
 	}
 	ast_mutex_unlock(&q->lock);
 	AST_LIST_UNLOCK(&queues);
+
 	return res;
 }
 
@@ -1198,12 +1192,8 @@
 
 	ast_stopstream(chan);
 	res = ast_streamfile(chan, filename, chan->language);
-
 	if (!res)
 		res = ast_waitstream(chan, AST_DIGIT_ANY);
-	else
-		res = 0;
-
 	ast_stopstream(chan);
 
 	return res;
@@ -1237,6 +1227,7 @@
 		/* Return 1 on a successful goto */
 		return 1;
 	}
+
 	return 0;
 }
 
@@ -1247,11 +1238,11 @@
 
 	/* Check to see if this is ludicrous -- if we just announced position, don't do it again*/
 	time(&now);
-	if ( (now - qe->last_pos) < 15 )
+	if ((now - qe->last_pos) < 15)
 		return 0;
 
 	/* If either our position has changed, or we are over the freq timer, say position */
-	if ( (qe->last_pos_said == qe->pos) && ((now - qe->last_pos) < qe->parent->announcefrequency) )
+	if ((qe->last_pos_said == qe->pos) && ((now - qe->last_pos) < qe->parent->announcefrequency))
 		return 0;
 
 	ast_moh_stop(qe->chan);
@@ -1274,14 +1265,14 @@
 			goto playout;
 	}
 	/* Round hold time to nearest minute */
-	avgholdmins = abs(( (qe->parent->holdtime + 30) - (now - qe->start) ) / 60);
+	avgholdmins = abs(((qe->parent->holdtime + 30) - (now - qe->start)) / 60);
 
 	/* If they have specified a rounding then round the seconds as well */
-	if(qe->parent->roundingseconds) {
-		avgholdsecs = (abs(( (qe->parent->holdtime + 30) - (now - qe->start) )) - 60 * avgholdmins) / qe->parent->roundingseconds;
-		avgholdsecs*= qe->parent->roundingseconds;
+	if (qe->parent->roundingseconds) {
+		avgholdsecs = (abs(((qe->parent->holdtime + 30) - (now - qe->start))) - 60 * avgholdmins) / qe->parent->roundingseconds;
+		avgholdsecs *= qe->parent->roundingseconds;
 	} else {
-		avgholdsecs=0;
+		avgholdsecs = 0;
 	}
 
 	if (option_verbose > 2)
@@ -1295,17 +1286,17 @@
 		if (res && valid_exit(qe, res))
 			goto playout;
 
-		if (avgholdmins>0) {
+		if (avgholdmins > 0) {
 			if (avgholdmins < 2) {
 				res = play_file(qe->chan, qe->parent->sound_lessthan);
 				if (res && valid_exit(qe, res))
 					goto playout;
 
-				res = ast_say_number(qe->chan, 2, AST_DIGIT_ANY, qe->chan->language, (char *)NULL);
+				res = ast_say_number(qe->chan, 2, AST_DIGIT_ANY, qe->chan->language, NULL);
 				if (res && valid_exit(qe, res))
 					goto playout;
 			} else {
-				res = ast_say_number(qe->chan, avgholdmins, AST_DIGIT_ANY, qe->chan->language, (char*) NULL);
+				res = ast_say_number(qe->chan, avgholdmins, AST_DIGIT_ANY, qe->chan->language, NULL);
 				if (res && valid_exit(qe, res))
 					goto playout;
 			}
@@ -1315,7 +1306,7 @@
 				goto playout;
 		}
 		if (avgholdsecs>0) {
-			res = ast_say_number(qe->chan, avgholdsecs, AST_DIGIT_ANY, qe->chan->language, (char*) NULL);
+			res = ast_say_number(qe->chan, avgholdsecs, AST_DIGIT_ANY, qe->chan->language, NULL);
 			if (res && valid_exit(qe, res))
 				goto playout;
 
@@ -1367,18 +1358,16 @@
 
 static void leave_queue(struct queue_ent *qe)
 {
-	struct ast_call_queue *q;
+	struct call_queue *q;
 	struct queue_ent *cur, *prev = NULL;
 	int pos = 0;
 
-	q = qe->parent;
-	if (!q)
+	if (!(q = qe->parent))
 		return;
 	ast_mutex_lock(&q->lock);
 
 	prev = NULL;
-	cur = q->head;
-	while(cur) {
+	for (cur = q->head; cur; cur = cur->next) {
 		if (cur == qe) {
 			q->count--;
 
@@ -1398,9 +1387,9 @@
 			cur->pos = ++pos;
 			prev = cur;
 		}
-		cur = cur->next;
 	}
 	ast_mutex_unlock(&q->lock);
+
 	if (q->dead && !q->count) {	
 		/* It's dead and nobody is in it, so kill it */
 		AST_LIST_LOCK(&queues);
@@ -1415,17 +1404,17 @@
 {
 	struct callattempt *oo;
 
-	while(outgoing) {
+	while (outgoing) {
 		/* Hangup any existing lines we have open */
 		if (outgoing->chan && (outgoing->chan != exception))
 			ast_hangup(outgoing->chan);
 		oo = outgoing;
-		outgoing=outgoing->q_next;
+		outgoing = outgoing->q_next;
 		free(oo);
 	}
 }
 
-static int update_status(struct ast_call_queue *q, struct member *member, int status)
+static int update_status(struct call_queue *q, struct member *member, int status)
 {
 	struct member *cur;
 
@@ -1433,29 +1422,29 @@
 		be sure it's still valid */
 	ast_mutex_lock(&q->lock);
 	for (cur = q->members; cur; cur = cur->next) {
-		if (member == cur) {
-			cur->status = status;
-			if (!q->maskmemberstatus) {
-				manager_event(EVENT_FLAG_AGENT, "QueueMemberStatus",
-					"Queue: %s\r\n"
-					"Location: %s\r\n"
-					"Membership: %s\r\n"
-					"Penalty: %d\r\n"
-					"CallsTaken: %d\r\n"
-					"LastCall: %d\r\n"
-					"Status: %d\r\n"
-					"Paused: %d\r\n",
-				q->name, cur->interface, cur->dynamic ? "dynamic" : "static",
-				cur->penalty, cur->calls, (int)cur->lastcall, cur->status, cur->paused);
-			}
-			break;
+		if (member != cur)
+			continue;
+
+		cur->status = status;
+		if (!q->maskmemberstatus) {
+			manager_event(EVENT_FLAG_AGENT, "QueueMemberStatus",
+				      "Queue: %s\r\n"
+				      "Location: %s\r\n"
+				      "Membership: %s\r\n"
+				      "Penalty: %d\r\n"
+				      "CallsTaken: %d\r\n"
+				      "LastCall: %d\r\n"
+				      "Status: %d\r\n"
+				      "Paused: %d\r\n",
+				      q->name, cur->interface, cur->dynamic ? "dynamic" : "static",
+				      cur->penalty, cur->calls, (int)cur->lastcall, cur->status, cur->paused);
 		}
 	}
 	ast_mutex_unlock(&q->lock);
 	return 0;
 }
 
-static int update_dial_status(struct ast_call_queue *q, struct member *member, int status)
+static int update_dial_status(struct call_queue *q, struct member *member, int status)
 {
 	if (status == AST_CAUSE_BUSY)
 		status = AST_DEVICE_BUSY;
@@ -1470,9 +1459,9 @@
 
 /* traverse all defined queues which have calls waiting and contain this member
    return 0 if no other queue has precedence (higher weight) or 1 if found  */
-static int compare_weight(struct ast_call_queue *rq, struct member *member)
-{
-	struct ast_call_queue *q;
+static int compare_weight(struct call_queue *rq, struct member *member)
+{
+	struct call_queue *q;
 	struct member *mem;
 	int found = 0;
 	
@@ -1484,13 +1473,14 @@
 		ast_mutex_lock(&q->lock);
 		if (q->count && q->members) {
 			for (mem = q->members; mem; mem = mem->next) {
-				if (!strcmp(mem->interface, member->interface)) {
-					ast_log(LOG_DEBUG, "Found matching member %s in queue '%s'\n", mem->interface, q->name);
-					if (q->weight > rq->weight) {
-						ast_log(LOG_DEBUG, "Queue '%s' (weight %d, calls %d) is preferred over '%s' (weight %d, calls %d)\n", q->name, q->weight, q->count, rq->name, rq->weight, rq->count);
-						found = 1;
-						break;
-					}
+				if (strcmp(mem->interface, member->interface))
+					continue;
+
+				ast_log(LOG_DEBUG, "Found matching member %s in queue '%s'\n", mem->interface, q->name);
+				if (q->weight > rq->weight) {
+					ast_log(LOG_DEBUG, "Queue '%s' (weight %d, calls %d) is preferred over '%s' (weight %d, calls %d)\n", q->name, q->weight, q->count, rq->name, rq->weight, rq->count);
+					found = 1;
+					break;
 				}
 			}
 		}
@@ -1562,9 +1552,6 @@
 	/* Request the peer */
 	tmp->chan = ast_request(tech, qe->chan->nativeformats, location, &status);
 	if (!tmp->chan) {			/* If we can't, just go on to the next call */
-#if 0
-		ast_log(LOG_NOTICE, "Unable to create channel of type '%s' for Queue\n", cur->tech);
-#endif			
 		if (qe->chan->cdr)
 			ast_cdr_busy(qe->chan->cdr);
 		tmp->stillgoing = 0;
@@ -1594,8 +1581,7 @@
 	tmp->chan->adsicpe = qe->chan->adsicpe;
 
 	/* Place the call, but don't wait on the answer */
-	res = ast_call(tmp->chan, location, 0);
-	if (res) {
+	if ((res = ast_call(tmp->chan, location, 0))) {
 		/* Again, keep going even if there's an error */
 		if (option_debug)
 			ast_log(LOG_DEBUG, "ast call on peer returned %d\n", res);
@@ -1622,6 +1608,7 @@
 		if (option_verbose > 2)
 			ast_verbose(VERBOSE_PREFIX_3 "Called %s\n", tmp->interface);
 	}
+
 	return 1;
 }
 
@@ -1632,11 +1619,12 @@
 
 	for (cur = outgoing; cur; cur = cur->q_next) {
 		if (cur->stillgoing &&					/* Not already done */
-			!cur->chan &&					/* Isn't already going */
-			(!best || cur->metric < best->metric)) {	/* We haven't found one yet, or it's better */
-				best = cur;
-		}
-	}
+		    !cur->chan &&					/* Isn't already going */
+		    (!best || cur->metric < best->metric)) {		/* We haven't found one yet, or it's better */
+			best = cur;
+		}
+	}
+
 	return best;
 }
 
@@ -1670,6 +1658,7 @@
 		if (best->chan) /* break out with result = 1 */
 			ret = 1;
 	}
+
 	return ret;
 }
 
@@ -1693,6 +1682,7 @@
 		}
 	}
 	qe->parent->wrapped = 0;
+
 	return 0;
 }
 
@@ -1711,15 +1701,8 @@
 
 		/* Stop playback */
 		ast_stopstream(chan);
-	} else {
-		res = 0;
 	}
 	
-	/*if (res) {
-		ast_log(LOG_WARNING, "ast_streamfile failed on %s \n", chan->name);
-		res = 0;
-	}*/
-
 	return res;
 }
 
@@ -1780,7 +1763,6 @@
 /*! \brief RNA == Ring No Answer. Common code that is executed when we try a queue member and they don't answer. */
 static void rna(int rnatime, struct queue_ent *qe, char *membername)
 {
-
 	if (option_verbose > 2)
 		ast_verbose( VERBOSE_PREFIX_3 "Nobody picked up in %d ms\n", rnatime);
 	ast_queue_log(qe->parent->name, qe->chan->uniqueid, membername, "RINGNOANSWER", "%d", rnatime);
@@ -1816,7 +1798,7 @@
 	long starttime = 0;
 	long endtime = 0;	
 
-	starttime = (long)time(NULL);
+	starttime = (long) time(NULL);
 	
 	while(*to && !peer) {
 		int numlines, retry, pos = 1;
@@ -1861,9 +1843,10 @@
 			} else if (o->chan && (o->chan == winner)) {
 				ast_copy_string(on, o->member->interface, sizeof(on));
 				if (!ast_strlen_zero(o->chan->call_forward)) {
-					char tmpchan[256]="";
+					char tmpchan[256];
 					char *stuff;
 					char *tech;
+
 					ast_copy_string(tmpchan, o->chan->call_forward, sizeof(tmpchan));
 					if ((stuff = strchr(tmpchan, '/'))) {
 						*stuff++ = '\0';
@@ -1977,9 +1960,8 @@
 					}
 					ast_frfree(f);
 				} else {
-					endtime = (long)time(NULL);
-					endtime -= starttime;
-					rna(endtime*1000, qe, on);
+					endtime = (long) time(NULL) - starttime;
+					rna(endtime * 1000, qe, on);
 					do_hang(o);
 					if (qe->parent->strategy != QUEUE_STRATEGY_RINGALL) {
 						if (qe->parent->timeoutrestart)
@@ -1991,15 +1973,9 @@
 		}
 		if (winner == in) {
 			f = ast_read(in);
-#if 0
-			if (f && (f->frametype != AST_FRAME_VOICE))
-					printf("Frame type: %d, %d\n", f->frametype, f->subclass);
-			else if (!f || (f->frametype != AST_FRAME_VOICE))
-				printf("Hangup received on %s\n", in->name);
-#endif
 			if (!f || ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP))) {
 				/* Got hung up */
-				*to=-1;
+				*to = -1;
 				if (f)
 					ast_frfree(f);
 				return NULL;
@@ -2007,15 +1983,15 @@
 			if ((f->frametype == AST_FRAME_DTMF) && caller_disconnect && (f->subclass == '*')) {
 				if (option_verbose > 3)
 					ast_verbose(VERBOSE_PREFIX_3 "User hit %c to disconnect call.\n", f->subclass);
-				*to=0;
+				*to = 0;
 				ast_frfree(f);
 				return NULL;
 			}
 			if ((f->frametype == AST_FRAME_DTMF) && (f->subclass != '*') && valid_exit(qe, f->subclass)) {
 				if (option_verbose > 3)
 					ast_verbose(VERBOSE_PREFIX_3 "User pressed digit: %c\n", f->subclass);
-				*to=0;
-				*digit=f->subclass;
+				*to = 0;
+				*digit = f->subclass;
 				ast_frfree(f);
 				return NULL;
 			}
@@ -2026,7 +2002,6 @@
 	}
 
 	return peer;
-	
 }
 
 static int is_our_turn(struct queue_ent *qe)
@@ -2052,28 +2027,28 @@
 		}	
 
 	} else {
-
 		/* This needs a lock. How many members are available to be served? */
-	
 		ast_mutex_lock(&qe->parent->lock);
 			
 		ch = qe->parent->head;
-		cur = qe->parent->members;
-	
-		while (cur) {
-			if (cur->status == 1) 
-				avl++;
-			cur = cur->next;
-		}
-
-		if (option_debug)
-			ast_log(LOG_DEBUG, "There are %d available members.\n", avl);
 	
 		if (qe->parent->strategy == QUEUE_STRATEGY_RINGALL) {
 			if (option_debug)
-				ast_log(LOG_DEBUG, "Even though there are %d available members, the strategy is ringall so only the head call is allowed in!\n", avl);
+				ast_log(LOG_DEBUG, "Even though there are %d available members, the strategy is ringall so only the head call is allowed in\n", avl);
 			avl = 1;
-		}
+		} else {
+			for (cur = qe->parent->members; cur; cur = cur->next) {
+				switch (cur->status) {
+				case AST_DEVICE_NOT_INUSE:
+				case AST_DEVICE_UNKNOWN:
+					avl++;
+					break;
+				}
+			}
+		}
+
+		if (option_debug)
+			ast_log(LOG_DEBUG, "There are %d available members.\n", avl);
 	

[... 1563 lines stripped ...]


More information about the asterisk-commits mailing list