|
|
|
@ -1128,8 +1128,14 @@ static void call_destroy_all_branches(struct call *c) { |
|
|
|
static void call_destroy(struct call *c) { |
|
|
|
struct callstream *s; |
|
|
|
|
|
|
|
if(c->next) |
|
|
|
c->next->prev = c->prev; |
|
|
|
|
|
|
|
if(c->prev) |
|
|
|
c->prev->next = c->next; |
|
|
|
else if(c->next) |
|
|
|
/* we delete first element in list, so update callid hash */ |
|
|
|
g_hash_table_replace(c->callmaster->callhash, c->callid, c->next); |
|
|
|
|
|
|
|
#ifndef NO_REDIS |
|
|
|
/* TODO: take into account the viabranch list */ |
|
|
|
@ -1456,15 +1462,15 @@ char *call_delete_udp(const char **out, struct callmaster *m) { |
|
|
|
c->callid, VIA2STR(c->viabranch)); |
|
|
|
call_destroy_all_branches(c); |
|
|
|
} else { |
|
|
|
/* TODO: XXX: if "c" was first element, then update callhash table, because |
|
|
|
we delete "c" here! */ |
|
|
|
mylog(LOG_INFO, "[%s - %s] Deleting selective call branch", |
|
|
|
c->callid, VIA2STR(c->viabranch)); |
|
|
|
if(c->prev) |
|
|
|
c->prev->next = c->next; |
|
|
|
call_destroy(c); |
|
|
|
} |
|
|
|
break; |
|
|
|
} else { |
|
|
|
DBG("passed viabranch '%s' doesn't match stored viabranch '%s', don't remove call", |
|
|
|
DBG("passed viabranch '%s' doesn't match stored viabranch '%s'", |
|
|
|
VIA2STR(out[RE_UDP_D_VIABRANCH]), VIA2STR(c->viabranch)); |
|
|
|
} |
|
|
|
c = next; |
|
|
|
|