From: Automerge script Date: Wed, 14 Jun 2006 23:11:07 +0000 (+0000) Subject: automerge commit X-Git-Tag: 1.2.10-netsec~43 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4d1ed8bde0083a67de273eae427dadfc930ce601;p=thirdparty%2Fasterisk.git automerge commit git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2-netsec@34192 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/apps/app_queue.c b/apps/app_queue.c index 6e943f31b6..2dc750eb1d 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -472,8 +472,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; @@ -486,43 +485,44 @@ static void *changethread(void *data) } 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_mutex_lock(&qlock); - for (q = queues; q; q = q->next) { - 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_mutex_unlock(&qlock); - } 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); + return NULL; } - free(sc); + + if (option_debug) + ast_log(LOG_DEBUG, "Device '%s/%s' changed to state '%d' (%s)\n", technology, loc, sc->state, devstate2str(sc->state)); + ast_mutex_lock(&qlock); + for (q = queues; q; q = q->next) { + 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_mutex_unlock(&qlock); + return NULL; } @@ -534,17 +534,18 @@ static int statechange_queue(const char *dev, int state, void *ign) pthread_t t; pthread_attr_t attr; - sc = malloc(sizeof(struct statechange) + strlen(dev) + 1); - if (sc) { - 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 = malloc(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; } @@ -620,7 +621,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; if (!interface) return 0; @@ -631,19 +632,22 @@ 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 = malloc(sizeof(*newint)))) { - memset(newint, 0, 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 = malloc(sizeof(*curint)))) { + memset(curint, 0, 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) @@ -658,13 +662,9 @@ static int interface_exists_global(char *interface) ast_mutex_lock(&qlock); for (q = queues; q && !ret; q = q->next) { ast_mutex_lock(&q->lock); - mem = q->members; - while(mem) { - if (!strcasecmp(interface, mem->interface)) { + for (mem = q->members; mem && !ret; mem = mem->next) { + if (!strcasecmp(interface, mem->interface)) ret = 1; - break; - } - mem = mem->next; } ast_mutex_unlock(&q->lock); } @@ -673,7 +673,6 @@ static int interface_exists_global(char *interface) return ret; } - static int remove_from_interfaces(char *interface) { struct ast_member_interfaces *curint; @@ -683,11 +682,14 @@ static int remove_from_interfaces(char *interface) 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; @@ -701,14 +703,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 1f66bbc263..8b24167621 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -9330,51 +9330,39 @@ struct ast_custom_function iaxpeer_function = { /*--- iax2_devicestate: 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 (!pds.peer || 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; }