|
|
|
@ -188,43 +188,30 @@ static void cli_handler_do(const cli_handler_t *handlers, str *instr,
|
|
|
|
|
cw->cw_printf(cw, "%s:" STR_FORMAT "\n", "Unknown or incomplete command:", STR_FMT(instr));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void destroy_own_foreign_calls(int foreign_call, unsigned int uint_keyspace_db) {
|
|
|
|
|
static void destroy_own_foreign_calls(bool foreign_call, unsigned int uint_keyspace_db) {
|
|
|
|
|
struct call *c = NULL;
|
|
|
|
|
struct call_monologue *ml = NULL;
|
|
|
|
|
GQueue call_list = G_QUEUE_INIT;
|
|
|
|
|
GHashTableIter iter;
|
|
|
|
|
gpointer key, value;
|
|
|
|
|
GList *i;
|
|
|
|
|
|
|
|
|
|
// lock read
|
|
|
|
|
rwlock_lock_r(&rtpe_callhash_lock);
|
|
|
|
|
|
|
|
|
|
g_hash_table_iter_init(&iter, rtpe_callhash);
|
|
|
|
|
while (g_hash_table_iter_next(&iter, &key, &value)) {
|
|
|
|
|
c = (struct call*)value;
|
|
|
|
|
if (!c) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ITERATE_CALL_LIST_START(CALL_ITERATOR_MAIN, c);
|
|
|
|
|
// match foreign_call flag
|
|
|
|
|
if ((foreign_call != UNDEFINED) && !(foreign_call == IS_FOREIGN_CALL(c))) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (foreign_call && !IS_FOREIGN_CALL(c))
|
|
|
|
|
goto next;
|
|
|
|
|
if (!foreign_call && IS_FOREIGN_CALL(c))
|
|
|
|
|
goto next;
|
|
|
|
|
|
|
|
|
|
// match uint_keyspace_db, if some given
|
|
|
|
|
if ((uint_keyspace_db != UNDEFINED) && !(uint_keyspace_db == c->redis_hosted_db)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if ((uint_keyspace_db != UNDEFINED) && !(uint_keyspace_db == c->redis_hosted_db))
|
|
|
|
|
goto next;
|
|
|
|
|
|
|
|
|
|
// increase ref counter
|
|
|
|
|
obj_get(c);
|
|
|
|
|
|
|
|
|
|
// save call reference
|
|
|
|
|
g_queue_push_tail(&call_list, c);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// unlock read
|
|
|
|
|
rwlock_unlock_r(&rtpe_callhash_lock);
|
|
|
|
|
next:;
|
|
|
|
|
ITERATE_CALL_LIST_NEXT_END(c);
|
|
|
|
|
|
|
|
|
|
// destroy calls
|
|
|
|
|
while ((c = g_queue_pop_head(&call_list))) {
|
|
|
|
@ -243,15 +230,15 @@ static void destroy_own_foreign_calls(int foreign_call, unsigned int uint_keyspa
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void destroy_all_foreign_calls(void) {
|
|
|
|
|
destroy_own_foreign_calls(1, UNDEFINED);
|
|
|
|
|
destroy_own_foreign_calls(true, UNDEFINED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void destroy_all_own_calls(void) {
|
|
|
|
|
destroy_own_foreign_calls(0, UNDEFINED);
|
|
|
|
|
destroy_own_foreign_calls(false, UNDEFINED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void destroy_keyspace_foreign_calls(unsigned int uint_keyspace_db) {
|
|
|
|
|
destroy_own_foreign_calls(1, uint_keyspace_db);
|
|
|
|
|
destroy_own_foreign_calls(true, uint_keyspace_db);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void cli_incoming_params_start(str *instr, struct cli_writer *cw) {
|
|
|
|
@ -653,11 +640,8 @@ static void cli_incoming_list_callid(str *instr, struct cli_writer *cw) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void cli_incoming_list_sessions(str *instr, struct cli_writer *cw) {
|
|
|
|
|
GHashTableIter iter;
|
|
|
|
|
gpointer key, value;
|
|
|
|
|
str *ptrkey;
|
|
|
|
|
struct call *call;
|
|
|
|
|
int found_own = 0, found_foreign = 0;
|
|
|
|
|
size_t found = 0;
|
|
|
|
|
bool all = false, own = false;
|
|
|
|
|
|
|
|
|
|
static const char* LIST_ALL = "all";
|
|
|
|
|
static const char* LIST_OWN = "own";
|
|
|
|
@ -668,57 +652,39 @@ static void cli_incoming_list_sessions(str *instr, struct cli_writer *cw) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rwlock_lock_r(&rtpe_callhash_lock);
|
|
|
|
|
|
|
|
|
|
if (g_hash_table_size(rtpe_callhash)==0) {
|
|
|
|
|
cw->cw_printf(cw, "No sessions on this media relay.\n");
|
|
|
|
|
rwlock_unlock_r(&rtpe_callhash_lock);
|
|
|
|
|
if (str_cmp(instr, LIST_ALL) == 0)
|
|
|
|
|
all = true;
|
|
|
|
|
else if (str_cmp(instr, LIST_OWN) == 0)
|
|
|
|
|
own = true;
|
|
|
|
|
else if (str_cmp(instr, LIST_FOREIGN) == 0)
|
|
|
|
|
{ } // default
|
|
|
|
|
else {
|
|
|
|
|
// list session for callid
|
|
|
|
|
cli_incoming_list_callid(instr, cw);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g_hash_table_iter_init (&iter, rtpe_callhash);
|
|
|
|
|
while (g_hash_table_iter_next(&iter, &key, &value)) {
|
|
|
|
|
ptrkey = (str*)key;
|
|
|
|
|
call = (struct call*)value;
|
|
|
|
|
|
|
|
|
|
if (str_cmp(instr, LIST_ALL) == 0) {
|
|
|
|
|
if (!call) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
} else if (str_cmp(instr, LIST_OWN) == 0) {
|
|
|
|
|
if (!call || IS_FOREIGN_CALL(call)) {
|
|
|
|
|
continue;
|
|
|
|
|
} else {
|
|
|
|
|
found_own = 1;
|
|
|
|
|
}
|
|
|
|
|
} else if (str_cmp(instr, LIST_FOREIGN) == 0) {
|
|
|
|
|
if (!call || !IS_FOREIGN_CALL(call)) {
|
|
|
|
|
continue;
|
|
|
|
|
} else {
|
|
|
|
|
found_foreign = 1;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// expect callid parameter
|
|
|
|
|
break;
|
|
|
|
|
ITERATE_CALL_LIST_START(CALL_ITERATOR_MAIN, call);
|
|
|
|
|
if (!all) {
|
|
|
|
|
if (IS_FOREIGN_CALL(call) && own)
|
|
|
|
|
goto next;
|
|
|
|
|
if (!IS_FOREIGN_CALL(call) && !own)
|
|
|
|
|
goto next;
|
|
|
|
|
}
|
|
|
|
|
found++;
|
|
|
|
|
|
|
|
|
|
cw->cw_printf(cw, "callid: %60s | deletionmark:%4s | created:%12i | proxy:%s | redis_keyspace:%i | foreign:%s\n", ptrkey->s, call->ml_deleted?"yes":"no", (int)call->created.tv_sec, call->created_from, call->redis_hosted_db, IS_FOREIGN_CALL(call)?"yes":"no");
|
|
|
|
|
}
|
|
|
|
|
rwlock_unlock_r(&rtpe_callhash_lock);
|
|
|
|
|
cw->cw_printf(cw, "callid: %60s | deletionmark:%4s | created:%12i | proxy:%s | redis_keyspace:%i | foreign:%s\n", call->callid.s, call->ml_deleted?"yes":"no", (int)call->created.tv_sec, call->created_from, call->redis_hosted_db, IS_FOREIGN_CALL(call)?"yes":"no");
|
|
|
|
|
|
|
|
|
|
if (str_cmp(instr, LIST_ALL) == 0) {
|
|
|
|
|
;
|
|
|
|
|
} else if (str_cmp(instr, LIST_OWN) == 0) {
|
|
|
|
|
if (!found_own) {
|
|
|
|
|
next:;
|
|
|
|
|
ITERATE_CALL_LIST_NEXT_END(call);
|
|
|
|
|
|
|
|
|
|
if (!found) {
|
|
|
|
|
if (all)
|
|
|
|
|
cw->cw_printf(cw, "No sessions on this media relay.\n");
|
|
|
|
|
else if (own)
|
|
|
|
|
cw->cw_printf(cw, "No own sessions on this media relay.\n");
|
|
|
|
|
}
|
|
|
|
|
} else if (str_cmp(instr, LIST_FOREIGN) == 0) {
|
|
|
|
|
if (!found_foreign) {
|
|
|
|
|
else
|
|
|
|
|
cw->cw_printf(cw, "No foreign sessions on this media relay.\n");
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// list session for callid
|
|
|
|
|
cli_incoming_list_callid(instr, cw);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
@ -1093,14 +1059,7 @@ static void cli_incoming_kslist(str *instr, struct cli_writer *cw) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void cli_incoming_active_standby(struct cli_writer *cw, bool foreign) {
|
|
|
|
|
GHashTableIter iter;
|
|
|
|
|
gpointer key, value;
|
|
|
|
|
|
|
|
|
|
rwlock_lock_r(&rtpe_callhash_lock);
|
|
|
|
|
|
|
|
|
|
g_hash_table_iter_init(&iter, rtpe_callhash);
|
|
|
|
|
while (g_hash_table_iter_next(&iter, &key, &value)) {
|
|
|
|
|
struct call *c = value;
|
|
|
|
|
ITERATE_CALL_LIST_START(CALL_ITERATOR_MAIN, c);
|
|
|
|
|
rwlock_lock_w(&c->master_lock);
|
|
|
|
|
call_make_own_foreign(c, foreign);
|
|
|
|
|
c->last_signal = MAX(c->last_signal, rtpe_now.tv_sec);
|
|
|
|
@ -1110,8 +1069,7 @@ static void cli_incoming_active_standby(struct cli_writer *cw, bool foreign) {
|
|
|
|
|
}
|
|
|
|
|
rwlock_unlock_w(&c->master_lock);
|
|
|
|
|
redis_update_onekey(c, rtpe_redis_write);
|
|
|
|
|
}
|
|
|
|
|
rwlock_unlock_r(&rtpe_callhash_lock);
|
|
|
|
|
ITERATE_CALL_LIST_NEXT_END(c);
|
|
|
|
|
|
|
|
|
|
cw->cw_printf(cw, "Ok, all calls set to '%s'\n", foreign ? "foreign (standby)" : "owned (active)");
|
|
|
|
|
}
|
|
|
|
|