aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2006-06-14 22:35:49 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2006-06-14 22:35:49 +0000
commit00a6d4e9cef4a8d232bfa30b5184f141bd7a6f09 (patch)
tree8f707463128cd444f91879ac49be420171f336f3
parent14b5684f6052d81033c87ce7aad43879218ef1a3 (diff)
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 ........ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@34161 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--apps/app_queue.c144
-rw-r--r--channels/chan_iax2.c62
2 files changed, 98 insertions, 108 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 5115de239..bb2c5118a 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -506,8 +506,7 @@ static void *changethread(void *data)
technology = ast_strdupa(sc->dev);
loc = strchr(technology, '/');
if (loc) {
- *loc = '\0';
- loc++;
+ *loc++ = '\0';
} else {
free(sc);
return NULL;
@@ -520,43 +519,44 @@ static void *changethread(void *data)
}
AST_LIST_UNLOCK(&interfaces);
- if (curint) {
-
+ 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_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);
+ 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);
- } else {
- 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));
+ ast_mutex_unlock(&q->lock);
}
- free(sc);
+ AST_LIST_UNLOCK(&queues);
+
return NULL;
}
@@ -567,17 +567,19 @@ static int statechange_queue(const char *dev, int state, void *ign)
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;
}
@@ -656,7 +658,7 @@ static void clear_queue(struct ast_call_queue *q)
static int add_to_interfaces(char *interface)
{
- struct ast_member_interfaces *curint, *newint;
+ struct ast_member_interfaces *curint;
AST_LIST_LOCK(&interfaces);
AST_LIST_TRAVERSE(&interfaces, curint, list) {
@@ -664,18 +666,21 @@ static int add_to_interfaces(char *interface)
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 (curint) {
+ AST_LIST_UNLOCK(&interfaces);
+ return 0;
+ }
- if ((newint = ast_calloc(1, sizeof(*newint)))) {
- ast_copy_string(newint->interface, interface, sizeof(newint->interface));
- AST_LIST_INSERT_HEAD(&interfaces, newint, list);
- }
+ 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)
@@ -687,31 +692,33 @@ static int interface_exists_global(char *interface)
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;
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;
@@ -725,14 +732,9 @@ static void clear_and_free_interfaces(void)
struct ast_member_interfaces *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.
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 27560a29b..9a703a067 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -9509,51 +9509,39 @@ struct ast_custom_function iaxpeer_function = {
/*! \brief Part of the device state notification system ---*/
static int iax2_devicestate(void *data)
{
- char *dest = (char *) data;
+ struct parsed_dial_string pds;
+ char *tmp = ast_strdupa(data);
struct iax2_peer *p;
- int found = 0;
- char *ext, *host;
- char tmp[256];
int res = AST_DEVICE_INVALID;
- ast_copy_string(tmp, dest, sizeof(tmp));
- host = strchr(tmp, '@');
- if (host) {
- *host = '\0';
- host++;
- ext = tmp;
- } else {
- host = tmp;
- ext = NULL;
- }
-
+ parse_dial_string(tmp, &pds);
+ if (ast_strlen_zero(pds.peer))
+ return res;
+
if (option_debug > 2)
- ast_log(LOG_DEBUG, "Checking device state for device %s\n", dest);
+ ast_log(LOG_DEBUG, "Checking device state for device %s\n", pds.peer);
/* SLD: FIXME: second call to find_peer during registration */
- p = find_peer(host, 1);
- if (p) {
- found++;
- res = AST_DEVICE_UNAVAILABLE;
- if (option_debug > 2)
- ast_log(LOG_DEBUG, "iax2_devicestate(%s): Found peer. What's device state of %s? addr=%d, defaddr=%d maxms=%d, lastms=%d\n",
- host, dest, p->addr.sin_addr.s_addr, p->defaddr.sin_addr.s_addr, p->maxms, p->lastms);
-
- if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
- (!p->maxms || ((p->lastms > -1) && (p->historicms <= p->maxms)))) {
- /* Peer is registered, or have default IP address
- and a valid registration */
- if (p->historicms == 0 || p->historicms <= p->maxms)
- /* let the core figure out whether it is in use or not */
- res = AST_DEVICE_UNKNOWN;
- }
- } else {
- if (option_debug > 2)
- ast_log(LOG_DEBUG, "Devicestate: Can't find peer %s.\n", host);
- }
+ if (!(p = find_peer(pds.peer, 1)))
+ return res;
+
+ res = AST_DEVICE_UNAVAILABLE;
+ if (option_debug > 2)
+ ast_log(LOG_DEBUG, "iax2_devicestate: Found peer. What's device state of %s? addr=%d, defaddr=%d maxms=%d, lastms=%d\n",
+ pds.peer, p->addr.sin_addr.s_addr, p->defaddr.sin_addr.s_addr, p->maxms, p->lastms);
- if (p && ast_test_flag(p, IAX_TEMPONLY))
+ if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
+ (!p->maxms || ((p->lastms > -1) && (p->historicms <= p->maxms)))) {
+ /* Peer is registered, or have default IP address
+ and a valid registration */
+ if (p->historicms == 0 || p->historicms <= p->maxms)
+ /* let the core figure out whether it is in use or not */
+ res = AST_DEVICE_UNKNOWN;
+ }
+
+ if (ast_test_flag(p, IAX_TEMPONLY))
destroy_peer(p);
+
return res;
}