|
|
|
|
@ -1258,17 +1258,22 @@ static int get_port(struct udp_fd *r, u_int16_t p, const struct call *c) {
|
|
|
|
|
|
|
|
|
|
assert(r->fd == -1);
|
|
|
|
|
|
|
|
|
|
__C_DBG("attempting to open port %u", p);
|
|
|
|
|
|
|
|
|
|
mutex_lock(&m->portlock);
|
|
|
|
|
if (bit_array_isset(m->ports_used, p)) {
|
|
|
|
|
mutex_unlock(&m->portlock);
|
|
|
|
|
__C_DBG("port in use");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
bit_array_set(m->ports_used, p);
|
|
|
|
|
mutex_unlock(&m->portlock);
|
|
|
|
|
__C_DBG("port locked");
|
|
|
|
|
|
|
|
|
|
ret = get_port6(r, p, c);
|
|
|
|
|
|
|
|
|
|
if (ret) {
|
|
|
|
|
__C_DBG("couldn't open port");
|
|
|
|
|
mutex_lock(&m->portlock);
|
|
|
|
|
bit_array_clear(m->ports_used, p);
|
|
|
|
|
mutex_unlock(&m->portlock);
|
|
|
|
|
@ -1283,6 +1288,7 @@ static int get_port(struct udp_fd *r, u_int16_t p, const struct call *c) {
|
|
|
|
|
static void release_port(struct udp_fd *r, struct callmaster *m) {
|
|
|
|
|
if (r->fd == -1 || !r->localport)
|
|
|
|
|
return;
|
|
|
|
|
__C_DBG("releasing port %u", r->localport);
|
|
|
|
|
mutex_lock(&m->portlock);
|
|
|
|
|
bit_array_clear(m->ports_used, r->localport);
|
|
|
|
|
mutex_unlock(&m->portlock);
|
|
|
|
|
|