}
-static int iax2_poke_peer(struct iax2_peer *peer);
+static int iax2_poke_peer(struct iax2_peer *peer, int heldcall);
static void reg_source_db(struct iax2_peer *p)
{
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Seeding '%s' at %s:%d for %d\n", p->name,
inet_ntoa(in), atoi(c), atoi(d));
- iax2_poke_peer(p);
+ iax2_poke_peer(p, 0);
p->expirey = atoi(d);
memset(&p->addr, 0, sizeof(p->addr));
p->addr.sin_family = AF_INET;
/* Update the host */
memcpy(&p->addr, sin, sizeof(p->addr));
/* Verify that the host is really there */
- iax2_poke_peer(p);
+ iax2_poke_peer(p, callno);
}
/* Setup the expirey */
if (p->expire > -1)
{
struct iax2_peer *peer = data;
peer->pokeexpire = -1;
- iax2_poke_peer(peer);
+ iax2_poke_peer(peer, 0);
return 0;
}
return 0;
}
-static int iax2_poke_peer(struct iax2_peer *peer)
+static int iax2_poke_peer(struct iax2_peer *peer, int heldcall)
{
if (!peer->maxms || !peer->addr.sin_addr.s_addr) {
/* IF we have no IP, or this isn't to be monitored, return
ast_log(LOG_NOTICE, "Still have a callno...\n");
iax2_destroy(peer->callno);
}
+ if (heldcall)
+ ast_mutex_unlock(&iaxsl[heldcall]);
peer->callno = find_callno(0, 0, &peer->addr, NEW_FORCE, 0);
+ if (heldcall)
+ ast_mutex_lock(&iaxsl[heldcall]);
if (peer->callno < 1) {
ast_log(LOG_WARNING, "Unable to allocate call for poking peer '%s'\n", peer->name);
return -1;
/* Qualify hosts, too */
ast_mutex_lock(&peerl.lock);
for (peer = peerl.peers; peer; peer = peer->next)
- iax2_poke_peer(peer);
+ iax2_poke_peer(peer, 0);
ast_mutex_unlock(&peerl.lock);
return 0;
}
iax2_do_register(reg);
ast_mutex_lock(&peerl.lock);
for (peer = peerl.peers; peer; peer = peer->next)
- iax2_poke_peer(peer);
+ iax2_poke_peer(peer, 0);
ast_mutex_unlock(&peerl.lock);
return res;
}