diff options
-rw-r--r-- | apps/app_queue.c | 144 | ||||
-rw-r--r-- | channels/chan_iax2.c | 62 |
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; } |