From 14759133db64489dc0c9f8e38682f6f64c0f9874 Mon Sep 17 00:00:00 2001 From: Victor Seva Date: Wed, 17 May 2023 16:36:57 +0200 Subject: [PATCH] mohqueue: clang-format for coherent indentation and coding style --- src/modules/mohqueue/mohq_common.h | 51 +- src/modules/mohqueue/mohq_db.c | 697 +++-- src/modules/mohqueue/mohq_db.h | 40 +- src/modules/mohqueue/mohq_funcs.c | 3857 +++++++++++++-------------- src/modules/mohqueue/mohq_funcs.h | 16 +- src/modules/mohqueue/mohq_locks.c | 162 +- src/modules/mohqueue/mohq_locks.h | 18 +- src/modules/mohqueue/mohqueue_mod.c | 578 ++-- src/modules/mohqueue/mohqueue_mod.h | 148 +- 9 files changed, 2684 insertions(+), 2883 deletions(-) diff --git a/src/modules/mohqueue/mohq_common.h b/src/modules/mohqueue/mohq_common.h index 228587cc989..eefb0db2a9e 100644 --- a/src/modules/mohqueue/mohq_common.h +++ b/src/modules/mohqueue/mohq_common.h @@ -82,49 +82,48 @@ #include "../../modules/tm/tm_load.h" /* convenience macros */ -#define MOHQ_STRUCT_PTR_OFFSET( struct1, cast1, offset1 ) \ +#define MOHQ_STRUCT_PTR_OFFSET(struct1, cast1, offset1) \ (cast1)(struct1) + (offset1) -#define MOHQ_STR_COPY( str1, str2 ) \ - memcpy((str1)->s, (str2)->s, (str2)->len ); \ +#define MOHQ_STR_COPY(str1, str2) \ + memcpy((str1)->s, (str2)->s, (str2)->len); \ (str1)->len = (str2)->len; -#define MOHQ_STR_APPEND( str1, str2 ) \ +#define MOHQ_STR_APPEND(str1, str2) \ memcpy((str1)->s + (str1)->len, (str2)->s, (str2)->len); \ (str1)->len += (str2)->len; -#define MOHQ_STR_APPEND_L( str1, str1_lim, s2, s2_len ) \ - if ((str1)->len + (s2_len) >= (str1_lim)) { \ - LM_ERR( "Failed to append to str: too long!\n" ); \ - } else { \ - MOHQ_STR_APPEND((str1), (s2), (s2_len)); \ - (str1_lim) -= (s2_len); \ +#define MOHQ_STR_APPEND_L(str1, str1_lim, s2, s2_len) \ + if((str1)->len + (s2_len) >= (str1_lim)) { \ + LM_ERR("Failed to append to str: too long!\n"); \ + } else { \ + MOHQ_STR_APPEND((str1), (s2), (s2_len)); \ + (str1_lim) -= (s2_len); \ } -#define MOHQ_STR_COPY_CSTR( str1, cstr1 ) \ +#define MOHQ_STR_COPY_CSTR(str1, cstr1) \ memcpy((str1)->s + (str1)->len, (cstr1), strlen((cstr1))); \ (str1)->len += strlen((cstr1)); -#define MOHQ_STR_APPEND_CSTR( str1, cstr1 ) \ - MOHQ_STR_COPY_CSTR((str1), (cstr1)) +#define MOHQ_STR_APPEND_CSTR(str1, cstr1) MOHQ_STR_COPY_CSTR((str1), (cstr1)) -#define MOHQ_STR_APPEND_CSTR_L( str1, str1_lim, cstr1 ) \ - if ((str1)->len + strlen(cstr1) >= (str1_lim)) { \ - LM_ERR( "Failed to append to str: too long!\n" ); \ - } else { \ - MOHQ_STR_APPEND_CSTR((str1), (cstr1)); \ +#define MOHQ_STR_APPEND_CSTR_L(str1, str1_lim, cstr1) \ + if((str1)->len + strlen(cstr1) >= (str1_lim)) { \ + LM_ERR("Failed to append to str: too long!\n"); \ + } else { \ + MOHQ_STR_APPEND_CSTR((str1), (cstr1)); \ } /* STR_EQ assumes we're not using str pointers, which is obnoxious */ -#define MOHQ_STR_EQ( str1, str2 ) \ - (((str1)->len == (str2)->len) && \ - memcmp((str1)->s, (str2)->s, (str1)->len) == 0) +#define MOHQ_STR_EQ(str1, str2) \ + (((str1)->len == (str2)->len) \ + && memcmp((str1)->s, (str2)->s, (str1)->len) == 0) -#define MOHQ_STR_EMPTY( str1 ) \ - (((str1) != NULL && ((str1)->s == NULL || (str1)->len <= 0 )) \ - || (str1) == NULL ) +#define MOHQ_STR_EMPTY(str1) \ + (((str1) != NULL && ((str1)->s == NULL || (str1)->len <= 0)) \ + || (str1) == NULL) -#define MOHQ_HEADER_EMPTY( hdr1 ) \ - ((hdr1) == NULL || MOHQ_STR_EMPTY( &(hdr1)->body )) +#define MOHQ_HEADER_EMPTY(hdr1) \ + ((hdr1) == NULL || MOHQ_STR_EMPTY(&(hdr1)->body)) #endif /* MOHQ_COMMON_H */ diff --git a/src/modules/mohqueue/mohq_db.c b/src/modules/mohqueue/mohq_db.c index 7c62ee6d4cb..156907b3d79 100644 --- a/src/modules/mohqueue/mohq_db.c +++ b/src/modules/mohqueue/mohq_db.c @@ -27,52 +27,36 @@ * mohqueue definitions **********/ -str MOHQCSTR_ID = STR_STATIC_INIT ("id"); -str MOHQCSTR_URI = STR_STATIC_INIT ("uri"); -str MOHQCSTR_MDIR = STR_STATIC_INIT ("mohdir"); -str MOHQCSTR_MFILE = STR_STATIC_INIT ("mohfile"); -str MOHQCSTR_NAME = STR_STATIC_INIT ("name"); -str MOHQCSTR_DEBUG = STR_STATIC_INIT ("debug"); - -static str *mohq_columns [] = - { - &MOHQCSTR_ID, - &MOHQCSTR_URI, - &MOHQCSTR_MDIR, - &MOHQCSTR_MFILE, - &MOHQCSTR_NAME, - &MOHQCSTR_DEBUG, - NULL - }; +str MOHQCSTR_ID = STR_STATIC_INIT("id"); +str MOHQCSTR_URI = STR_STATIC_INIT("uri"); +str MOHQCSTR_MDIR = STR_STATIC_INIT("mohdir"); +str MOHQCSTR_MFILE = STR_STATIC_INIT("mohfile"); +str MOHQCSTR_NAME = STR_STATIC_INIT("name"); +str MOHQCSTR_DEBUG = STR_STATIC_INIT("debug"); + +static str *mohq_columns[] = {&MOHQCSTR_ID, &MOHQCSTR_URI, &MOHQCSTR_MDIR, + &MOHQCSTR_MFILE, &MOHQCSTR_NAME, &MOHQCSTR_DEBUG, NULL}; /********** * mohqcalls definitions **********/ -str CALLCSTR_CALL = STR_STATIC_INIT ("call_id"); -str CALLCSTR_CNTCT = STR_STATIC_INIT ("call_contact"); -str CALLCSTR_FROM = STR_STATIC_INIT ("call_from"); -str CALLCSTR_MOHQ = STR_STATIC_INIT ("mohq_id"); -str CALLCSTR_STATE = STR_STATIC_INIT ("call_status"); -str CALLCSTR_TIME = STR_STATIC_INIT ("call_time"); - -static str *call_columns [] = - { - &CALLCSTR_STATE, - &CALLCSTR_CALL, - &CALLCSTR_MOHQ, - &CALLCSTR_FROM, - &CALLCSTR_CNTCT, - &CALLCSTR_TIME, - NULL - }; +str CALLCSTR_CALL = STR_STATIC_INIT("call_id"); +str CALLCSTR_CNTCT = STR_STATIC_INIT("call_contact"); +str CALLCSTR_FROM = STR_STATIC_INIT("call_from"); +str CALLCSTR_MOHQ = STR_STATIC_INIT("mohq_id"); +str CALLCSTR_STATE = STR_STATIC_INIT("call_status"); +str CALLCSTR_TIME = STR_STATIC_INIT("call_time"); + +static str *call_columns[] = {&CALLCSTR_STATE, &CALLCSTR_CALL, &CALLCSTR_MOHQ, + &CALLCSTR_FROM, &CALLCSTR_CNTCT, &CALLCSTR_TIME, NULL}; /********** * local function declarations **********/ -void set_call_key (db_key_t *, int, int); -void set_call_val (db_val_t *, int, int, void *); +void set_call_key(db_key_t *, int, int); +void set_call_val(db_val_t *, int, int, void *); /********** * local functions @@ -87,13 +71,14 @@ void set_call_val (db_val_t *, int, int, void *); * OUTPUT: none **********/ -void fill_call_keys (db_key_t *prkeys, int ncnt) +void fill_call_keys(db_key_t *prkeys, int ncnt) { -int nidx; -for (nidx = 0; nidx < ncnt; nidx++) - { set_call_key (prkeys, nidx, nidx); } -return; + int nidx; + for(nidx = 0; nidx < ncnt; nidx++) { + set_call_key(prkeys, nidx, nidx); + } + return; } /********** @@ -106,19 +91,20 @@ return; * OUTPUT: none **********/ -void fill_call_vals (db_val_t *prvals, call_lst *pcall, int ncnt) +void fill_call_vals(db_val_t *prvals, call_lst *pcall, int ncnt) { -int nstate = pcall->call_state / 100; -set_call_val (prvals, CALLCOL_STATE, CALLCOL_STATE, &nstate); -if (!ncnt) - { return; } -set_call_val (prvals, CALLCOL_MOHQ, CALLCOL_MOHQ, &pcall->pmohq->mohq_id); -set_call_val (prvals, CALLCOL_CALL, CALLCOL_CALL, pcall->call_id); -set_call_val (prvals, CALLCOL_FROM, CALLCOL_FROM, pcall->call_from); -set_call_val (prvals, CALLCOL_CNTCT, CALLCOL_CNTCT, pcall->call_contact); -set_call_val (prvals, CALLCOL_TIME, CALLCOL_TIME, &pcall->call_time); -return; + int nstate = pcall->call_state / 100; + set_call_val(prvals, CALLCOL_STATE, CALLCOL_STATE, &nstate); + if(!ncnt) { + return; + } + set_call_val(prvals, CALLCOL_MOHQ, CALLCOL_MOHQ, &pcall->pmohq->mohq_id); + set_call_val(prvals, CALLCOL_CALL, CALLCOL_CALL, pcall->call_id); + set_call_val(prvals, CALLCOL_FROM, CALLCOL_FROM, pcall->call_from); + set_call_val(prvals, CALLCOL_CNTCT, CALLCOL_CNTCT, pcall->call_contact); + set_call_val(prvals, CALLCOL_TIME, CALLCOL_TIME, &pcall->call_time); + return; } /********** @@ -131,11 +117,11 @@ return; * OUTPUT: none **********/ -void set_call_key (db_key_t *prkeys, int ncol, int ncolid) +void set_call_key(db_key_t *prkeys, int ncol, int ncolid) { -prkeys [ncol] = call_columns [ncolid]; -return; + prkeys[ncol] = call_columns[ncolid]; + return; } /********** @@ -149,35 +135,34 @@ return; * OUTPUT: none **********/ -void set_call_val (db_val_t *prvals, int ncol, int ncolid, void *pdata) +void set_call_val(db_val_t *prvals, int ncol, int ncolid, void *pdata) { -/********** + /********** * fill based on column **********/ -switch (ncolid) - { - case CALLCOL_MOHQ: - case CALLCOL_STATE: - prvals [ncol].val.int_val = *((int *)pdata); - prvals [ncol].type = DB1_INT; - prvals [ncol].nul = 0; - break; - case CALLCOL_CALL: - case CALLCOL_CNTCT: - case CALLCOL_FROM: - prvals [ncol].val.string_val = (char *)pdata; - prvals [ncol].type = DB1_STRING; - prvals [ncol].nul = 0; - break; - case CALLCOL_TIME: - prvals [ncol].val.time_val = *((time_t *)pdata); - prvals [ncol].type = DB1_DATETIME; - prvals [ncol].nul = 0; - break; - } -return; + switch(ncolid) { + case CALLCOL_MOHQ: + case CALLCOL_STATE: + prvals[ncol].val.int_val = *((int *)pdata); + prvals[ncol].type = DB1_INT; + prvals[ncol].nul = 0; + break; + case CALLCOL_CALL: + case CALLCOL_CNTCT: + case CALLCOL_FROM: + prvals[ncol].val.string_val = (char *)pdata; + prvals[ncol].type = DB1_STRING; + prvals[ncol].nul = 0; + break; + case CALLCOL_TIME: + prvals[ncol].val.time_val = *((time_t *)pdata); + prvals[ncol].type = DB1_DATETIME; + prvals[ncol].nul = 0; + break; + } + return; } /********** @@ -192,33 +177,33 @@ return; * OUTPUT: none **********/ -void add_call_rec (int ncall_idx) +void add_call_rec(int ncall_idx) { -/********** + /********** * o fill column names and values * o insert new record **********/ -char *pfncname = "add_call_rec: "; -db1_con_t *pconn = mohq_dbconnect (); -if (!pconn) - { return; } -db_func_t *pdb = pmod_data->pdb; -pdb->use_table (pconn, &pmod_data->pcfg->db_ctable); -db_key_t prkeys [CALL_COLCNT]; -fill_call_keys (prkeys, CALL_COLCNT); -db_val_t prvals [CALL_COLCNT]; -call_lst *pcall = &pmod_data->pcall_lst [ncall_idx]; -pcall->call_time = time (0); -fill_call_vals (prvals, pcall, CALL_COLCNT); -if (pdb->insert (pconn, prkeys, prvals, CALL_COLCNT) < 0) - { - LM_WARN ("%sUnable to add new row to %s\n", pfncname, - pmod_data->pcfg->db_ctable.s); - } -mohq_dbdisconnect (pconn); -return; + char *pfncname = "add_call_rec: "; + db1_con_t *pconn = mohq_dbconnect(); + if(!pconn) { + return; + } + db_func_t *pdb = pmod_data->pdb; + pdb->use_table(pconn, &pmod_data->pcfg->db_ctable); + db_key_t prkeys[CALL_COLCNT]; + fill_call_keys(prkeys, CALL_COLCNT); + db_val_t prvals[CALL_COLCNT]; + call_lst *pcall = &pmod_data->pcall_lst[ncall_idx]; + pcall->call_time = time(0); + fill_call_vals(prvals, pcall, CALL_COLCNT); + if(pdb->insert(pconn, prkeys, prvals, CALL_COLCNT) < 0) { + LM_WARN("%sUnable to add new row to %s\n", pfncname, + pmod_data->pcfg->db_ctable.s); + } + mohq_dbdisconnect(pconn); + return; } /********** @@ -229,22 +214,21 @@ return; * OUTPUT: none **********/ -void clear_calls (db1_con_t *pconn) +void clear_calls(db1_con_t *pconn) { -/********** + /********** * delete all records **********/ -char *pfncname = "clear_calls: "; -db_func_t *pdb = pmod_data->pdb; -pdb->use_table (pconn, &pmod_data->pcfg->db_ctable); -if (pdb->delete (pconn, 0, 0, 0, 0) < 0) - { - LM_WARN ("%sUnable to delete all rows from %s\n", pfncname, - pmod_data->pcfg->db_ctable.s); - } -return; + char *pfncname = "clear_calls: "; + db_func_t *pdb = pmod_data->pdb; + pdb->use_table(pconn, &pmod_data->pcfg->db_ctable); + if(pdb->delete(pconn, 0, 0, 0, 0) < 0) { + LM_WARN("%sUnable to delete all rows from %s\n", pfncname, + pmod_data->pcfg->db_ctable.s); + } + return; } /********** @@ -255,31 +239,31 @@ return; * OUTPUT: none **********/ -void delete_call_rec (call_lst *pcall) +void delete_call_rec(call_lst *pcall) { -/********** + /********** * o setup to delete based on call ID * o delete record **********/ -char *pfncname = "delete_call_rec: "; -db1_con_t *pconn = mohq_dbconnect (); -if (!pconn) - { return; } -db_func_t *pdb = pmod_data->pdb; -pdb->use_table (pconn, &pmod_data->pcfg->db_ctable); -db_key_t prkeys [1]; -set_call_key (prkeys, 0, CALLCOL_CALL); -db_val_t prvals [1]; -set_call_val (prvals, 0, CALLCOL_CALL, pcall->call_id); -if (pdb->delete (pconn, prkeys, 0, prvals, 1) < 0) - { - LM_WARN ("%sUnable to delete row from %s\n", pfncname, - pmod_data->pcfg->db_ctable.s); - } -mohq_dbdisconnect (pconn); -return; + char *pfncname = "delete_call_rec: "; + db1_con_t *pconn = mohq_dbconnect(); + if(!pconn) { + return; + } + db_func_t *pdb = pmod_data->pdb; + pdb->use_table(pconn, &pmod_data->pcfg->db_ctable); + db_key_t prkeys[1]; + set_call_key(prkeys, 0, CALLCOL_CALL); + db_val_t prvals[1]; + set_call_val(prvals, 0, CALLCOL_CALL, pcall->call_id); + if(pdb->delete(pconn, prkeys, 0, prvals, 1) < 0) { + LM_WARN("%sUnable to delete row from %s\n", pfncname, + pmod_data->pcfg->db_ctable.s); + } + mohq_dbdisconnect(pconn); + return; } /********** @@ -289,14 +273,15 @@ return; * OUTPUT: DB connection pointer; NULL=failed **********/ -db1_con_t *mohq_dbconnect (void) +db1_con_t *mohq_dbconnect(void) { -str *pdb_url = &pmod_data->pcfg->db_url; -db1_con_t *pconn = pmod_data->pdb->init (pdb_url); -if (!pconn) - { LM_ERR ("Unable to connect to DB %s!\n", pdb_url->s); } -return pconn; + str *pdb_url = &pmod_data->pcfg->db_url; + db1_con_t *pconn = pmod_data->pdb->init(pdb_url); + if(!pconn) { + LM_ERR("Unable to connect to DB %s!\n", pdb_url->s); + } + return pconn; } /********** @@ -307,11 +292,11 @@ return pconn; * OUTPUT: none **********/ -void mohq_dbdisconnect (db1_con_t *pconn) +void mohq_dbdisconnect(db1_con_t *pconn) { -pmod_data->pdb->close (pconn); -return; + pmod_data->pdb->close(pconn); + return; } /********** @@ -322,35 +307,35 @@ return; * OUTPUT: none **********/ -void update_call_rec (call_lst *pcall) +void update_call_rec(call_lst *pcall) { -/********** + /********** * o setup to update based on call ID * o update record **********/ -char *pfncname = "update_call_rec: "; -db1_con_t *pconn = mohq_dbconnect (); -if (!pconn) - { return; } -db_func_t *pdb = pmod_data->pdb; -pdb->use_table (pconn, &pmod_data->pcfg->db_ctable); -db_key_t pqkeys [1]; -set_call_key (pqkeys, 0, CALLCOL_CALL); -db_val_t pqvals [1]; -set_call_val (pqvals, 0, CALLCOL_CALL, pcall->call_id); -db_key_t pukeys [1]; -set_call_key (pukeys, 0, CALLCOL_STATE); -db_val_t puvals [1]; -fill_call_vals (puvals, pcall, CALLCOL_STATE); -if (pdb->update (pconn, pqkeys, 0, pqvals, pukeys, puvals, 1, 1) < 0) - { - LM_WARN ("%sUnable to update row in %s\n", pfncname, - pmod_data->pcfg->db_ctable.s); - } -mohq_dbdisconnect (pconn); -return; + char *pfncname = "update_call_rec: "; + db1_con_t *pconn = mohq_dbconnect(); + if(!pconn) { + return; + } + db_func_t *pdb = pmod_data->pdb; + pdb->use_table(pconn, &pmod_data->pcfg->db_ctable); + db_key_t pqkeys[1]; + set_call_key(pqkeys, 0, CALLCOL_CALL); + db_val_t pqvals[1]; + set_call_val(pqvals, 0, CALLCOL_CALL, pcall->call_id); + db_key_t pukeys[1]; + set_call_key(pukeys, 0, CALLCOL_STATE); + db_val_t puvals[1]; + fill_call_vals(puvals, pcall, CALLCOL_STATE); + if(pdb->update(pconn, pqkeys, 0, pqvals, pukeys, puvals, 1, 1) < 0) { + LM_WARN("%sUnable to update row in %s\n", pfncname, + pmod_data->pcfg->db_ctable.s); + } + mohq_dbdisconnect(pconn); + return; } /********** @@ -362,37 +347,37 @@ return; * OUTPUT: none **********/ -void update_debug (mohq_lst *pqueue, int bdebug) +void update_debug(mohq_lst *pqueue, int bdebug) { -/********** + /********** * o setup to update based on queue name * o update record **********/ -char *pfncname = "update_debug: "; -db1_con_t *pconn = mohq_dbconnect (); -if (!pconn) - { return; } -db_func_t *pdb = pmod_data->pdb; -pdb->use_table (pconn, &pmod_data->pcfg->db_qtable); -db_key_t pqkeys [1] = { mohq_columns [MOHQCOL_NAME] }; -db_val_t pqvals [1]; -pqvals->val.string_val = pqueue->mohq_name; -pqvals->type = DB1_STRING; -pqvals->nul = 0; -db_key_t pukeys [1] = { mohq_columns [MOHQCOL_DEBUG] }; -db_val_t puvals [1]; -puvals->val.int_val = bdebug; -puvals->type = DB1_INT; -puvals->nul = 0; -if (pdb->update (pconn, pqkeys, 0, pqvals, pukeys, puvals, 1, 1) < 0) - { - LM_WARN ("%sUnable to update row in %s\n", pfncname, - pmod_data->pcfg->db_qtable.s); - } -mohq_dbdisconnect (pconn); -return; + char *pfncname = "update_debug: "; + db1_con_t *pconn = mohq_dbconnect(); + if(!pconn) { + return; + } + db_func_t *pdb = pmod_data->pdb; + pdb->use_table(pconn, &pmod_data->pcfg->db_qtable); + db_key_t pqkeys[1] = {mohq_columns[MOHQCOL_NAME]}; + db_val_t pqvals[1]; + pqvals->val.string_val = pqueue->mohq_name; + pqvals->type = DB1_STRING; + pqvals->nul = 0; + db_key_t pukeys[1] = {mohq_columns[MOHQCOL_DEBUG]}; + db_val_t puvals[1]; + puvals->val.int_val = bdebug; + puvals->type = DB1_INT; + puvals->nul = 0; + if(pdb->update(pconn, pqkeys, 0, pqvals, pukeys, puvals, 1, 1) < 0) { + LM_WARN("%sUnable to update row in %s\n", pfncname, + pmod_data->pcfg->db_qtable.s); + } + mohq_dbdisconnect(pconn); + return; } /********** @@ -403,166 +388,155 @@ return; * OUTPUT: none **********/ -void update_mohq_lst (db1_con_t *pconn) +void update_mohq_lst(db1_con_t *pconn) { -/********** + /********** * o reset checked flag on all queues * o read queues from table **********/ -char *pfncname = "update_mohq_lst: "; -if (!pconn) - { return; } -db_func_t *pdb = pmod_data->pdb; -mohq_lst *pqlst = pmod_data->pmohq_lst; -int nidx; -for (nidx = 0; nidx < pmod_data->mohq_cnt; nidx++) - { pqlst [nidx].mohq_flags &= ~MOHQF_CHK; } -pdb->use_table (pconn, &pmod_data->pcfg->db_qtable); -db_key_t prkeys [MOHQ_COLCNT]; -for (nidx = 0; nidx < MOHQ_COLCNT; nidx++) - { prkeys [nidx] = mohq_columns [nidx]; } -db1_res_t *presult = NULL; -if (pdb->query (pconn, 0, 0, 0, prkeys, 0, MOHQ_COLCNT, 0, &presult)) - { - LM_ERR ("%stable query (%s) failed!\n", pfncname, - pmod_data->pcfg->db_qtable.s); - return; - } -db_row_t *prows = RES_ROWS (presult); -int nrows = RES_ROW_N (presult); -db_val_t *prowvals = NULL; -char *ptext, *puri; -mohq_lst *pnewlst; -for (nidx = 0; nidx < nrows; nidx++) - { - /********** + char *pfncname = "update_mohq_lst: "; + if(!pconn) { + return; + } + db_func_t *pdb = pmod_data->pdb; + mohq_lst *pqlst = pmod_data->pmohq_lst; + int nidx; + for(nidx = 0; nidx < pmod_data->mohq_cnt; nidx++) { + pqlst[nidx].mohq_flags &= ~MOHQF_CHK; + } + pdb->use_table(pconn, &pmod_data->pcfg->db_qtable); + db_key_t prkeys[MOHQ_COLCNT]; + for(nidx = 0; nidx < MOHQ_COLCNT; nidx++) { + prkeys[nidx] = mohq_columns[nidx]; + } + db1_res_t *presult = NULL; + if(pdb->query(pconn, 0, 0, 0, prkeys, 0, MOHQ_COLCNT, 0, &presult)) { + LM_ERR("%stable query (%s) failed!\n", pfncname, + pmod_data->pcfg->db_qtable.s); + return; + } + db_row_t *prows = RES_ROWS(presult); + int nrows = RES_ROW_N(presult); + db_val_t *prowvals = NULL; + char *ptext, *puri; + mohq_lst *pnewlst; + for(nidx = 0; nidx < nrows; nidx++) { + /********** * check URI **********/ - prowvals = ROW_VALUES (prows + nidx); - char *pqname = (char *)VAL_STRING (prowvals + MOHQCOL_NAME); - puri = (char *)VAL_STRING (prowvals + MOHQCOL_URI); - struct sip_uri puri_parsed [1]; - if (parse_uri (puri, strlen (puri), puri_parsed)) - { - LM_ERR ("Queue,Field (%s,%.*s): %s is not a valid URI!\n", pqname, - STR_FMT (&MOHQCSTR_URI), puri); - continue; - } - - /********** + prowvals = ROW_VALUES(prows + nidx); + char *pqname = (char *)VAL_STRING(prowvals + MOHQCOL_NAME); + puri = (char *)VAL_STRING(prowvals + MOHQCOL_URI); + struct sip_uri puri_parsed[1]; + if(parse_uri(puri, strlen(puri), puri_parsed)) { + LM_ERR("Queue,Field (%s,%.*s): %s is not a valid URI!\n", pqname, + STR_FMT(&MOHQCSTR_URI), puri); + continue; + } + + /********** * check MOHDIR **********/ - char *pmohdir; - if (VAL_NULL (prowvals + MOHQCOL_MDIR)) - { pmohdir = pmod_data->pcfg->mohdir; } - else - { - pmohdir = (char *)VAL_STRING (prowvals + MOHQCOL_MDIR); - if (!*pmohdir) - { pmohdir = pmod_data->pcfg->mohdir; } - else - { - /********** + char *pmohdir; + if(VAL_NULL(prowvals + MOHQCOL_MDIR)) { + pmohdir = pmod_data->pcfg->mohdir; + } else { + pmohdir = (char *)VAL_STRING(prowvals + MOHQCOL_MDIR); + if(!*pmohdir) { + pmohdir = pmod_data->pcfg->mohdir; + } else { + /********** * mohdir * o exists? * o directory? **********/ - struct stat psb [1]; - if (lstat (pmohdir, psb)) - { - LM_ERR ("Queue,Field (%s,%.*s): Unable to find %s!\n", pqname, - STR_FMT (&MOHQCSTR_MDIR), pmohdir); - continue; - } - else - { - if ((psb->st_mode & S_IFMT) != S_IFDIR) - { - LM_ERR ("Queue,Field (%s,%.*s): %s is not a directory!\n", pqname, - STR_FMT (&MOHQCSTR_MDIR), pmohdir); - continue; - } - } - } - } - - /********** + struct stat psb[1]; + if(lstat(pmohdir, psb)) { + LM_ERR("Queue,Field (%s,%.*s): Unable to find %s!\n", + pqname, STR_FMT(&MOHQCSTR_MDIR), pmohdir); + continue; + } else { + if((psb->st_mode & S_IFMT) != S_IFDIR) { + LM_ERR("Queue,Field (%s,%.*s): %s is not a " + "directory!\n", + pqname, STR_FMT(&MOHQCSTR_MDIR), pmohdir); + continue; + } + } + } + } + + /********** * check for MOH files **********/ - rtpmap **pmohfiles = find_MOH (pmohdir, - (char *)VAL_STRING (prowvals + MOHQCOL_MFILE)); - if (!pmohfiles [0]) - { - LM_ERR ("Queue,Field (%s,%.*s): Unable to find MOH files (%s/%s.*)!\n", - pqname, STR_FMT (&MOHQCSTR_MDIR), pmohdir, - (char *)VAL_STRING (prowvals + MOHQCOL_MFILE)); - continue; - } - - /********** + rtpmap **pmohfiles = + find_MOH(pmohdir, (char *)VAL_STRING(prowvals + MOHQCOL_MFILE)); + if(!pmohfiles[0]) { + LM_ERR("Queue,Field (%s,%.*s): Unable to find MOH files " + "(%s/%s.*)!\n", + pqname, STR_FMT(&MOHQCSTR_MDIR), pmohdir, + (char *)VAL_STRING(prowvals + MOHQCOL_MFILE)); + continue; + } + + /********** * find matching queues **********/ - int bfnd = 0; - int nidx2; - for (nidx2 = 0; nidx2 < pmod_data->mohq_cnt; nidx2++) - { - if (!strcasecmp (pqlst [nidx2].mohq_uri, puri)) - { - /********** + int bfnd = 0; + int nidx2; + for(nidx2 = 0; nidx2 < pmod_data->mohq_cnt; nidx2++) { + if(!strcasecmp(pqlst[nidx2].mohq_uri, puri)) { + /********** * o data the same? * o mark as found **********/ - if (strcmp (pqlst [nidx2].mohq_mohdir, pmohdir)) - { - strcpy (pqlst [nidx2].mohq_mohdir, pmohdir); - LM_INFO ("Queue,Field (%s,%.*s): Changed\n", pqname, - STR_FMT (&MOHQCSTR_MDIR)); - } - ptext = (char *)VAL_STRING (prowvals + MOHQCOL_MFILE); - if (strcmp (pqlst [nidx2].mohq_mohfile, ptext)) - { - strcpy (pqlst [nidx2].mohq_mohfile, ptext); - LM_INFO ("Queue,Field (%s,%.*s): Changed\n", pqname, - STR_FMT (&MOHQCSTR_MFILE)); - } - ptext = (char *)VAL_STRING (prowvals + MOHQCOL_NAME); - if (strcmp (pqlst [nidx2].mohq_name, ptext)) - { - strcpy (pqlst [nidx2].mohq_name, ptext); - LM_INFO ("Queue,Field (%s,%.*s): Changed\n", pqname, - STR_FMT (&MOHQCSTR_NAME)); - } - int bdebug = VAL_INT (prowvals + MOHQCOL_DEBUG) ? MOHQF_DBG : 0; - if ((pqlst [nidx2].mohq_flags & MOHQF_DBG) != bdebug) - { - if (bdebug) - { pqlst [nidx2].mohq_flags |= MOHQF_DBG; } - else - { pqlst [nidx2].mohq_flags &= ~MOHQF_DBG; } - LM_INFO ("Queue,Field (%s,%.*s): Changed\n", pqname, - STR_FMT (&MOHQCSTR_DEBUG)); - } - bfnd = -1; - pqlst [nidx2].mohq_flags |= MOHQF_CHK; - break; - } - } - - /********** + if(strcmp(pqlst[nidx2].mohq_mohdir, pmohdir)) { + strcpy(pqlst[nidx2].mohq_mohdir, pmohdir); + LM_INFO("Queue,Field (%s,%.*s): Changed\n", pqname, + STR_FMT(&MOHQCSTR_MDIR)); + } + ptext = (char *)VAL_STRING(prowvals + MOHQCOL_MFILE); + if(strcmp(pqlst[nidx2].mohq_mohfile, ptext)) { + strcpy(pqlst[nidx2].mohq_mohfile, ptext); + LM_INFO("Queue,Field (%s,%.*s): Changed\n", pqname, + STR_FMT(&MOHQCSTR_MFILE)); + } + ptext = (char *)VAL_STRING(prowvals + MOHQCOL_NAME); + if(strcmp(pqlst[nidx2].mohq_name, ptext)) { + strcpy(pqlst[nidx2].mohq_name, ptext); + LM_INFO("Queue,Field (%s,%.*s): Changed\n", pqname, + STR_FMT(&MOHQCSTR_NAME)); + } + int bdebug = VAL_INT(prowvals + MOHQCOL_DEBUG) ? MOHQF_DBG : 0; + if((pqlst[nidx2].mohq_flags & MOHQF_DBG) != bdebug) { + if(bdebug) { + pqlst[nidx2].mohq_flags |= MOHQF_DBG; + } else { + pqlst[nidx2].mohq_flags &= ~MOHQF_DBG; + } + LM_INFO("Queue,Field (%s,%.*s): Changed\n", pqname, + STR_FMT(&MOHQCSTR_DEBUG)); + } + bfnd = -1; + pqlst[nidx2].mohq_flags |= MOHQF_CHK; + break; + } + } + + /********** * add new queue **********/ - if (!bfnd) - { - /********** + if(!bfnd) { + /********** * o allocate new list * o copy old list * o add new row @@ -570,55 +544,56 @@ for (nidx = 0; nidx < nrows; nidx++) * o adjust pointers to new list **********/ - int nsize = pmod_data->mohq_cnt + 1; - pnewlst = (mohq_lst *) shm_malloc (sizeof (mohq_lst) * nsize); - if (!pnewlst) - { - LM_ERR ("%sUnable to allocate shared memory!\n", pfncname); - return; - } - pmod_data->mohq_cnt = nsize; - if (--nsize) - { memcpy (pnewlst, pqlst, sizeof (mohq_lst) * nsize); } - pnewlst [nsize].mohq_id = prowvals [MOHQCOL_ID].val.int_val; - pnewlst [nsize].mohq_flags = MOHQF_CHK; - strcpy (pnewlst [nsize].mohq_uri, puri); - strcpy (pnewlst [nsize].mohq_mohdir, pmohdir); - strcpy (pnewlst [nsize].mohq_mohfile, - (char *)VAL_STRING (prowvals + MOHQCOL_MFILE)); - strcpy (pnewlst [nsize].mohq_name, - (char *)VAL_STRING (prowvals + MOHQCOL_NAME)); - if (VAL_INT (prowvals + MOHQCOL_DEBUG)) - { pnewlst [nsize].mohq_flags |= MOHQF_DBG; } - LM_INFO ("Added new queue (%s)\n", pnewlst [nsize].mohq_name); - if (nsize) - { shm_free (pmod_data->pmohq_lst); } - pmod_data->pmohq_lst = pnewlst; - pqlst = pnewlst; - } - } - -/********** + int nsize = pmod_data->mohq_cnt + 1; + pnewlst = (mohq_lst *)shm_malloc(sizeof(mohq_lst) * nsize); + if(!pnewlst) { + LM_ERR("%sUnable to allocate shared memory!\n", pfncname); + return; + } + pmod_data->mohq_cnt = nsize; + if(--nsize) { + memcpy(pnewlst, pqlst, sizeof(mohq_lst) * nsize); + } + pnewlst[nsize].mohq_id = prowvals[MOHQCOL_ID].val.int_val; + pnewlst[nsize].mohq_flags = MOHQF_CHK; + strcpy(pnewlst[nsize].mohq_uri, puri); + strcpy(pnewlst[nsize].mohq_mohdir, pmohdir); + strcpy(pnewlst[nsize].mohq_mohfile, + (char *)VAL_STRING(prowvals + MOHQCOL_MFILE)); + strcpy(pnewlst[nsize].mohq_name, + (char *)VAL_STRING(prowvals + MOHQCOL_NAME)); + if(VAL_INT(prowvals + MOHQCOL_DEBUG)) { + pnewlst[nsize].mohq_flags |= MOHQF_DBG; + } + LM_INFO("Added new queue (%s)\n", pnewlst[nsize].mohq_name); + if(nsize) { + shm_free(pmod_data->pmohq_lst); + } + pmod_data->pmohq_lst = pnewlst; + pqlst = pnewlst; + } + } + + /********** * find deleted queues **********/ -for (nidx = 0; nidx < pmod_data->mohq_cnt; nidx++) - { - /********** + for(nidx = 0; nidx < pmod_data->mohq_cnt; nidx++) { + /********** * o exists? * o if not last, replace current with last queue **********/ - if (pqlst [nidx].mohq_flags & MOHQF_CHK) - { continue; } - LM_INFO ("Removed queue (%s)\n", pqlst [nidx].mohq_name); - if (nidx != (pmod_data->mohq_cnt - 1)) - { - memcpy (&pqlst [nidx], &pqlst [pmod_data->mohq_cnt - 1], - sizeof (mohq_lst)); - } - --pmod_data->mohq_cnt; - --nidx; - } -return; + if(pqlst[nidx].mohq_flags & MOHQF_CHK) { + continue; + } + LM_INFO("Removed queue (%s)\n", pqlst[nidx].mohq_name); + if(nidx != (pmod_data->mohq_cnt - 1)) { + memcpy(&pqlst[nidx], &pqlst[pmod_data->mohq_cnt - 1], + sizeof(mohq_lst)); + } + --pmod_data->mohq_cnt; + --nidx; + } + return; } \ No newline at end of file diff --git a/src/modules/mohqueue/mohq_db.h b/src/modules/mohqueue/mohq_db.h index 565f0ae141a..46c34b1f58b 100644 --- a/src/modules/mohqueue/mohq_db.h +++ b/src/modules/mohqueue/mohq_db.h @@ -27,38 +27,38 @@ **********/ /* table versions */ -#define MOHQ_CTABLE_VERSION 1 -#define MOHQ_QTABLE_VERSION 1 +#define MOHQ_CTABLE_VERSION 1 +#define MOHQ_QTABLE_VERSION 1 /* mohqueues columns */ -#define MOHQ_COLCNT 6 -#define MOHQCOL_ID 0 -#define MOHQCOL_URI 1 -#define MOHQCOL_MDIR 2 +#define MOHQ_COLCNT 6 +#define MOHQCOL_ID 0 +#define MOHQCOL_URI 1 +#define MOHQCOL_MDIR 2 #define MOHQCOL_MFILE 3 -#define MOHQCOL_NAME 4 +#define MOHQCOL_NAME 4 #define MOHQCOL_DEBUG 5 /* mohqcalls columns */ -#define CALL_COLCNT 6 +#define CALL_COLCNT 6 #define CALLCOL_STATE 0 -#define CALLCOL_CALL 1 -#define CALLCOL_MOHQ 2 -#define CALLCOL_FROM 3 +#define CALLCOL_CALL 1 +#define CALLCOL_MOHQ 2 +#define CALLCOL_FROM 3 #define CALLCOL_CNTCT 4 -#define CALLCOL_TIME 5 +#define CALLCOL_TIME 5 /********** * DB function declarations **********/ -void add_call_rec (int); -void clear_calls (db1_con_t *); -void delete_call_rec (call_lst *); -db1_con_t *mohq_dbconnect (void); -void mohq_dbdisconnect (db1_con_t *); -void update_call_rec (call_lst *); -void update_debug (mohq_lst *, int); -void update_mohq_lst (db1_con_t *pconn); +void add_call_rec(int); +void clear_calls(db1_con_t *); +void delete_call_rec(call_lst *); +db1_con_t *mohq_dbconnect(void); +void mohq_dbdisconnect(db1_con_t *); +void update_call_rec(call_lst *); +void update_debug(mohq_lst *, int); +void update_mohq_lst(db1_con_t *pconn); #endif /* MOHQ_DB_H */ \ No newline at end of file diff --git a/src/modules/mohqueue/mohq_funcs.c b/src/modules/mohqueue/mohq_funcs.c index c46cb51a75d..530137a2afb 100644 --- a/src/modules/mohqueue/mohq_funcs.c +++ b/src/modules/mohqueue/mohq_funcs.c @@ -31,125 +31,81 @@ #define ALLOWHDR "Allow: INVITE, ACK, BYE, CANCEL, NOTIFY, PRACK" #define CLENHDR "Content-Length" -#define SIPEOL "\r\n" +#define SIPEOL "\r\n" #define USRAGNT "Kamailio MOH Queue v1.8" /********** * local constants **********/ -str p100rel [1] = {STR_STATIC_INIT ("100rel")}; -str pallq [1] = {STR_STATIC_INIT ("*")}; -str paudio [1] = {STR_STATIC_INIT ("audio")}; -str pbye [1] = {STR_STATIC_INIT ("BYE")}; -str pinvite [1] = {STR_STATIC_INIT ("INVITE")}; -str prefer [1] = {STR_STATIC_INIT ("REFER")}; -str presp_busy [1] = {STR_STATIC_INIT ("Busy Here")}; -str presp_noaccept [1] = {STR_STATIC_INIT ("Not Acceptable Here")}; -str presp_noallow [1] = {STR_STATIC_INIT ("Method Not Allowed")}; -str presp_nocall [1] = {STR_STATIC_INIT ("Call/Transaction Does Not Exist")}; -str presp_ok [1] = {STR_STATIC_INIT ("OK")}; -str presp_reqpend [1] = {STR_STATIC_INIT ("Request Pending")}; -str presp_reqterm [1] = {STR_STATIC_INIT ("Request Terminated")}; -str presp_ring [1] = {STR_STATIC_INIT ("Ringing")}; -str psipfrag [1] = {STR_STATIC_INIT ("message/sipfrag")}; -str presp_srverr [1] = {STR_STATIC_INIT ("Server Internal Error")}; -str presp_trying [1] = {STR_STATIC_INIT ("Trying to enter MOH queue")}; -str presp_unsupp [1] = {STR_STATIC_INIT ("Unsupported Media Type")}; - -rtpmap prtpmap [] = - { - {9, "G722/8000"}, - {0, "PCMU/8000"}, - {8, "PCMA/8000"}, - {18, "G729/8000"}, - {3, "GSM/8000"}, - {4, "G723/8000"}, - {15, "G728/8000"}, - {5, "DVI4/8000"}, - {7, "LPC/8000"}, - {12, "QCELP/8000"}, - {13, "CN/8000"}, - {16, "DVI4/11025"}, - {6, "DVI4/16000"}, - {17, "DVI4/22050"}, - {10, "L16/44100"}, - {11, "L16/44100"}, - {14, "MPA/90000"}, - {0, 0} - }; - -rtpmap *pmohfiles [30]; // element count should be equal or greater than prtpmap - -str pallowhdr [1] = { STR_STATIC_INIT (ALLOWHDR SIPEOL) }; - -char pbyemsg [] = - { - "%s" - "%s" - "Max-Forwards: 70" SIPEOL - "Contact: <%s>" SIPEOL - }; - -str pextrahdr [1] = - { - STR_STATIC_INIT ( - ALLOWHDR SIPEOL - "Supported: 100rel" SIPEOL - "Accept-Language: en" SIPEOL - "Content-Type: application/sdp" SIPEOL - ) - }; - -char pinvitesdp [] = - { - "v=0" SIPEOL - "o=- %d %d IN %s" SIPEOL - "s=" USRAGNT SIPEOL - "c=IN %s" SIPEOL - "t=0 0" SIPEOL - "a=send%s" SIPEOL - "m=audio %d RTP/AVP " - }; - -char prefermsg [] = - { - "%s" - "%s" - "Contact: <%s>" SIPEOL - "Max-Forwards: 70" SIPEOL - "Refer-To: <%s>" SIPEOL - "Referred-By: <%s>" SIPEOL - }; - -char prtpsdp [] = - { - "v=0" SIPEOL - // IP address and audio port faked since they will be replaced - "o=- 1 1 IN IP4 1.1.1.1" SIPEOL - "s=" USRAGNT SIPEOL - "c=IN IP4 1.1.1.1" SIPEOL - "t=0 0" SIPEOL - "a=sendrecv" SIPEOL - "m=audio 1 RTP/AVP" - }; +str p100rel[1] = {STR_STATIC_INIT("100rel")}; +str pallq[1] = {STR_STATIC_INIT("*")}; +str paudio[1] = {STR_STATIC_INIT("audio")}; +str pbye[1] = {STR_STATIC_INIT("BYE")}; +str pinvite[1] = {STR_STATIC_INIT("INVITE")}; +str prefer[1] = {STR_STATIC_INIT("REFER")}; +str presp_busy[1] = {STR_STATIC_INIT("Busy Here")}; +str presp_noaccept[1] = {STR_STATIC_INIT("Not Acceptable Here")}; +str presp_noallow[1] = {STR_STATIC_INIT("Method Not Allowed")}; +str presp_nocall[1] = {STR_STATIC_INIT("Call/Transaction Does Not Exist")}; +str presp_ok[1] = {STR_STATIC_INIT("OK")}; +str presp_reqpend[1] = {STR_STATIC_INIT("Request Pending")}; +str presp_reqterm[1] = {STR_STATIC_INIT("Request Terminated")}; +str presp_ring[1] = {STR_STATIC_INIT("Ringing")}; +str psipfrag[1] = {STR_STATIC_INIT("message/sipfrag")}; +str presp_srverr[1] = {STR_STATIC_INIT("Server Internal Error")}; +str presp_trying[1] = {STR_STATIC_INIT("Trying to enter MOH queue")}; +str presp_unsupp[1] = {STR_STATIC_INIT("Unsupported Media Type")}; + +rtpmap prtpmap[] = {{9, "G722/8000"}, {0, "PCMU/8000"}, {8, "PCMA/8000"}, + {18, "G729/8000"}, {3, "GSM/8000"}, {4, "G723/8000"}, {15, "G728/8000"}, + {5, "DVI4/8000"}, {7, "LPC/8000"}, {12, "QCELP/8000"}, {13, "CN/8000"}, + {16, "DVI4/11025"}, {6, "DVI4/16000"}, {17, "DVI4/22050"}, + {10, "L16/44100"}, {11, "L16/44100"}, {14, "MPA/90000"}, {0, 0}}; + +rtpmap *pmohfiles[30]; // element count should be equal or greater than prtpmap + +str pallowhdr[1] = {STR_STATIC_INIT(ALLOWHDR SIPEOL)}; + +char pbyemsg[] = {"%s" + "%s" + "Max-Forwards: 70" SIPEOL "Contact: <%s>" SIPEOL}; + +str pextrahdr[1] = {STR_STATIC_INIT( + ALLOWHDR SIPEOL "Supported: 100rel" SIPEOL "Accept-Language: en" SIPEOL + "Content-Type: application/sdp" SIPEOL)}; + +char pinvitesdp[] = {"v=0" SIPEOL "o=- %d %d IN %s" SIPEOL "s=" USRAGNT SIPEOL + "c=IN %s" SIPEOL "t=0 0" SIPEOL "a=send%s" SIPEOL + "m=audio %d RTP/AVP "}; + +char prefermsg[] = {"%s" + "%s" + "Contact: <%s>" SIPEOL "Max-Forwards: 70" SIPEOL + "Refer-To: <%s>" SIPEOL "Referred-By: <%s>" SIPEOL}; + +char prtpsdp[] = {"v=0" SIPEOL + // IP address and audio port faked since they will be replaced + "o=- 1 1 IN IP4 1.1.1.1" SIPEOL "s=" USRAGNT SIPEOL + "c=IN IP4 1.1.1.1" SIPEOL "t=0 0" SIPEOL "a=sendrecv" SIPEOL + "m=audio 1 RTP/AVP"}; /********** * local function declarations **********/ -void delete_call (call_lst *); -void end_RTP (sip_msg_t *, call_lst *); -dlg_t *form_dialog (call_lst *, struct to_body *); -int form_rtp_SDP (str *, call_lst *, char *); -static void invite_cb (struct cell *, int, struct tmcb_params *); -int refer_call (call_lst *, mohq_lock *); -static void refer_cb (struct cell *, int, struct tmcb_params *); -int send_prov_rsp (sip_msg_t *, call_lst *); -int send_rtp_answer (sip_msg_t *, call_lst *); -int search_hdr_ext (struct hdr_field *, str *); -int start_stream (sip_msg_t *, call_lst *, int); -int stop_stream (sip_msg_t *, call_lst *, int); +void delete_call(call_lst *); +void end_RTP(sip_msg_t *, call_lst *); +dlg_t *form_dialog(call_lst *, struct to_body *); +int form_rtp_SDP(str *, call_lst *, char *); +static void invite_cb(struct cell *, int, struct tmcb_params *); +int refer_call(call_lst *, mohq_lock *); +static void refer_cb(struct cell *, int, struct tmcb_params *); +int send_prov_rsp(sip_msg_t *, call_lst *); +int send_rtp_answer(sip_msg_t *, call_lst *); +int search_hdr_ext(struct hdr_field *, str *); +int start_stream(sip_msg_t *, call_lst *, int); +int stop_stream(sip_msg_t *, call_lst *, int); /********** * local functions @@ -164,88 +120,79 @@ int stop_stream (sip_msg_t *, call_lst *, int); * OUTPUT: none **********/ -void ack_msg (sip_msg_t *pmsg, call_lst *pcall) +void ack_msg(sip_msg_t *pmsg, call_lst *pcall) { -/********** + /********** * part of INVITE? **********/ -char *pfncname = "ack_msg: "; -struct cell *ptrans; -tm_api_t *ptm = pmod_data->ptm; -if (pcall->call_state != CLSTA_INVITED) - { - /********** + char *pfncname = "ack_msg: "; + struct cell *ptrans; + tm_api_t *ptm = pmod_data->ptm; + if(pcall->call_state != CLSTA_INVITED) { + /********** * ignore if from rejected re-INVITE **********/ - if (pcall->call_state != CLSTA_INQUEUE) - { LM_ERR ("%sUnexpected ACK (%s)!\n", pfncname, pcall->call_from); } - else - { - mohq_debug (pcall->pmohq, "%sACK from refused re-INVITE (%s)!\n", - pfncname, pcall->call_from); - } - return; - } + if(pcall->call_state != CLSTA_INQUEUE) { + LM_ERR("%sUnexpected ACK (%s)!\n", pfncname, pcall->call_from); + } else { + mohq_debug(pcall->pmohq, "%sACK from refused re-INVITE (%s)!\n", + pfncname, pcall->call_from); + } + return; + } -/********** + /********** * release INVITE transaction **********/ -if (ptm->t_lookup_ident (&ptrans, pcall->call_hash, pcall->call_label) < 0) - { - LM_ERR ("%sINVITE transaction missing for call (%s)!\n", - pfncname, pcall->call_from); - return; - } -else - { - /********** + if(ptm->t_lookup_ident(&ptrans, pcall->call_hash, pcall->call_label) < 0) { + LM_ERR("%sINVITE transaction missing for call (%s)!\n", pfncname, + pcall->call_from); + return; + } else { + /********** * create new transaction if current missing **********/ - tm_cell_t *ptcell; - ptcell = ptm->t_gett (); - if ((ptcell == NULL) || (ptcell == T_UNDEFINED)) - { - if (ptm->t_newtran (pmsg) < 0) - { - LM_ERR ("%sUnable to create temporary transaction!\n", pfncname); - return; - } - ptcell = ptm->t_gett (); - if ((ptcell == NULL) || (ptcell == T_UNDEFINED)) - { - LM_ERR ("%sUnable to find temporary transaction!\n", pfncname); - return; - } - } - if (ptm->t_release_transaction (ptcell) < 0) - { - LM_ERR ("%sRelease transaction failed for call (%s)!\n", - pfncname, pcall->call_from); - return; - } - } - -/********** + tm_cell_t *ptcell; + ptcell = ptm->t_gett(); + if((ptcell == NULL) || (ptcell == T_UNDEFINED)) { + if(ptm->t_newtran(pmsg) < 0) { + LM_ERR("%sUnable to create temporary transaction!\n", pfncname); + return; + } + ptcell = ptm->t_gett(); + if((ptcell == NULL) || (ptcell == T_UNDEFINED)) { + LM_ERR("%sUnable to find temporary transaction!\n", pfncname); + return; + } + } + if(ptm->t_release_transaction(ptcell) < 0) { + LM_ERR("%sRelease transaction failed for call (%s)!\n", pfncname, + pcall->call_from); + return; + } + } + + /********** * o save SDP address info * o put in queue **********/ -pcall->call_hash = pcall->call_label = 0; -sprintf (pcall->call_addr, "%s %s", - pmsg->rcv.dst_ip.af == AF_INET ? "IP4" : "IP6", - ip_addr2a (&pmsg->rcv.dst_ip)); -pcall->call_state = CLSTA_INQUEUE; -update_call_rec (pcall); -pcall->call_cseq = 1; -mohq_debug (pcall->pmohq, - "%sACK received for call (%s); placed in queue (%s)", - pfncname, pcall->call_from, pcall->pmohq->mohq_name); -return; + pcall->call_hash = pcall->call_label = 0; + sprintf(pcall->call_addr, "%s %s", + pmsg->rcv.dst_ip.af == AF_INET ? "IP4" : "IP6", + ip_addr2a(&pmsg->rcv.dst_ip)); + pcall->call_state = CLSTA_INQUEUE; + update_call_rec(pcall); + pcall->call_cseq = 1; + mohq_debug(pcall->pmohq, + "%sACK received for call (%s); placed in queue (%s)", pfncname, + pcall->call_from, pcall->pmohq->mohq_name); + return; } /********** @@ -261,32 +208,32 @@ return; * bufpointer incremented, size decremented **********/ -int addstrbfr (char *pstr, size_t nlen, char **pbuf, size_t *nmax, int bnull) +int addstrbfr(char *pstr, size_t nlen, char **pbuf, size_t *nmax, int bnull) { -/********** + /********** * o enough space? * o copy string * o adjust position/size **********/ -size_t nsize = nlen; -if (bnull) - { nsize++; } -if (nsize > *nmax) - { return 0; } -if (nlen) - { - strncpy (*pbuf, pstr, nlen); - *pbuf += nlen; - } -if (bnull) - { - **pbuf = '\0'; - (*pbuf)++; - } -*nmax -= nsize; -return 1; + size_t nsize = nlen; + if(bnull) { + nsize++; + } + if(nsize > *nmax) { + return 0; + } + if(nlen) { + strncpy(*pbuf, pstr, nlen); + *pbuf += nlen; + } + if(bnull) { + **pbuf = '\0'; + (*pbuf)++; + } + *nmax -= nsize; + return 1; } /********** @@ -299,38 +246,31 @@ return 1; * OUTPUT: none **********/ -static void bye_cb - (struct cell *ptrans, int ntype, struct tmcb_params *pcbp) +static void bye_cb(struct cell *ptrans, int ntype, struct tmcb_params *pcbp) { -/********** + /********** * o error means must have hung after REFER * o delete the call **********/ -char *pfncname = "bye_cb: "; -call_lst *pcall = (call_lst *)*pcbp->param; -if (ntype == TMCB_ON_FAILURE) - { - LM_ERR ("%sCall (%s) did not respond to BYE!\n", pfncname, - pcall->call_from); - } -else - { - int nreply = pcbp->code; - if ((nreply / 100) != 2) - { - LM_ERR ("%sCall (%s) BYE error (%d)!\n", pfncname, - pcall->call_from, nreply); - } - else - { - mohq_debug (pcall->pmohq, "%sCall (%s) BYE reply=%d", pfncname, - pcall->call_from, nreply); - } - } -delete_call (pcall); -return; + char *pfncname = "bye_cb: "; + call_lst *pcall = (call_lst *)*pcbp->param; + if(ntype == TMCB_ON_FAILURE) { + LM_ERR("%sCall (%s) did not respond to BYE!\n", pfncname, + pcall->call_from); + } else { + int nreply = pcbp->code; + if((nreply / 100) != 2) { + LM_ERR("%sCall (%s) BYE error (%d)!\n", pfncname, pcall->call_from, + nreply); + } else { + mohq_debug(pcall->pmohq, "%sCall (%s) BYE reply=%d", pfncname, + pcall->call_from, nreply); + } + } + delete_call(pcall); + return; } /********** @@ -342,40 +282,37 @@ return; * OUTPUT: none **********/ -void bye_msg (sip_msg_t *pmsg, call_lst *pcall) +void bye_msg(sip_msg_t *pmsg, call_lst *pcall) { -/********** + /********** * o responded? * o teardown RTP **********/ -char *pfncname = "bye_msg: "; -if (pcall->call_state == CLSTA_BYEOK) - { return; } -if (pcall->call_state >= CLSTA_INQUEUE) - { - pcall->call_state = CLSTA_BYEOK; - end_RTP (pmsg, pcall); - } -else - { - LM_ERR ("%sEnding call (%s) before placed in queue!\n", - pfncname, pcall->call_from); - } + char *pfncname = "bye_msg: "; + if(pcall->call_state == CLSTA_BYEOK) { + return; + } + if(pcall->call_state >= CLSTA_INQUEUE) { + pcall->call_state = CLSTA_BYEOK; + end_RTP(pmsg, pcall); + } else { + LM_ERR("%sEnding call (%s) before placed in queue!\n", pfncname, + pcall->call_from); + } -/********** + /********** * send OK and delete from queue **********/ -if (pmod_data->psl->freply (pmsg, 200, presp_ok) < 0) - { - LM_ERR ("%sUnable to create reply to call (%s)!\n", pfncname, - pcall->call_from); - return; - } -delete_call (pcall); -return; + if(pmod_data->psl->freply(pmsg, 200, presp_ok) < 0) { + LM_ERR("%sUnable to create reply to call (%s)!\n", pfncname, + pcall->call_from); + return; + } + delete_call(pcall); + return; } /********** @@ -387,31 +324,30 @@ return; * OUTPUT: none **********/ -void cancel_msg (sip_msg_t *pmsg, call_lst *pcall) +void cancel_msg(sip_msg_t *pmsg, call_lst *pcall) { -/********** + /********** * RFC 3261 section 9.2 * o still in INVITE dialog? **********/ -char *pfncname = "cancel_msg: "; -if (pcall->call_state < CLSTA_INQUEUE) - { - pcall->call_state = CLSTA_CANCEL; - mohq_debug (pcall->pmohq, "%sCANCELed call (%s)", - pfncname, pcall->call_from); - if (pmod_data->psl->freply (pmsg, 487, presp_reqterm) < 0) - { LM_ERR ("%sUnable to create reply!\n", pfncname); } - } -else - { - LM_ERR ("%sUnable to CANCEL because accepted INVITE for call (%s)!\n", - pfncname, pcall->call_from); - if (pmod_data->psl->freply (pmsg, 481, presp_nocall) < 0) - { LM_ERR ("%sUnable to create reply!\n", pfncname); } - } -return; + char *pfncname = "cancel_msg: "; + if(pcall->call_state < CLSTA_INQUEUE) { + pcall->call_state = CLSTA_CANCEL; + mohq_debug(pcall->pmohq, "%sCANCELed call (%s)", pfncname, + pcall->call_from); + if(pmod_data->psl->freply(pmsg, 487, presp_reqterm) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + } + } else { + LM_ERR("%sUnable to CANCEL because accepted INVITE for call (%s)!\n", + pfncname, pcall->call_from); + if(pmod_data->psl->freply(pmsg, 481, presp_nocall) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + } + } + return; } /********** @@ -422,16 +358,18 @@ return; * OUTPUT: =0 if inactive **********/ -int chk_rtpstat (sip_msg_t *pmsg) +int chk_rtpstat(sip_msg_t *pmsg) { -pv_value_t pval [1]; -memset (pval, 0, sizeof (pv_value_t)); -if (pv_get_spec_value (pmsg, prtp_pv, pval)) - { return 0; } -if (pval->flags & PV_VAL_NULL) - { return 0; } -return 1; + pv_value_t pval[1]; + memset(pval, 0, sizeof(pv_value_t)); + if(pv_get_spec_value(pmsg, prtp_pv, pval)) { + return 0; + } + if(pval->flags & PV_VAL_NULL) { + return 0; + } + return 1; } /********** @@ -443,81 +381,83 @@ return 1; * OUTPUT: none **********/ -void close_call (sip_msg_t *pmsg, call_lst *pcall) +void close_call(sip_msg_t *pmsg, call_lst *pcall) { -/********** + /********** * o destroy RTP connection * o create dialog **********/ -char *pfncname = "close_call: "; -int bsent = 0; -char *phdr = 0; -end_RTP (pmsg, pcall); -struct to_body ptob [2]; -dlg_t *pdlg = form_dialog (pcall, ptob); -if (!pdlg) - { goto bye_err; } -pdlg->state = DLG_CONFIRMED; + char *pfncname = "close_call: "; + int bsent = 0; + char *phdr = 0; + end_RTP(pmsg, pcall); + struct to_body ptob[2]; + dlg_t *pdlg = form_dialog(pcall, ptob); + if(!pdlg) { + goto bye_err; + } + pdlg->state = DLG_CONFIRMED; -/********** + /********** * form BYE header * o calculate size * o create buffer **********/ -tm_api_t *ptm = pmod_data->ptm; -char *pquri = pcall->pmohq->mohq_uri; -int npos1 = sizeof (pbyemsg) // BYE template - + strlen (pcall->call_via) // Via - + strlen (pcall->call_route) // Route - + strlen (pquri); // Contact -phdr = pkg_malloc (npos1); -if (!phdr) - { - LM_ERR ("%sNo more memory!\n", pfncname); - goto bye_err; - } -sprintf (phdr, pbyemsg, - pcall->call_via, // Via - pcall->call_route, // Route - pquri); // Contact -str phdrs [1]; -phdrs->s = phdr; -phdrs->len = strlen (phdr); - -/********** + tm_api_t *ptm = pmod_data->ptm; + char *pquri = pcall->pmohq->mohq_uri; + int npos1 = sizeof(pbyemsg) // BYE template + + strlen(pcall->call_via) // Via + + strlen(pcall->call_route) // Route + + strlen(pquri); // Contact + phdr = pkg_malloc(npos1); + if(!phdr) { + LM_ERR("%sNo more memory!\n", pfncname); + goto bye_err; + } + sprintf(phdr, pbyemsg, + pcall->call_via, // Via + pcall->call_route, // Route + pquri); // Contact + str phdrs[1]; + phdrs->s = phdr; + phdrs->len = strlen(phdr); + + /********** * send BYE request **********/ -uac_req_t puac [1]; -set_uac_req (puac, pbye, phdrs, 0, pdlg, - TMCB_LOCAL_COMPLETED | TMCB_ON_FAILURE, bye_cb, pcall); -pcall->call_state = CLSTA_BYE; -if (ptm->t_request_within (puac) < 0) - { - LM_ERR ("%sUnable to create BYE request for call (%s)!\n", - pfncname, pcall->call_from); - goto bye_err; - } -mohq_debug (pcall->pmohq, "%sSent BYE request for call (%s)", - pfncname, pcall->call_from); -bsent = 1; - -/********** + uac_req_t puac[1]; + set_uac_req(puac, pbye, phdrs, 0, pdlg, + TMCB_LOCAL_COMPLETED | TMCB_ON_FAILURE, bye_cb, pcall); + pcall->call_state = CLSTA_BYE; + if(ptm->t_request_within(puac) < 0) { + LM_ERR("%sUnable to create BYE request for call (%s)!\n", pfncname, + pcall->call_from); + goto bye_err; + } + mohq_debug(pcall->pmohq, "%sSent BYE request for call (%s)", pfncname, + pcall->call_from); + bsent = 1; + + /********** * o free memory * o delete call **********/ bye_err: -if (pdlg) - { pkg_free (pdlg); } -if (phdr) - { pkg_free (phdr); } -if (!bsent) - { delete_call (pcall); } -return; + if(pdlg) { + pkg_free(pdlg); + } + if(phdr) { + pkg_free(phdr); + } + if(!bsent) { + delete_call(pcall); + } + return; } /********** @@ -531,123 +471,132 @@ return; * OUTPUT: initializes call record; =0 if failed **********/ -int -create_call (sip_msg_t *pmsg, call_lst *pcall, int ncall_idx, int mohq_idx) +int create_call(sip_msg_t *pmsg, call_lst *pcall, int ncall_idx, int mohq_idx) { -char *pfncname = "create_call: "; -char *pbuf; -str *pstr; + char *pfncname = "create_call: "; + char *pbuf; + str *pstr; -/********** + /********** * add values to new entry * o call ID * o from **********/ -pcall->pmohq = &pmod_data->pmohq_lst [mohq_idx]; -pstr = &pmsg->callid->body; -pbuf = pcall->call_buffer; -pcall->call_buflen = sizeof (pcall->call_buffer); -pcall->call_id = pbuf; -if (!addstrbfr (pstr->s, pstr->len, &pbuf, &pcall->call_buflen, 1)) - { return 0; } -pstr = &pmsg->from->body; -pcall->call_from = pbuf; -if (!addstrbfr (pstr->s, pstr->len, &pbuf, &pcall->call_buflen, 1)) - { return 0; } -pcall->call_contact = pbuf; -if (pmsg->contact) - { - pstr = &pmsg->contact->body; - if (!addstrbfr (pstr->s, pstr->len, &pbuf, &pcall->call_buflen, 0)) - { return 0; } - } -if (!addstrbfr (0, 0, &pbuf, &pcall->call_buflen, 1)) - { return 0; } - -/********** + pcall->pmohq = &pmod_data->pmohq_lst[mohq_idx]; + pstr = &pmsg->callid->body; + pbuf = pcall->call_buffer; + pcall->call_buflen = sizeof(pcall->call_buffer); + pcall->call_id = pbuf; + if(!addstrbfr(pstr->s, pstr->len, &pbuf, &pcall->call_buflen, 1)) { + return 0; + } + pstr = &pmsg->from->body; + pcall->call_from = pbuf; + if(!addstrbfr(pstr->s, pstr->len, &pbuf, &pcall->call_buflen, 1)) { + return 0; + } + pcall->call_contact = pbuf; + if(pmsg->contact) { + pstr = &pmsg->contact->body; + if(!addstrbfr(pstr->s, pstr->len, &pbuf, &pcall->call_buflen, 0)) { + return 0; + } + } + if(!addstrbfr(0, 0, &pbuf, &pcall->call_buflen, 1)) { + return 0; + } + + /********** * extract Via headers **********/ -pcall->call_via = pbuf; -hdr_field_t *phdr; -for (phdr = pmsg->h_via1; phdr; phdr = next_sibling_hdr (phdr)) - { - struct via_body *pvia; - char *pviabuf; - int npos; - for (pvia = (struct via_body *)phdr->parsed; pvia; pvia = pvia->next) - { - /********** + pcall->call_via = pbuf; + hdr_field_t *phdr; + for(phdr = pmsg->h_via1; phdr; phdr = next_sibling_hdr(phdr)) { + struct via_body *pvia; + char *pviabuf; + int npos; + for(pvia = (struct via_body *)phdr->parsed; pvia; pvia = pvia->next) { + /********** * skip trailing whitespace **********/ - npos = pvia->bsize; - pviabuf = pvia->name.s; - while (npos) - { - --npos; - if (pviabuf [npos] == ' ' || pviabuf [npos] == '\r' - || pviabuf [npos] == '\n' || pviabuf [npos] == '\t' - || pviabuf [npos] == ',') - { continue; } - break; - } - - /********** + npos = pvia->bsize; + pviabuf = pvia->name.s; + while(npos) { + --npos; + if(pviabuf[npos] == ' ' || pviabuf[npos] == '\r' + || pviabuf[npos] == '\n' || pviabuf[npos] == '\t' + || pviabuf[npos] == ',') { + continue; + } + break; + } + + /********** * copy via **********/ - if (!addstrbfr ("Via: ", 5, &pbuf, &pcall->call_buflen, 0)) - { return 0; } - if (!addstrbfr (pviabuf, npos + 1, &pbuf, &pcall->call_buflen, 0)) - { return 0; } - if (!addstrbfr (SIPEOL, 2, &pbuf, &pcall->call_buflen, 0)) - { return 0; } - } - } -if (!addstrbfr (0, 0, &pbuf, &pcall->call_buflen, 1)) - { return 0; } - -/********** + if(!addstrbfr("Via: ", 5, &pbuf, &pcall->call_buflen, 0)) { + return 0; + } + if(!addstrbfr(pviabuf, npos + 1, &pbuf, &pcall->call_buflen, 0)) { + return 0; + } + if(!addstrbfr(SIPEOL, 2, &pbuf, &pcall->call_buflen, 0)) { + return 0; + } + } + } + if(!addstrbfr(0, 0, &pbuf, &pcall->call_buflen, 1)) { + return 0; + } + + /********** * extract Route headers **********/ -pcall->call_route = pbuf; -struct hdr_field *proute; -for (proute = pmsg->record_route; proute; proute = next_sibling_hdr (proute)) - { - if (parse_rr (proute) < 0) - { return 0; } - rr_t *prouterr; - for (prouterr = proute->parsed; prouterr; prouterr = prouterr->next) - { - if (!addstrbfr ("Route: ", 7, &pbuf, &pcall->call_buflen, 0)) - { return 0; } - if (!addstrbfr (prouterr->nameaddr.name.s, prouterr->len, - &pbuf, &pcall->call_buflen, 0)) - { return 0; } - if (!addstrbfr (SIPEOL, 2, &pbuf, &pcall->call_buflen, 0)) - { return 0; } - } - } -if (!addstrbfr (0, 0, &pbuf, &pcall->call_buflen, 1)) - { return 0; } - -/********** + pcall->call_route = pbuf; + struct hdr_field *proute; + for(proute = pmsg->record_route; proute; + proute = next_sibling_hdr(proute)) { + if(parse_rr(proute) < 0) { + return 0; + } + rr_t *prouterr; + for(prouterr = proute->parsed; prouterr; prouterr = prouterr->next) { + if(!addstrbfr("Route: ", 7, &pbuf, &pcall->call_buflen, 0)) { + return 0; + } + if(!addstrbfr(prouterr->nameaddr.name.s, prouterr->len, &pbuf, + &pcall->call_buflen, 0)) { + return 0; + } + if(!addstrbfr(SIPEOL, 2, &pbuf, &pcall->call_buflen, 0)) { + return 0; + } + } + } + if(!addstrbfr(0, 0, &pbuf, &pcall->call_buflen, 1)) { + return 0; + } + + /********** * o place tag at the end * o update DB **********/ -pcall->call_tag = pbuf; -if (!addstrbfr (0, 0, &pbuf, &pcall->call_buflen, 1)) - { return 0; } -pcall->call_state = CLSTA_ENTER; -add_call_rec (ncall_idx); -mohq_debug (pcall->pmohq, "%sAdded call (%s) to queue (%s)", - pfncname, pcall->call_from, pcall->pmohq->mohq_name); -return 1; + pcall->call_tag = pbuf; + if(!addstrbfr(0, 0, &pbuf, &pcall->call_buflen, 1)) { + return 0; + } + pcall->call_state = CLSTA_ENTER; + add_call_rec(ncall_idx); + mohq_debug(pcall->pmohq, "%sAdded call (%s) to queue (%s)", pfncname, + pcall->call_from, pcall->pmohq->mohq_name); + return 1; } /********** @@ -658,53 +607,48 @@ return 1; * OUTPUT: none **********/ -void delete_call (call_lst *pcall) +void delete_call(call_lst *pcall) { -/********** + /********** * release transaction **********/ -char *pfncname = "delete_call: "; -struct cell *ptrans; -tm_api_t *ptm = pmod_data->ptm; -if (pcall->call_hash || pcall->call_label) - { - if (ptm->t_lookup_ident (&ptrans, pcall->call_hash, pcall->call_label) < 0) - { - LM_ERR ("%sLookup transaction failed for call (%s) from queue (%s)!\n", - pfncname, pcall->call_from, pcall->pmohq->mohq_name); - } - else - { - if (ptm->t_release (pcall->call_pmsg) < 0) - { - LM_ERR ("%sRelease transaction failed for call (%s) from queue (%s)!\n", - pfncname, pcall->call_from, pcall->pmohq->mohq_name); - } - } - pcall->call_hash = pcall->call_label = 0; - } - -/********** + char *pfncname = "delete_call: "; + struct cell *ptrans; + tm_api_t *ptm = pmod_data->ptm; + if(pcall->call_hash || pcall->call_label) { + if(ptm->t_lookup_ident(&ptrans, pcall->call_hash, pcall->call_label) + < 0) { + LM_ERR("%sLookup transaction failed for call (%s) from queue " + "(%s)!\n", + pfncname, pcall->call_from, pcall->pmohq->mohq_name); + } else { + if(ptm->t_release(pcall->call_pmsg) < 0) { + LM_ERR("%sRelease transaction failed for call (%s) from queue " + "(%s)!\n", + pfncname, pcall->call_from, pcall->pmohq->mohq_name); + } + } + pcall->call_hash = pcall->call_label = 0; + } + + /********** * o update DB * o inactivate slot **********/ -if (!mohq_lock_set (pmod_data->pcall_lock, 1, 5000)) - { - LM_ERR ("%sUnable to set call lock for call (%s) from queue (%s)!\n", - pfncname, pcall->call_from, pcall->pmohq->mohq_name); - } -else - { - mohq_debug (pcall->pmohq, "%sDeleting call (%s) from queue (%s)", - pfncname, pcall->call_from, pcall->pmohq->mohq_name); - delete_call_rec (pcall); - mohq_lock_release (pmod_data->pcall_lock); - } -pcall->call_state = 0; -return; + if(!mohq_lock_set(pmod_data->pcall_lock, 1, 5000)) { + LM_ERR("%sUnable to set call lock for call (%s) from queue (%s)!\n", + pfncname, pcall->call_from, pcall->pmohq->mohq_name); + } else { + mohq_debug(pcall->pmohq, "%sDeleting call (%s) from queue (%s)", + pfncname, pcall->call_from, pcall->pmohq->mohq_name); + delete_call_rec(pcall); + mohq_lock_release(pmod_data->pcall_lock); + } + pcall->call_state = 0; + return; } /********** @@ -716,37 +660,35 @@ return; * OUTPUT: none **********/ -void deny_method (sip_msg_t *pmsg, call_lst *pcall) +void deny_method(sip_msg_t *pmsg, call_lst *pcall) { -/********** + /********** * RFC 3261 section 8.2.1 * o get transaction * o respond with 405 and Allow header **********/ -char *pfncname = "deny_method: "; -tm_api_t *ptm = pmod_data->ptm; -if (ptm->t_newtran (pmsg) < 0) - { - LM_ERR ("%sUnable to create new transaction!\n", pfncname); - if (pmod_data->psl->freply (pmsg, 500, presp_srverr) < 0) - { - LM_ERR ("%sUnable to create reply to %.*s!\n", pfncname, - STR_FMT (&REQ_LINE (pmsg).method)); - } - return; - } -if (!add_lump_rpl2 (pmsg, pallowhdr->s, pallowhdr->len, LUMP_RPL_HDR)) - { LM_ERR ("%sUnable to add Allow header!\n", pfncname); } -LM_ERR ("%sRefused %.*s for call (%s)!\n", pfncname, - STR_FMT (&REQ_LINE (pmsg).method), pcall->call_from); -if (ptm->t_reply (pmsg, 405, presp_noallow->s) < 0) - { - LM_ERR ("%sUnable to create reply to %.*s!\n", pfncname, - STR_FMT (&REQ_LINE (pmsg).method)); - } -return; + char *pfncname = "deny_method: "; + tm_api_t *ptm = pmod_data->ptm; + if(ptm->t_newtran(pmsg) < 0) { + LM_ERR("%sUnable to create new transaction!\n", pfncname); + if(pmod_data->psl->freply(pmsg, 500, presp_srverr) < 0) { + LM_ERR("%sUnable to create reply to %.*s!\n", pfncname, + STR_FMT(&REQ_LINE(pmsg).method)); + } + return; + } + if(!add_lump_rpl2(pmsg, pallowhdr->s, pallowhdr->len, LUMP_RPL_HDR)) { + LM_ERR("%sUnable to add Allow header!\n", pfncname); + } + LM_ERR("%sRefused %.*s for call (%s)!\n", pfncname, + STR_FMT(&REQ_LINE(pmsg).method), pcall->call_from); + if(ptm->t_reply(pmsg, 405, presp_noallow->s) < 0) { + LM_ERR("%sUnable to create reply to %.*s!\n", pfncname, + STR_FMT(&REQ_LINE(pmsg).method)); + } + return; } /********** @@ -758,25 +700,23 @@ return; * OUTPUT: none **********/ -void end_RTP (sip_msg_t *pmsg, call_lst *pcall) +void end_RTP(sip_msg_t *pmsg, call_lst *pcall) { -/********** + /********** * destroy RTP connection **********/ -char *pfncname = "end_RTP: "; -if ((pmsg != FAKED_REPLY) && (pcall->call_state != CLSTA_ENTER)) - { - mohq_debug (pcall->pmohq, "%sDestroying RTP link for call (%s)", - pfncname, pcall->call_from); - if (pmod_data->fn_rtp_destroy (pmsg, 0, 0) != 1) - { - LM_ERR ("%srtpproxy_destroy refused for call (%s)!\n", - pfncname, pcall->call_from); - } - } -return; + char *pfncname = "end_RTP: "; + if((pmsg != FAKED_REPLY) && (pcall->call_state != CLSTA_ENTER)) { + mohq_debug(pcall->pmohq, "%sDestroying RTP link for call (%s)", + pfncname, pcall->call_from); + if(pmod_data->fn_rtp_destroy(pmsg, 0, 0) != 1) { + LM_ERR("%srtpproxy_destroy refused for call (%s)!\n", pfncname, + pcall->call_from); + } + } + return; } /********** @@ -788,49 +728,46 @@ return; * OUTPUT: call pointer; =0 if unable to find/create **********/ -call_lst *find_call (sip_msg_t *pmsg, int mohq_idx) +call_lst *find_call(sip_msg_t *pmsg, int mohq_idx) { -/********** + /********** * o get to tag * o get callID * o search calls **********/ -char *pfncname = "find_call: "; -str *ptotag = &(get_to (pmsg)->tag_value); -if (!ptotag->len) - { ptotag = 0; } -if (!pmsg->callid) - { - LM_ERR ("%sNo call ID!\n", pfncname); - return 0; - } -str *pcallid = &pmsg->callid->body; -if (!pcallid) - { - LM_ERR ("%sNo call ID!\n", pfncname); - return 0; - } -int nopen = -1; -int nidx; -call_lst *pcall; -for (nidx = 0; nidx < pmod_data->call_cnt; nidx++) - { - /********** + char *pfncname = "find_call: "; + str *ptotag = &(get_to(pmsg)->tag_value); + if(!ptotag->len) { + ptotag = 0; + } + if(!pmsg->callid) { + LM_ERR("%sNo call ID!\n", pfncname); + return 0; + } + str *pcallid = &pmsg->callid->body; + if(!pcallid) { + LM_ERR("%sNo call ID!\n", pfncname); + return 0; + } + int nopen = -1; + int nidx; + call_lst *pcall; + for(nidx = 0; nidx < pmod_data->call_cnt; nidx++) { + /********** * o call active? * o call timed out on ACK? * o callID matches? * o to tag matches? **********/ - pcall = &pmod_data->pcall_lst [nidx]; - if (!pcall->call_state) - { - nopen = nidx; - continue; - } -#if 0 /* ??? need to handle */ + pcall = &pmod_data->pcall_lst[nidx]; + if(!pcall->call_state) { + nopen = nidx; + continue; + } +#if 0 /* ??? need to handle */ if (pcall->call_time && (pcall->call_state < CLSTA_INQUEUE)) { if ((pcall->call_time + 32) < time (0)) @@ -841,48 +778,50 @@ for (nidx = 0; nidx < pmod_data->call_cnt; nidx++) } } #endif /* ??? */ - str tmpstr [1]; - tmpstr->s = pcall->call_id; - tmpstr->len = strlen (tmpstr->s); - if (!STR_EQ (*tmpstr, *pcallid)) - { continue; } - if (ptotag) - { - tmpstr->s = pcall->call_tag; - tmpstr->len = strlen (tmpstr->s); - if (!STR_EQ (*tmpstr, *ptotag)) - { continue; } - } - else - { - /********** + str tmpstr[1]; + tmpstr->s = pcall->call_id; + tmpstr->len = strlen(tmpstr->s); + if(!STR_EQ(*tmpstr, *pcallid)) { + continue; + } + if(ptotag) { + tmpstr->s = pcall->call_tag; + tmpstr->len = strlen(tmpstr->s); + if(!STR_EQ(*tmpstr, *ptotag)) { + continue; + } + } else { + /********** * match not allowed for INVITE **********/ - if (pmsg->REQ_METHOD == METHOD_INVITE) - { return 0; } - } - return pcall; - } + if(pmsg->REQ_METHOD == METHOD_INVITE) { + return 0; + } + } + return pcall; + } -/********** + /********** * o first INVITE? * o create a new call record **********/ -if (pmsg->REQ_METHOD != METHOD_INVITE) - { return 0; } -if (ptotag) - { return 0; } -if (nopen < 0) - { - LM_ERR ("%sNo call slots available!\n", pfncname); - return 0; - } -pcall = &pmod_data->pcall_lst [nopen]; -if (!create_call (pmsg, pcall, nopen, mohq_idx)) - { return 0; } -return pcall; + if(pmsg->REQ_METHOD != METHOD_INVITE) { + return 0; + } + if(ptotag) { + return 0; + } + if(nopen < 0) { + LM_ERR("%sNo call slots available!\n", pfncname); + return 0; + } + pcall = &pmod_data->pcall_lst[nopen]; + if(!create_call(pmsg, pcall, nopen, mohq_idx)) { + return 0; + } + return pcall; } /********** @@ -893,42 +832,41 @@ return pcall; * OUTPUT: queue index; -1 if unable to find **********/ -int find_queue (sip_msg_t *pmsg) +int find_queue(sip_msg_t *pmsg) { -/********** + /********** * o find current RURI * o strip off parms or headers * o search queues **********/ -str *pruri = - pmsg->new_uri.s ? &pmsg->new_uri : &pmsg->first_line.u.request.uri; -int nidx; -str pstr [1]; -pstr->s = pruri->s; -pstr->len = pruri->len; -for (nidx = 0; nidx < pruri->len; nidx++) - { - if (pstr->s [nidx] == ';' || pstr->s [nidx] == '?') - { - pstr->len = nidx; - break; - } - } -mohq_lst *pqlst = pmod_data->pmohq_lst; -int nqidx; -for (nqidx = 0; nqidx < pmod_data->mohq_cnt; nqidx++) - { - str pmohstr [1]; - pmohstr->s = pqlst [nqidx].mohq_uri; - pmohstr->len = strlen (pmohstr->s); - if (STR_EQ (*pmohstr, *pstr)) - { break; } - } -if (nqidx == pmod_data->mohq_cnt) - { return -1;} -return nqidx; + str *pruri = + pmsg->new_uri.s ? &pmsg->new_uri : &pmsg->first_line.u.request.uri; + int nidx; + str pstr[1]; + pstr->s = pruri->s; + pstr->len = pruri->len; + for(nidx = 0; nidx < pruri->len; nidx++) { + if(pstr->s[nidx] == ';' || pstr->s[nidx] == '?') { + pstr->len = nidx; + break; + } + } + mohq_lst *pqlst = pmod_data->pmohq_lst; + int nqidx; + for(nqidx = 0; nqidx < pmod_data->mohq_cnt; nqidx++) { + str pmohstr[1]; + pmohstr->s = pqlst[nqidx].mohq_uri; + pmohstr->len = strlen(pmohstr->s); + if(STR_EQ(*pmohstr, *pstr)) { + break; + } + } + if(nqidx == pmod_data->mohq_cnt) { + return -1; + } + return nqidx; } /********** @@ -939,31 +877,29 @@ return nqidx; * OUTPUT: queue index; -1 if unable to find **********/ -int find_qname (str *pqname) +int find_qname(str *pqname) { -char *pfncname = "find_qname: "; -int nidx; -str tmpstr; -if (!mohq_lock_set (pmod_data->pmohq_lock, 0, 500)) - { - LM_ERR ("%sUnable to lock queues!\n", pfncname); - return -1; - } -for (nidx = 0; nidx < pmod_data->mohq_cnt; nidx++) - { - tmpstr.s = pmod_data->pmohq_lst [nidx].mohq_name; - tmpstr.len = strlen (tmpstr.s); - if (STR_EQ (tmpstr, *pqname)) - { break; } - } -if (nidx == pmod_data->mohq_cnt) - { - LM_ERR ("%sUnable to find queue (%.*s)!\n", pfncname, STR_FMT (pqname)); - nidx = -1; - } -mohq_lock_release (pmod_data->pmohq_lock); -return nidx; + char *pfncname = "find_qname: "; + int nidx; + str tmpstr; + if(!mohq_lock_set(pmod_data->pmohq_lock, 0, 500)) { + LM_ERR("%sUnable to lock queues!\n", pfncname); + return -1; + } + for(nidx = 0; nidx < pmod_data->mohq_cnt; nidx++) { + tmpstr.s = pmod_data->pmohq_lst[nidx].mohq_name; + tmpstr.len = strlen(tmpstr.s); + if(STR_EQ(tmpstr, *pqname)) { + break; + } + } + if(nidx == pmod_data->mohq_cnt) { + LM_ERR("%sUnable to find queue (%.*s)!\n", pfncname, STR_FMT(pqname)); + nidx = -1; + } + mohq_lock_release(pmod_data->pmohq_lock); + return nidx; } /********** @@ -974,51 +910,53 @@ return nidx; * OUTPUT: call index; -1 if unable to find **********/ -int find_referred_call (str *pvalue) +int find_referred_call(str *pvalue) { -/********** + /********** * get URI **********/ -char *pfncname = "find_referred_call: "; -struct to_body pref [1]; -parse_to (pvalue->s, &pvalue->s [pvalue->len + 1], pref); -if (pref->error != PARSE_OK) - { - // should never happen - LM_ERR ("%sInvalid Referred-By URI (%.*s)!\n", pfncname, STR_FMT (pvalue)); - return -1; - } -if (pref->param_lst) - { free_to_params (pref); } - -/********** + char *pfncname = "find_referred_call: "; + struct to_body pref[1]; + parse_to(pvalue->s, &pvalue->s[pvalue->len + 1], pref); + if(pref->error != PARSE_OK) { + // should never happen + LM_ERR("%sInvalid Referred-By URI (%.*s)!\n", pfncname, + STR_FMT(pvalue)); + return -1; + } + if(pref->param_lst) { + free_to_params(pref); + } + + /********** * search calls for matching **********/ -int nidx; -str tmpstr; -struct to_body pfrom [1]; -for (nidx = 0; nidx < pmod_data->call_cnt; nidx++) - { - if (!pmod_data->pcall_lst [nidx].call_state) - { continue; } - tmpstr.s = pmod_data->pcall_lst [nidx].call_from; - tmpstr.len = strlen (tmpstr.s); - parse_to (tmpstr.s, &tmpstr.s [tmpstr.len + 1], pfrom); - if (pfrom->error != PARSE_OK) - { - // should never happen - LM_ERR ("%sInvalid From URI (%.*s)!\n", pfncname, STR_FMT (&tmpstr)); - continue; - } - if (pfrom->param_lst) - { free_to_params (pfrom); } - if (STR_EQ (pfrom->uri, pref->uri)) - { return nidx; } - } -return -1; + int nidx; + str tmpstr; + struct to_body pfrom[1]; + for(nidx = 0; nidx < pmod_data->call_cnt; nidx++) { + if(!pmod_data->pcall_lst[nidx].call_state) { + continue; + } + tmpstr.s = pmod_data->pcall_lst[nidx].call_from; + tmpstr.len = strlen(tmpstr.s); + parse_to(tmpstr.s, &tmpstr.s[tmpstr.len + 1], pfrom); + if(pfrom->error != PARSE_OK) { + // should never happen + LM_ERR("%sInvalid From URI (%.*s)!\n", pfncname, STR_FMT(&tmpstr)); + continue; + } + if(pfrom->param_lst) { + free_to_params(pfrom); + } + if(STR_EQ(pfrom->uri, pref->uri)) { + return nidx; + } + } + return -1; } /********** @@ -1030,189 +968,176 @@ return -1; * OUTPUT: none **********/ -void first_invite_msg (sip_msg_t *pmsg, call_lst *pcall) +void first_invite_msg(sip_msg_t *pmsg, call_lst *pcall) { -char *pfncname = "first_invite_msg: "; + char *pfncname = "first_invite_msg: "; -/********** + /********** * o SDP exists? * o accepts REFER? **********/ -if (!(pmsg->msg_flags & FL_SDP_BODY)) - { - if (parse_sdp (pmsg)) - { - if (pmod_data->psl->freply (pmsg, 488, presp_noaccept) < 0) - { - LM_ERR ("%sUnable to create reply!\n", pfncname); - return; - } - LM_ERR ("%sINVITE lacks SDP (%s) from queue (%s)!\n", - pfncname, pcall->call_from, pcall->pmohq->mohq_name); - delete_call (pcall); - return; - } - } -if (pmsg->allow) - { - if (!search_hdr_ext (pmsg->allow, prefer)) - { - if (pmod_data->psl->freply (pmsg, 488, presp_noaccept) < 0) - { - LM_ERR ("%sUnable to create reply!\n", pfncname); - return; - } - LM_ERR ("%sMissing REFER support (%s) from queue (%s)!\n", - pfncname, pcall->call_from, pcall->pmohq->mohq_name); - delete_call (pcall); - return; - } - } - -/********** + if(!(pmsg->msg_flags & FL_SDP_BODY)) { + if(parse_sdp(pmsg)) { + if(pmod_data->psl->freply(pmsg, 488, presp_noaccept) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + return; + } + LM_ERR("%sINVITE lacks SDP (%s) from queue (%s)!\n", pfncname, + pcall->call_from, pcall->pmohq->mohq_name); + delete_call(pcall); + return; + } + } + if(pmsg->allow) { + if(!search_hdr_ext(pmsg->allow, prefer)) { + if(pmod_data->psl->freply(pmsg, 488, presp_noaccept) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + return; + } + LM_ERR("%sMissing REFER support (%s) from queue (%s)!\n", pfncname, + pcall->call_from, pcall->pmohq->mohq_name); + delete_call(pcall); + return; + } + } + + /********** * send RTP offer **********/ -fparam_t rflag = {.orig="", .type=FPARAM_STRING, {.asciiz="r"}, .fixed=0}; -mohq_debug (pcall->pmohq, - "%sMaking offer for RTP link for call (%s) from queue (%s)", - pfncname, pcall->call_from, pcall->pmohq->mohq_name); -if (pmod_data->fn_rtp_offer (pmsg, (char *) &rflag, 0) != 1) - { - if (pmod_data->psl->freply (pmsg, 486, presp_busy) < 0) - { - LM_ERR ("%sUnable to create reply!\n", pfncname); - return; - } - LM_ERR ("%srtpproxy_offer refused for call (%s)!\n", - pfncname, pcall->call_from); - delete_call (pcall); - return; - } - -/********** + fparam_t rflag = { + .orig = "", .type = FPARAM_STRING, {.asciiz = "r"}, .fixed = 0}; + mohq_debug(pcall->pmohq, + "%sMaking offer for RTP link for call (%s) from queue (%s)", + pfncname, pcall->call_from, pcall->pmohq->mohq_name); + if(pmod_data->fn_rtp_offer(pmsg, (char *)&rflag, 0) != 1) { + if(pmod_data->psl->freply(pmsg, 486, presp_busy) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + return; + } + LM_ERR("%srtpproxy_offer refused for call (%s)!\n", pfncname, + pcall->call_from); + delete_call(pcall); + return; + } + + /********** * o create new transaction * o save To tag * o catch failures * o save transaction data **********/ -tm_api_t *ptm = pmod_data->ptm; -if (ptm->t_newtran (pmsg) < 0) - { - LM_ERR ("%sUnable to create new transaction for call (%s)!\n", - pfncname, pcall->call_from); - end_RTP (pmsg, pcall); - delete_call (pcall); - return; - } -struct cell *ptrans = ptm->t_gett (); -pcall->call_hash = ptrans->hash_index; -pcall->call_label = ptrans->label; -str ptotag [1]; -if (ptm->t_get_reply_totag (pmsg, ptotag) != 1) - { - LM_ERR ("%sUnable to create totag for call (%s)!\n", - pfncname, pcall->call_from); - if (ptm->t_reply (pmsg, 500, presp_srverr->s) < 0) - { LM_ERR ("%sUnable to reply to INVITE!\n", pfncname); } - end_RTP (pmsg, pcall); - delete_call (pcall); - return; - } -char *pbuf = pcall->call_tag; -if (!addstrbfr (ptotag->s, ptotag->len, &pbuf, &pcall->call_buflen, 1)) - { - LM_ERR ("%sInsufficient buffer space for call (%s)!\n", - pfncname, pcall->call_from); - if (ptm->t_reply (pmsg, 500, presp_srverr->s) < 0) - { LM_ERR ("%sUnable to reply to INVITE!\n", pfncname); } - end_RTP (pmsg, pcall); - delete_call (pcall); - return; - } -pcall->call_cseq = 1; -if (ptm->register_tmcb (pmsg, 0, TMCB_DESTROY | TMCB_ON_FAILURE, - invite_cb, pcall, 0) < 0) - { - LM_ERR ("%sUnable to set callback for call (%s)!\n", - pfncname, pcall->call_from); - if (ptm->t_reply (pmsg, 500, presp_srverr->s) < 0) - { LM_ERR ("%sUnable to reply to INVITE!\n", pfncname); } - end_RTP (pmsg, pcall); - delete_call (pcall); - return; - } - -/********** + tm_api_t *ptm = pmod_data->ptm; + if(ptm->t_newtran(pmsg) < 0) { + LM_ERR("%sUnable to create new transaction for call (%s)!\n", pfncname, + pcall->call_from); + end_RTP(pmsg, pcall); + delete_call(pcall); + return; + } + struct cell *ptrans = ptm->t_gett(); + pcall->call_hash = ptrans->hash_index; + pcall->call_label = ptrans->label; + str ptotag[1]; + if(ptm->t_get_reply_totag(pmsg, ptotag) != 1) { + LM_ERR("%sUnable to create totag for call (%s)!\n", pfncname, + pcall->call_from); + if(ptm->t_reply(pmsg, 500, presp_srverr->s) < 0) { + LM_ERR("%sUnable to reply to INVITE!\n", pfncname); + } + end_RTP(pmsg, pcall); + delete_call(pcall); + return; + } + char *pbuf = pcall->call_tag; + if(!addstrbfr(ptotag->s, ptotag->len, &pbuf, &pcall->call_buflen, 1)) { + LM_ERR("%sInsufficient buffer space for call (%s)!\n", pfncname, + pcall->call_from); + if(ptm->t_reply(pmsg, 500, presp_srverr->s) < 0) { + LM_ERR("%sUnable to reply to INVITE!\n", pfncname); + } + end_RTP(pmsg, pcall); + delete_call(pcall); + return; + } + pcall->call_cseq = 1; + if(ptm->register_tmcb( + pmsg, 0, TMCB_DESTROY | TMCB_ON_FAILURE, invite_cb, pcall, 0) + < 0) { + LM_ERR("%sUnable to set callback for call (%s)!\n", pfncname, + pcall->call_from); + if(ptm->t_reply(pmsg, 500, presp_srverr->s) < 0) { + LM_ERR("%sUnable to reply to INVITE!\n", pfncname); + } + end_RTP(pmsg, pcall); + delete_call(pcall); + return; + } + + /********** * reply with trying **********/ -if (ptm->t_reply (pmsg, 100, presp_trying->s) < 0) - { - LM_ERR ("%sUnable to create reply!\n", pfncname); - end_RTP (pmsg, pcall); - delete_call (pcall); - return; - } -pcall->call_state = CLSTA_TRYING; + if(ptm->t_reply(pmsg, 100, presp_trying->s) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + end_RTP(pmsg, pcall); + delete_call(pcall); + return; + } + pcall->call_state = CLSTA_TRYING; -/********** + /********** * o add contact to reply * o supports/requires PRACK? (RFC 3262 section 3) * o exit if not ringing **********/ -str pcontact [1]; -char *pcontacthdr = "Contact: <%s>" SIPEOL; -pcontact->s - = pkg_malloc (strlen (pcall->pmohq->mohq_uri) + strlen (pcontacthdr)); -if (!pcontact->s) - { - LM_ERR ("%sNo more memory!\n", pfncname); - end_RTP (pmsg, pcall); - delete_call (pcall); - return; - } -sprintf (pcontact->s, pcontacthdr, pcall->pmohq->mohq_uri); -pcontact->len = strlen (pcontact->s); -if (!add_lump_rpl2 (pmsg, pcontact->s, pcontact->len, LUMP_RPL_HDR)) - { - LM_ERR ("%sUnable to add contact (%s) to call (%s)!\n", - pfncname, pcontact->s, pcall->call_from); - } -pkg_free (pcontact->s); -pcall->call_pmsg = pmsg; -if (search_hdr_ext (pmsg->require, p100rel)) - { - if (!send_prov_rsp (pmsg, pcall)) - { - end_RTP (pmsg, pcall); - delete_call (pcall); - return; - } - if (pcall->call_state == CLSTA_CANCEL) - { - end_RTP (pmsg, pcall); - delete_call (pcall); - return; - } - } - -/********** + str pcontact[1]; + char *pcontacthdr = "Contact: <%s>" SIPEOL; + pcontact->s = + pkg_malloc(strlen(pcall->pmohq->mohq_uri) + strlen(pcontacthdr)); + if(!pcontact->s) { + LM_ERR("%sNo more memory!\n", pfncname); + end_RTP(pmsg, pcall); + delete_call(pcall); + return; + } + sprintf(pcontact->s, pcontacthdr, pcall->pmohq->mohq_uri); + pcontact->len = strlen(pcontact->s); + if(!add_lump_rpl2(pmsg, pcontact->s, pcontact->len, LUMP_RPL_HDR)) { + LM_ERR("%sUnable to add contact (%s) to call (%s)!\n", pfncname, + pcontact->s, pcall->call_from); + } + pkg_free(pcontact->s); + pcall->call_pmsg = pmsg; + if(search_hdr_ext(pmsg->require, p100rel)) { + if(!send_prov_rsp(pmsg, pcall)) { + end_RTP(pmsg, pcall); + delete_call(pcall); + return; + } + if(pcall->call_state == CLSTA_CANCEL) { + end_RTP(pmsg, pcall); + delete_call(pcall); + return; + } + } + + /********** * accept call with RTP **********/ -if (!send_rtp_answer (pmsg, pcall)) - { - if (pmod_data->psl->freply (pmsg, 500, presp_srverr) < 0) - { LM_ERR ("%sUnable to create reply!\n", pfncname); } - end_RTP (pmsg, pcall); - delete_call (pcall); - } -return; + if(!send_rtp_answer(pmsg, pcall)) { + if(pmod_data->psl->freply(pmsg, 500, presp_srverr) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + } + end_RTP(pmsg, pcall); + delete_call(pcall); + } + return; } /********** @@ -1224,120 +1149,113 @@ return; * OUTPUT: dlg_t * if successful; 0=if not **********/ -dlg_t *form_dialog (call_lst *pcall, struct to_body *pto_body) +dlg_t *form_dialog(call_lst *pcall, struct to_body *pto_body) { -/********** + /********** * get from/to values **********/ -char *pfncname = "form_dialog: "; -str pdsturi [1], ptarget [1]; -int index; -name_addr_t pname [1]; -struct to_body *ptob = &pto_body [0]; -struct to_body *pcontact = &pto_body [1]; -parse_to (pcall->call_from, - &pcall->call_from [strlen (pcall->call_from) + 1], ptob); -if (ptob->error != PARSE_OK) - { - // should never happen - LM_ERR ("%sInvalid from URI (%s)!\n", pfncname, pcall->call_from); - return 0; - } -if (ptob->param_lst) - { free_to_params (ptob); } - -/********** + char *pfncname = "form_dialog: "; + str pdsturi[1], ptarget[1]; + int index; + name_addr_t pname[1]; + struct to_body *ptob = &pto_body[0]; + struct to_body *pcontact = &pto_body[1]; + parse_to(pcall->call_from, &pcall->call_from[strlen(pcall->call_from) + 1], + ptob); + if(ptob->error != PARSE_OK) { + // should never happen + LM_ERR("%sInvalid from URI (%s)!\n", pfncname, pcall->call_from); + return 0; + } + if(ptob->param_lst) { + free_to_params(ptob); + } + + /********** * form dest URI from record route **********/ -if (!*pcall->call_route) - { pdsturi->s = 0; } -else - { - /********** + if(!*pcall->call_route) { + pdsturi->s = 0; + } else { + /********** * o find first route URI * o strip off parameter **********/ - pdsturi->s = pcall->call_route; - pdsturi->len = strlen (pcall->call_route); - if (parse_nameaddr (pdsturi, pname) < 0) - { - // should never happen - LM_ERR ("%sUnable to parse route (%s)!\n", pfncname, pcall->call_from); - return 0; - } - pdsturi->s = pname->uri.s; - pdsturi->len = pname->uri.len; - for (index = 1; index < pdsturi->len; index++) - { - if (pdsturi->s [index] == ';') - { - pdsturi->len = index; - break; - } - } - } - -/********** + pdsturi->s = pcall->call_route; + pdsturi->len = strlen(pcall->call_route); + if(parse_nameaddr(pdsturi, pname) < 0) { + // should never happen + LM_ERR("%sUnable to parse route (%s)!\n", pfncname, + pcall->call_from); + return 0; + } + pdsturi->s = pname->uri.s; + pdsturi->len = pname->uri.len; + for(index = 1; index < pdsturi->len; index++) { + if(pdsturi->s[index] == ';') { + pdsturi->len = index; + break; + } + } + } + + /********** * form target URI **********/ -if (!*pcall->call_contact) - { - ptarget->s = ptob->uri.s; - ptarget->len = ptob->uri.len; - } -else - { - parse_to (pcall->call_contact, - &pcall->call_contact [strlen (pcall->call_contact) + 1], pcontact); - if (pcontact->error != PARSE_OK) - { - // should never happen - LM_ERR ("%sInvalid contact (%s) for call (%s)!\n", pfncname, - pcall->call_contact, pcall->call_from); - return 0; - } - if (pcontact->param_lst) - { free_to_params (pcontact); } - ptarget->s = pcontact->uri.s; - ptarget->len = pcontact->uri.len; - } - -/********** + if(!*pcall->call_contact) { + ptarget->s = ptob->uri.s; + ptarget->len = ptob->uri.len; + } else { + parse_to(pcall->call_contact, + &pcall->call_contact[strlen(pcall->call_contact) + 1], + pcontact); + if(pcontact->error != PARSE_OK) { + // should never happen + LM_ERR("%sInvalid contact (%s) for call (%s)!\n", pfncname, + pcall->call_contact, pcall->call_from); + return 0; + } + if(pcontact->param_lst) { + free_to_params(pcontact); + } + ptarget->s = pcontact->uri.s; + ptarget->len = pcontact->uri.len; + } + + /********** * create dialog **********/ -dlg_t *pdlg = (dlg_t *)pkg_malloc (sizeof (dlg_t)); -if (!pdlg) - { - LM_ERR ("%sNo more memory!\n", pfncname); - return 0; - } -memset (pdlg, 0, sizeof (dlg_t)); -pdlg->loc_seq.value = pcall->call_cseq++; -pdlg->loc_seq.is_set = 1; -pdlg->id.call_id.s = pcall->call_id; -pdlg->id.call_id.len = strlen (pcall->call_id); -pdlg->id.loc_tag.s = pcall->call_tag; -pdlg->id.loc_tag.len = strlen (pcall->call_tag); -pdlg->id.rem_tag.s = ptob->tag_value.s; -pdlg->id.rem_tag.len = ptob->tag_value.len; -pdlg->rem_target.s = ptarget->s; -pdlg->rem_target.len = ptarget->len; -pdlg->loc_uri.s = pcall->pmohq->mohq_uri; -pdlg->loc_uri.len = strlen (pdlg->loc_uri.s); -pdlg->rem_uri.s = ptob->uri.s; -pdlg->rem_uri.len = ptob->uri.len; -if (pdsturi->s) - { - pdlg->dst_uri.s = pdsturi->s; - pdlg->dst_uri.len = pdsturi->len; - } -return pdlg; + dlg_t *pdlg = (dlg_t *)pkg_malloc(sizeof(dlg_t)); + if(!pdlg) { + LM_ERR("%sNo more memory!\n", pfncname); + return 0; + } + memset(pdlg, 0, sizeof(dlg_t)); + pdlg->loc_seq.value = pcall->call_cseq++; + pdlg->loc_seq.is_set = 1; + pdlg->id.call_id.s = pcall->call_id; + pdlg->id.call_id.len = strlen(pcall->call_id); + pdlg->id.loc_tag.s = pcall->call_tag; + pdlg->id.loc_tag.len = strlen(pcall->call_tag); + pdlg->id.rem_tag.s = ptob->tag_value.s; + pdlg->id.rem_tag.len = ptob->tag_value.len; + pdlg->rem_target.s = ptarget->s; + pdlg->rem_target.len = ptarget->len; + pdlg->loc_uri.s = pcall->pmohq->mohq_uri; + pdlg->loc_uri.len = strlen(pdlg->loc_uri.s); + pdlg->rem_uri.s = ptob->uri.s; + pdlg->rem_uri.len = ptob->uri.len; + if(pdsturi->s) { + pdlg->dst_uri.s = pdsturi->s; + pdlg->dst_uri.len = pdsturi->len; + } + return pdlg; } /********** @@ -1350,67 +1268,62 @@ return pdlg; * OUTPUT: 0 if failed **********/ -int form_rtp_SDP (str *pstr, call_lst *pcall, char *pSDP) +int form_rtp_SDP(str *pstr, call_lst *pcall, char *pSDP) { -/********** + /********** * o find available files * o calculate size of SDP **********/ -char *pfncname = "form_rtp_SDP: "; -rtpmap **pmohfiles = find_MOH (pcall->pmohq->mohq_mohdir, - pcall->pmohq->mohq_mohfile); -if (!pmohfiles [0]) - { - LM_ERR ("%sUnable to find any MOH files for queue (%s)!\n", pfncname, - pcall->pmohq->mohq_name); - return 0; - } -int nsize = strlen (pSDP) + 2; -int nidx; -for (nidx = 0; pmohfiles [nidx]; nidx++) - { - nsize += strlen (pmohfiles [nidx]->pencode) // encode length - + 19; // space, type number, "a=rtpmap:%d ", EOL - } - -/********** + char *pfncname = "form_rtp_SDP: "; + rtpmap **pmohfiles = + find_MOH(pcall->pmohq->mohq_mohdir, pcall->pmohq->mohq_mohfile); + if(!pmohfiles[0]) { + LM_ERR("%sUnable to find any MOH files for queue (%s)!\n", pfncname, + pcall->pmohq->mohq_name); + return 0; + } + int nsize = strlen(pSDP) + 2; + int nidx; + for(nidx = 0; pmohfiles[nidx]; nidx++) { + nsize += strlen(pmohfiles[nidx]->pencode) // encode length + + 19; // space, type number, "a=rtpmap:%d ", EOL + } + + /********** * o allocate memory * o form SDP **********/ -pstr->s = pkg_malloc (nsize + 1); -if (!pstr->s) - { - LM_ERR ("%sNo more memory!\n", pfncname); - return 0; - } -strcpy (pstr->s, pSDP); -nsize = strlen (pstr->s); -for (nidx = 0; pmohfiles [nidx]; nidx++) - { - /********** + pstr->s = pkg_malloc(nsize + 1); + if(!pstr->s) { + LM_ERR("%sNo more memory!\n", pfncname); + return 0; + } + strcpy(pstr->s, pSDP); + nsize = strlen(pstr->s); + for(nidx = 0; pmohfiles[nidx]; nidx++) { + /********** * add payload types to media description **********/ - sprintf (&pstr->s [nsize], " %d", pmohfiles [nidx]->ntype); - nsize += strlen (&pstr->s [nsize]); - } -strcpy (&pstr->s [nsize], SIPEOL); -nsize += 2; -for (nidx = 0; pmohfiles [nidx]; nidx++) - { - /********** + sprintf(&pstr->s[nsize], " %d", pmohfiles[nidx]->ntype); + nsize += strlen(&pstr->s[nsize]); + } + strcpy(&pstr->s[nsize], SIPEOL); + nsize += 2; + for(nidx = 0; pmohfiles[nidx]; nidx++) { + /********** * add rtpmap attributes **********/ - sprintf (&pstr->s [nsize], "a=rtpmap:%d %s %s", - pmohfiles [nidx]->ntype, pmohfiles [nidx]->pencode, SIPEOL); - nsize += strlen (&pstr->s [nsize]); - } -pstr->len = nsize; -return 1; + sprintf(&pstr->s[nsize], "a=rtpmap:%d %s %s", pmohfiles[nidx]->ntype, + pmohfiles[nidx]->pencode, SIPEOL); + nsize += strlen(&pstr->s[nsize]); + } + pstr->len = nsize; + return 1; } /********** @@ -1423,19 +1336,20 @@ return 1; * OUTPUT: none **********/ -static void - invite_cb (struct cell *ptrans, int ntype, struct tmcb_params *pcbp) +static void invite_cb(struct cell *ptrans, int ntype, struct tmcb_params *pcbp) { -call_lst *pcall = (call_lst *)*pcbp->param; -if (pcall->call_state >= CLSTA_INQUEUE) - { return; } -LM_ERR ("invite_cb: INVITE failed for call (%s), code=%x, callstate=%x!\n", - pcall->call_from, ntype, pcall->call_state); -if (ntype == TMCB_DESTROY) - { pcall->call_hash = pcall->call_label = 0; } -delete_call (pcall); -return; + call_lst *pcall = (call_lst *)*pcbp->param; + if(pcall->call_state >= CLSTA_INQUEUE) { + return; + } + LM_ERR("invite_cb: INVITE failed for call (%s), code=%x, callstate=%x!\n", + pcall->call_from, ntype, pcall->call_state); + if(ntype == TMCB_DESTROY) { + pcall->call_hash = pcall->call_label = 0; + } + delete_call(pcall); + return; } /********** @@ -1447,115 +1361,111 @@ return; * OUTPUT: none **********/ -void notify_msg (sip_msg_t *pmsg, call_lst *pcall) +void notify_msg(sip_msg_t *pmsg, call_lst *pcall) { -/********** + /********** * waiting on REFER? **********/ -char *pfncname = "notify_msg: "; -if (pcall->call_state != CLSTA_RFRWAIT) - { - LM_ERR ("%sNot waiting on a REFER for call (%s)!\n", pfncname, - pcall->call_from); - if (pmod_data->psl->freply (pmsg, 481, presp_nocall) < 0) - { LM_ERR ("%sUnable to create reply!\n", pfncname); } - return; - } + char *pfncname = "notify_msg: "; + if(pcall->call_state != CLSTA_RFRWAIT) { + LM_ERR("%sNot waiting on a REFER for call (%s)!\n", pfncname, + pcall->call_from); + if(pmod_data->psl->freply(pmsg, 481, presp_nocall) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + } + return; + } -/********** + /********** * o sipfrag? * o get status from body * o add CRLF so parser can go beyond first line **********/ -if (!search_hdr_ext (pmsg->content_type, psipfrag)) - { - LM_ERR ("%sNot a %s type for call (%s)!\n", pfncname, - psipfrag->s, pcall->call_from); - if (pmod_data->psl->freply (pmsg, 415, presp_unsupp) < 0) - { LM_ERR ("%sUnable to create reply!\n", pfncname); } - return; - } -char *pfrag = get_body (pmsg); -if (!pfrag) - { - LM_ERR ("%s%s body missing for call (%s)!\n", pfncname, - psipfrag->s, pcall->call_from); - if (pmod_data->psl->freply (pmsg, 415, presp_unsupp) < 0) - { LM_ERR ("%sUnable to create reply!\n", pfncname); } - return; - } -str pbody [1]; -pbody->len = pmsg->len - (int)(pfrag - pmsg->buf); -pbody->s = pkg_malloc (pbody->len + 2); -if (!pbody->s) - { - LM_ERR ("%sNo more memory!\n", pfncname); - return; - } -memcpy (pbody->s, pfrag, pbody->len); -if (pbody->s [pbody->len - 1] != '\n') - { - memcpy (&pbody->s [pbody->len], SIPEOL, 2); - pbody->len += 2; - } -struct msg_start pstart [1]; -parse_first_line (pbody->s, pbody->len + 1, pstart); -pkg_free (pbody->s); -if (pstart->type != SIP_REPLY) - { - LM_ERR ("%sReply missing for call (%s)!\n", pfncname, pcall->call_from); - if (pmod_data->psl->freply (pmsg, 415, presp_unsupp) < 0) - { LM_ERR ("%sUnable to create reply!\n", pfncname); } - return; - } - -/********** + if(!search_hdr_ext(pmsg->content_type, psipfrag)) { + LM_ERR("%sNot a %s type for call (%s)!\n", pfncname, psipfrag->s, + pcall->call_from); + if(pmod_data->psl->freply(pmsg, 415, presp_unsupp) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + } + return; + } + char *pfrag = get_body(pmsg); + if(!pfrag) { + LM_ERR("%s%s body missing for call (%s)!\n", pfncname, psipfrag->s, + pcall->call_from); + if(pmod_data->psl->freply(pmsg, 415, presp_unsupp) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + } + return; + } + str pbody[1]; + pbody->len = pmsg->len - (int)(pfrag - pmsg->buf); + pbody->s = pkg_malloc(pbody->len + 2); + if(!pbody->s) { + LM_ERR("%sNo more memory!\n", pfncname); + return; + } + memcpy(pbody->s, pfrag, pbody->len); + if(pbody->s[pbody->len - 1] != '\n') { + memcpy(&pbody->s[pbody->len], SIPEOL, 2); + pbody->len += 2; + } + struct msg_start pstart[1]; + parse_first_line(pbody->s, pbody->len + 1, pstart); + pkg_free(pbody->s); + if(pstart->type != SIP_REPLY) { + LM_ERR("%sReply missing for call (%s)!\n", pfncname, pcall->call_from); + if(pmod_data->psl->freply(pmsg, 415, presp_unsupp) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + } + return; + } + + /********** * o send OK * o REFER done? **********/ -int nreply = pstart->u.reply.statuscode; -if (pmod_data->psl->freply (pmsg, 200, presp_ok) < 0) - { - LM_ERR ("%sUnable to create reply for call (%s)!\n", - pfncname, pcall->call_from); - return; - } -mohq_debug (pcall->pmohq, "%sNOTIFY received reply (%d) for call (%s)", - pfncname, nreply, pcall->call_from); -switch (nreply / 100) - { - case 1: - pcall->refer_time = time (0); - break; - case 2: - close_call (pmsg, pcall); - break; - default: - LM_WARN ("%sUnable to redirect call (%s)\n", pfncname, pcall->call_from); - if (nreply == 487) - { - /********** + int nreply = pstart->u.reply.statuscode; + if(pmod_data->psl->freply(pmsg, 200, presp_ok) < 0) { + LM_ERR("%sUnable to create reply for call (%s)!\n", pfncname, + pcall->call_from); + return; + } + mohq_debug(pcall->pmohq, "%sNOTIFY received reply (%d) for call (%s)", + pfncname, nreply, pcall->call_from); + switch(nreply / 100) { + case 1: + pcall->refer_time = time(0); + break; + case 2: + close_call(pmsg, pcall); + break; + default: + LM_WARN("%sUnable to redirect call (%s)\n", pfncname, + pcall->call_from); + if(nreply == 487) { + /********** * call was cancelled **********/ - end_RTP (pmsg, pcall); - delete_call (pcall); - return; - } + end_RTP(pmsg, pcall); + delete_call(pcall); + return; + } - /********** + /********** * return call to queue **********/ - pcall->call_state = CLSTA_INQUEUE; - update_call_rec (pcall); - break; - } -return; + pcall->call_state = CLSTA_INQUEUE; + update_call_rec(pcall); + break; + } + return; } /********** @@ -1567,44 +1477,43 @@ return; * OUTPUT: none **********/ -void prack_msg (sip_msg_t *pmsg, call_lst *pcall) +void prack_msg(sip_msg_t *pmsg, call_lst *pcall) { -/********** + /********** * waiting on PRACK? **********/ -char *pfncname = "prack_msg: "; -tm_api_t *ptm = pmod_data->ptm; -if (pcall->call_state != CLSTA_PRACKSTRT) - { - LM_ERR ("%sUnexpected PRACK (%s)!\n", pfncname, pcall->call_from); - if (pmod_data->psl->freply (pmsg, 481, presp_nocall) < 0) - { LM_ERR ("%sUnable to create reply!\n", pfncname); } - return; - } + char *pfncname = "prack_msg: "; + tm_api_t *ptm = pmod_data->ptm; + if(pcall->call_state != CLSTA_PRACKSTRT) { + LM_ERR("%sUnexpected PRACK (%s)!\n", pfncname, pcall->call_from); + if(pmod_data->psl->freply(pmsg, 481, presp_nocall) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + } + return; + } -/********** + /********** * o check RAck ??? need to check * o accept PRACK **********/ -if (ptm->t_newtran (pmsg) < 0) - { - LM_ERR ("%sUnable to create new transaction for call (%s)!\n", - pfncname, pcall->call_from); - if (pmod_data->psl->freply (pmsg, 500, presp_srverr) < 0) - { LM_ERR ("%sUnable to create reply!\n", pfncname); } - return; - } -if (ptm->t_reply (pmsg, 200, presp_ok->s) < 0) - { - LM_ERR ("%sUnable to reply to PRACK for call (%s)!\n", - pfncname, pcall->call_from); - return; - } -pcall->call_state = CLSTA_PRACKRPLY; -return; + if(ptm->t_newtran(pmsg) < 0) { + LM_ERR("%sUnable to create new transaction for call (%s)!\n", pfncname, + pcall->call_from); + if(pmod_data->psl->freply(pmsg, 500, presp_srverr) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + } + return; + } + if(ptm->t_reply(pmsg, 200, presp_ok->s) < 0) { + LM_ERR("%sUnable to reply to PRACK for call (%s)!\n", pfncname, + pcall->call_from); + return; + } + pcall->call_state = CLSTA_PRACKRPLY; + return; } /********** @@ -1616,84 +1525,82 @@ return; * OUTPUT: 0 if failed **********/ -int refer_call (call_lst *pcall, mohq_lock *plock) +int refer_call(call_lst *pcall, mohq_lock *plock) { -/********** + /********** * create dialog **********/ -char *pfncname = "refer_call: "; -int nret = 0; -struct to_body ptob [2]; -dlg_t *pdlg = form_dialog (pcall, ptob); -if (!pdlg) - { - mohq_lock_release (plock); - return 0; - } -pdlg->state = DLG_CONFIRMED; + char *pfncname = "refer_call: "; + int nret = 0; + struct to_body ptob[2]; + dlg_t *pdlg = form_dialog(pcall, ptob); + if(!pdlg) { + mohq_lock_release(plock); + return 0; + } + pdlg->state = DLG_CONFIRMED; -/********** + /********** * form REFER message * o calculate basic size * o create buffer **********/ -str puri [1]; -puri->s = pcall->call_referto; -puri->len = strlen (puri->s); -int npos1 = sizeof (prefermsg) // REFER template - + strlen (pcall->call_via) // Via - + strlen (pcall->call_route) // Route - + strlen (pcall->pmohq->mohq_uri) // Contact - + puri->len // Refer-To - + strlen (pcall->pmohq->mohq_uri); // Referred-By -char *pbuf = pkg_malloc (npos1); -if (!pbuf) - { - LM_ERR ("%sNo more memory!\n", pfncname); - goto refererr; - } -sprintf (pbuf, prefermsg, - pcall->call_via, // Via - pcall->call_route, // Route - pcall->pmohq->mohq_uri, // Contact - puri->s, // Refer-To - pcall->pmohq->mohq_uri); // Referred-By - -/********** + str puri[1]; + puri->s = pcall->call_referto; + puri->len = strlen(puri->s); + int npos1 = sizeof(prefermsg) // REFER template + + strlen(pcall->call_via) // Via + + strlen(pcall->call_route) // Route + + strlen(pcall->pmohq->mohq_uri) // Contact + + puri->len // Refer-To + + strlen(pcall->pmohq->mohq_uri); // Referred-By + char *pbuf = pkg_malloc(npos1); + if(!pbuf) { + LM_ERR("%sNo more memory!\n", pfncname); + goto refererr; + } + sprintf(pbuf, prefermsg, + pcall->call_via, // Via + pcall->call_route, // Route + pcall->pmohq->mohq_uri, // Contact + puri->s, // Refer-To + pcall->pmohq->mohq_uri); // Referred-By + + /********** * send REFER request **********/ -tm_api_t *ptm = pmod_data->ptm; -uac_req_t puac [1]; -str phdrs [1]; -phdrs->s = pbuf; -phdrs->len = strlen (pbuf); -set_uac_req (puac, prefer, phdrs, 0, pdlg, - TMCB_LOCAL_COMPLETED | TMCB_ON_FAILURE, refer_cb, pcall); -pcall->refer_time = time (0); -pcall->call_state = CLSTA_REFER; -update_call_rec (pcall); -mohq_lock_release (plock); -if (ptm->t_request_within (puac) < 0) - { - pcall->call_state = CLSTA_INQUEUE; - LM_ERR ("%sUnable to create REFER request for call (%s)!\n", - pfncname, pcall->call_from); - update_call_rec (pcall); - goto refererr; - } -mohq_debug (pcall->pmohq, "%sSent REFER request for call (%s) to %s", - pfncname, pcall->call_from, pcall->call_referto); -nret = -1; + tm_api_t *ptm = pmod_data->ptm; + uac_req_t puac[1]; + str phdrs[1]; + phdrs->s = pbuf; + phdrs->len = strlen(pbuf); + set_uac_req(puac, prefer, phdrs, 0, pdlg, + TMCB_LOCAL_COMPLETED | TMCB_ON_FAILURE, refer_cb, pcall); + pcall->refer_time = time(0); + pcall->call_state = CLSTA_REFER; + update_call_rec(pcall); + mohq_lock_release(plock); + if(ptm->t_request_within(puac) < 0) { + pcall->call_state = CLSTA_INQUEUE; + LM_ERR("%sUnable to create REFER request for call (%s)!\n", pfncname, + pcall->call_from); + update_call_rec(pcall); + goto refererr; + } + mohq_debug(pcall->pmohq, "%sSent REFER request for call (%s) to %s", + pfncname, pcall->call_from, pcall->call_referto); + nret = -1; refererr: -if (pdlg) - { pkg_free (pdlg); } -pkg_free (pbuf); -return nret; + if(pdlg) { + pkg_free(pdlg); + } + pkg_free(pbuf); + return nret; } /********** @@ -1706,68 +1613,55 @@ return nret; * OUTPUT: none **********/ -static void refer_cb - (struct cell *ptrans, int ntype, struct tmcb_params *pcbp) +static void refer_cb(struct cell *ptrans, int ntype, struct tmcb_params *pcbp) { -char *pfncname = "refer_cb: "; -call_lst *pcall = (call_lst *)*pcbp->param; -if (pcall->call_state != CLSTA_REFER) - { - if (!pcall->call_state) - { - LM_ERR - ("%sREFER response ignored because call not in queue!\n", pfncname); - } - else - { - LM_ERR ("%sCall (%s) ignored because not in REFER state!\n", pfncname, - pcall->call_from); - } - return; - } -if ((ntype == TMCB_ON_FAILURE) || (pcbp->req == FAKED_REPLY)) - { - LM_ERR ("%sCall (%s) did not respond to REFER!\n", pfncname, - pcall->call_from); - end_RTP (pcbp->req, pcall); - delete_call (pcall); - return; - } - -/********** + char *pfncname = "refer_cb: "; + call_lst *pcall = (call_lst *)*pcbp->param; + if(pcall->call_state != CLSTA_REFER) { + if(!pcall->call_state) { + LM_ERR("%sREFER response ignored because call not in queue!\n", + pfncname); + } else { + LM_ERR("%sCall (%s) ignored because not in REFER state!\n", + pfncname, pcall->call_from); + } + return; + } + if((ntype == TMCB_ON_FAILURE) || (pcbp->req == FAKED_REPLY)) { + LM_ERR("%sCall (%s) did not respond to REFER!\n", pfncname, + pcall->call_from); + end_RTP(pcbp->req, pcall); + delete_call(pcall); + return; + } + + /********** * check reply **********/ -int nreply = pcbp->code; -if ((nreply / 100) == 2) - { - pcall->refer_time = time (0); - pcall->call_state = CLSTA_RFRWAIT; - mohq_debug (pcall->pmohq, "%sCall (%s) REFER reply=%d", - pfncname, pcall->call_from, nreply); - } -else - { - LM_ERR ("%sCall (%s) REFER error (%d)!\n", pfncname, - pcall->call_from, nreply); - if (nreply == 481) - { delete_call (pcall); } - else - { - if (!chk_rtpstat (pcbp->req)) - { - LM_ERR ("%sRTP for call (%s) no longer active!\n", - pfncname, pcall->call_from); - delete_call (pcall); - } - else - { - pcall->call_state = CLSTA_INQUEUE; - update_call_rec (pcall); - } - } - } -return; + int nreply = pcbp->code; + if((nreply / 100) == 2) { + pcall->refer_time = time(0); + pcall->call_state = CLSTA_RFRWAIT; + mohq_debug(pcall->pmohq, "%sCall (%s) REFER reply=%d", pfncname, + pcall->call_from, nreply); + } else { + LM_ERR("%sCall (%s) REFER error (%d)!\n", pfncname, pcall->call_from, + nreply); + if(nreply == 481) { + delete_call(pcall); + } else { + if(!chk_rtpstat(pcbp->req)) { + LM_ERR("%sRTP for call (%s) no longer active!\n", pfncname, + pcall->call_from); + delete_call(pcall); + } else { + pcall->call_state = CLSTA_INQUEUE; + update_call_rec(pcall); + } + } + } + return; } /********** @@ -1779,135 +1673,127 @@ return; * OUTPUT: none **********/ -void reinvite_msg (sip_msg_t *pmsg, call_lst *pcall) +void reinvite_msg(sip_msg_t *pmsg, call_lst *pcall) { -/********** + /********** * RFC 3261 section 14.2 * o dialog pending? * o get SDP **********/ -char *pfncname = "reinvite_msg: "; -if ((pcall->call_state / 100) < 2) - { - mohq_debug (pcall->pmohq, "%sINVITE still pending for call (%s)", - pfncname, pcall->call_from); - if (pmod_data->psl->freply (pmsg, 491, presp_reqpend) < 0) - { LM_ERR ("%sUnable to create reply!\n", pfncname); } - return; - } -if (!(pmsg->msg_flags & FL_SDP_BODY)) - { - if (parse_sdp (pmsg)) - { - LM_ERR ("%sre-INVITE lacks SDP (%s)!\n", pfncname, pcall->call_from); - if (pmod_data->psl->freply (pmsg, 488, presp_noaccept) < 0) - { LM_ERR ("%sUnable to create reply!\n", pfncname); } - return; - } - } - -/********** + char *pfncname = "reinvite_msg: "; + if((pcall->call_state / 100) < 2) { + mohq_debug(pcall->pmohq, "%sINVITE still pending for call (%s)", + pfncname, pcall->call_from); + if(pmod_data->psl->freply(pmsg, 491, presp_reqpend) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + } + return; + } + if(!(pmsg->msg_flags & FL_SDP_BODY)) { + if(parse_sdp(pmsg)) { + LM_ERR("%sre-INVITE lacks SDP (%s)!\n", pfncname, pcall->call_from); + if(pmod_data->psl->freply(pmsg, 488, presp_noaccept) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + } + return; + } + } + + /********** * o find available MOH files * o look for hold condition and matching payload type **********/ -rtpmap **pmohfiles = find_MOH (pcall->pmohq->mohq_mohdir, - pcall->pmohq->mohq_mohfile); -int bhold = 0; -int bmatch = 0; -int nsession; -sdp_session_cell_t *psession; -for (nsession = 0; (psession = get_sdp_session (pmsg, nsession)); nsession++) - { - int nstream; - sdp_stream_cell_t *pstream; - for (nstream = 0; (pstream = get_sdp_stream (pmsg, nsession, nstream)); - nstream++) - { - /********** + rtpmap **pmohfiles = + find_MOH(pcall->pmohq->mohq_mohdir, pcall->pmohq->mohq_mohfile); + int bhold = 0; + int bmatch = 0; + int nsession; + sdp_session_cell_t *psession; + for(nsession = 0; (psession = get_sdp_session(pmsg, nsession)); + nsession++) { + int nstream; + sdp_stream_cell_t *pstream; + for(nstream = 0; (pstream = get_sdp_stream(pmsg, nsession, nstream)); + nstream++) { + /********** * o RTP? * o audio? * o hold? * o at least one payload matches? **********/ - if (!pstream->is_rtp) - { continue; } - if (!STR_EQ (*paudio, pstream->media)) - { continue; } - if (pstream->is_on_hold) - { - bhold = 1; - break; - } - if (bmatch) - { continue; } - - /********** + if(!pstream->is_rtp) { + continue; + } + if(!STR_EQ(*paudio, pstream->media)) { + continue; + } + if(pstream->is_on_hold) { + bhold = 1; + break; + } + if(bmatch) { + continue; + } + + /********** * check payload types for a match **********/ - sdp_payload_attr_t *ppayload; - for (ppayload = pstream->payload_attr; ppayload; ppayload = ppayload->next) - { - int ntype = atoi (ppayload->rtp_payload.s); - int nidx; - for (nidx = 0; pmohfiles [nidx]; nidx++) - { - if (pmohfiles [nidx]->ntype == ntype) - { - bmatch = 1; - break; - } - } - } - } - } - -/********** + sdp_payload_attr_t *ppayload; + for(ppayload = pstream->payload_attr; ppayload; + ppayload = ppayload->next) { + int ntype = atoi(ppayload->rtp_payload.s); + int nidx; + for(nidx = 0; pmohfiles[nidx]; nidx++) { + if(pmohfiles[nidx]->ntype == ntype) { + bmatch = 1; + break; + } + } + } + } + } + + /********** * if no hold, allow re-INVITE if matching file **********/ -if (!bhold) - { - if (!bmatch) - { - LM_ERR ("%sre-INVITE refused because no matching payload for call (%s)!\n", - pfncname, pcall->call_from); - if (pmod_data->psl->freply (pmsg, 488, presp_noaccept) < 0) - { - LM_ERR ("%sUnable to create reply!\n", pfncname); - return; - } - } - else - { - mohq_debug (pcall->pmohq, "%sAccepted re-INVITE for call (%s)", - pfncname, pcall->call_from); - if (pmod_data->psl->freply (pmsg, 200, presp_ok) < 0) - { - LM_ERR ("%sUnable to create reply!\n", pfncname); - return; - } - } - return; - } - -/********** + if(!bhold) { + if(!bmatch) { + LM_ERR("%sre-INVITE refused because no matching payload for call " + "(%s)!\n", + pfncname, pcall->call_from); + if(pmod_data->psl->freply(pmsg, 488, presp_noaccept) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + return; + } + } else { + mohq_debug(pcall->pmohq, "%sAccepted re-INVITE for call (%s)", + pfncname, pcall->call_from); + if(pmod_data->psl->freply(pmsg, 200, presp_ok) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + return; + } + } + return; + } + + /********** * hold not allowed, say good-bye **********/ -LM_ERR ("%sTerminating call (%s) because hold not allowed!\n", - pfncname, pcall->call_from); -if (pmod_data->psl->freply (pmsg, 200, presp_ok) < 0) - { - LM_ERR ("%sUnable to create reply!\n", pfncname); - return; - } -close_call (pmsg, pcall); -return; + LM_ERR("%sTerminating call (%s) because hold not allowed!\n", pfncname, + pcall->call_from); + if(pmod_data->psl->freply(pmsg, 200, presp_ok) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + return; + } + close_call(pmsg, pcall); + return; } /********** @@ -1919,36 +1805,39 @@ return; * OUTPUT: 0=not found **********/ -int search_hdr_ext (struct hdr_field *phdr, str *pext) +int search_hdr_ext(struct hdr_field *phdr, str *pext) { -if (!phdr) - { return 0; } -str *pstr = &phdr->body; -int npos1, npos2; -for (npos1 = 0; npos1 < pstr->len; npos1++) - { - /********** + if(!phdr) { + return 0; + } + str *pstr = &phdr->body; + int npos1, npos2; + for(npos1 = 0; npos1 < pstr->len; npos1++) { + /********** * o find non-space * o search to end, space, semicolon or comma * o same size? * o same name? **********/ - if (pstr->s [npos1] == ' ') - { continue; } - for (npos2 = npos1++; npos1 < pstr->len; npos1++) - { - if (pstr->s [npos1] == ' ' || pstr->s [npos1] == ';' - || pstr->s [npos1] == ',') - { break; } - } - if (npos1 - npos2 != pext->len) - { continue; } - if (!strncasecmp (&pstr->s [npos2], pext->s, pext->len)) - { return 1; } - } -return 0; + if(pstr->s[npos1] == ' ') { + continue; + } + for(npos2 = npos1++; npos1 < pstr->len; npos1++) { + if(pstr->s[npos1] == ' ' || pstr->s[npos1] == ';' + || pstr->s[npos1] == ',') { + break; + } + } + if(npos1 - npos2 != pext->len) { + continue; + } + if(!strncasecmp(&pstr->s[npos2], pext->s, pext->len)) { + return 1; + } + } + return 0; } /********** @@ -1960,66 +1849,62 @@ return 0; * OUTPUT: 0=unable to process; 1=processed **********/ -int send_prov_rsp (sip_msg_t *pmsg, call_lst *pcall) +int send_prov_rsp(sip_msg_t *pmsg, call_lst *pcall) { -/********** + /********** * o send ringing response with require * o update record **********/ -char *pfncname = "send_prov_rsp: "; -tm_api_t *ptm = pmod_data->ptm; -pcall->call_cseq = rand (); -char phdrtmp [200]; -char *phdrtmplt = - "Accept-Language: en" SIPEOL - "Require: 100rel" SIPEOL - "RSeq: %d" SIPEOL - ; -sprintf (phdrtmp, phdrtmplt, pcall->call_cseq); -struct lump_rpl **phdrlump = add_lump_rpl2 (pmsg, phdrtmp, - strlen (phdrtmp), LUMP_RPL_HDR); -if (!phdrlump) - { - LM_ERR ("%sUnable to create new header for call (%s)!\n", - pfncname, pcall->call_from); - if (pmod_data->psl->freply (pmsg, 500, presp_srverr) < 0) - { LM_ERR ("%sUnable to create reply!\n", pfncname); } - return 0; - } -if (ptm->t_reply (pmsg, 180, presp_ring->s) < 0) - { - LM_ERR ("%sUnable to reply to INVITE for call (%s)!\n", - pfncname, pcall->call_from); - return 0; - } -pcall->call_state = CLSTA_PRACKSTRT; -mohq_debug (pcall->pmohq, "%sSent PRACK RINGING for call (%s)", - pfncname, pcall->call_from); - -/********** + char *pfncname = "send_prov_rsp: "; + tm_api_t *ptm = pmod_data->ptm; + pcall->call_cseq = rand(); + char phdrtmp[200]; + char *phdrtmplt = "Accept-Language: en" SIPEOL "Require: 100rel" SIPEOL + "RSeq: %d" SIPEOL; + sprintf(phdrtmp, phdrtmplt, pcall->call_cseq); + struct lump_rpl **phdrlump = + add_lump_rpl2(pmsg, phdrtmp, strlen(phdrtmp), LUMP_RPL_HDR); + if(!phdrlump) { + LM_ERR("%sUnable to create new header for call (%s)!\n", pfncname, + pcall->call_from); + if(pmod_data->psl->freply(pmsg, 500, presp_srverr) < 0) { + LM_ERR("%sUnable to create reply!\n", pfncname); + } + return 0; + } + if(ptm->t_reply(pmsg, 180, presp_ring->s) < 0) { + LM_ERR("%sUnable to reply to INVITE for call (%s)!\n", pfncname, + pcall->call_from); + return 0; + } + pcall->call_state = CLSTA_PRACKSTRT; + mohq_debug(pcall->pmohq, "%sSent PRACK RINGING for call (%s)", pfncname, + pcall->call_from); + + /********** * o wait until PRACK (64*T1 RFC 3261 section 7.1.1) * o remove header lump **********/ -time_t nstart = time (0) + 32; -while (1) - { - usleep (USLEEP_LEN); - if (pcall->call_state != CLSTA_PRACKSTRT) - { break; } - if (nstart < time (0)) - { - LM_ERR ("%sNo PRACK response for call (%s)!\n", - pfncname, pcall->call_from); - break; - } - } -unlink_lump_rpl (pmsg, *phdrlump); -if (pcall->call_state != CLSTA_PRACKRPLY) - { return 0; } -return 1; + time_t nstart = time(0) + 32; + while(1) { + usleep(USLEEP_LEN); + if(pcall->call_state != CLSTA_PRACKSTRT) { + break; + } + if(nstart < time(0)) { + LM_ERR("%sNo PRACK response for call (%s)!\n", pfncname, + pcall->call_from); + break; + } + } + unlink_lump_rpl(pmsg, *phdrlump); + if(pcall->call_state != CLSTA_PRACKRPLY) { + return 0; + } + return 1; } /********** @@ -2031,80 +1916,80 @@ return 1; * OUTPUT: 0=unable to process; 1=processed **********/ -int send_rtp_answer (sip_msg_t *pmsg, call_lst *pcall) +int send_rtp_answer(sip_msg_t *pmsg, call_lst *pcall) { -/********** + /********** * build response from request **********/ -char *pfncname = "send_rtp_answer: "; -int nret = 0; -tm_api_t *ptm = pmod_data->ptm; -struct cell *ptrans = ptm->t_gett (); -str ptotag [1]; -ptotag->s = pcall->call_tag; -ptotag->len = strlen (pcall->call_tag); -str pbuf [1]; -struct bookmark pBM [1]; -pbuf->s = build_res_buf_from_sip_req (200, presp_ok, ptotag, ptrans->uas.request, - (unsigned int *)&pbuf->len, pBM); -if (!pbuf->s || !pbuf->len) - { - LM_ERR ("%sUnable to create SDP response for call (%s)!\n", - pfncname, pcall->call_from); - return 0; - } - -/********** + char *pfncname = "send_rtp_answer: "; + int nret = 0; + tm_api_t *ptm = pmod_data->ptm; + struct cell *ptrans = ptm->t_gett(); + str ptotag[1]; + ptotag->s = pcall->call_tag; + ptotag->len = strlen(pcall->call_tag); + str pbuf[1]; + struct bookmark pBM[1]; + pbuf->s = build_res_buf_from_sip_req(200, presp_ok, ptotag, + ptrans->uas.request, (unsigned int *)&pbuf->len, pBM); + if(!pbuf->s || !pbuf->len) { + LM_ERR("%sUnable to create SDP response for call (%s)!\n", pfncname, + pcall->call_from); + return 0; + } + + /********** * parse out first line and headers **********/ -char *pclenhdr = CLENHDR; -str pparse [20]; -int npos1, npos2; -int nhdrcnt = 0; -for (npos1 = 0; npos1 < pbuf->len; npos1++) - { - /********** + char *pclenhdr = CLENHDR; + str pparse[20]; + int npos1, npos2; + int nhdrcnt = 0; + for(npos1 = 0; npos1 < pbuf->len; npos1++) { + /********** * find EOL **********/ - for (npos2 = npos1++; npos1 < pbuf->len; npos1++) - { - /********** + for(npos2 = npos1++; npos1 < pbuf->len; npos1++) { + /********** * o not EOL? (CRLF assumed) * o next line a continuation? (RFC 3261 section 7.3.1) **********/ - if (pbuf->s [npos1] != '\n') - { continue; } - if (npos1 + 1 == pbuf->len) - { break; } - if (pbuf->s [npos1 + 1] == ' ' - || pbuf->s [npos1 + 1] == '\t') - { continue; } - break; - } - - /********** + if(pbuf->s[npos1] != '\n') { + continue; + } + if(npos1 + 1 == pbuf->len) { + break; + } + if(pbuf->s[npos1 + 1] == ' ' || pbuf->s[npos1 + 1] == '\t') { + continue; + } + break; + } + + /********** * o blank is end of header (RFC 3261 section 7) * o ignore Content-Length (assume followed by colon) * o save header **********/ - if (npos1 - npos2 == 1) - { break; } - if (npos1 - npos2 > 14) - { - if (!strncasecmp (&pbuf->s [npos2], pclenhdr, 14)) - { continue; } - } - pparse [nhdrcnt].s = &pbuf->s [npos2]; - pparse [nhdrcnt++].len = npos1 - npos2 + 1; - } - -/********** + if(npos1 - npos2 == 1) { + break; + } + if(npos1 - npos2 > 14) { + if(!strncasecmp(&pbuf->s[npos2], pclenhdr, 14)) { + continue; + } + } + pparse[nhdrcnt].s = &pbuf->s[npos2]; + pparse[nhdrcnt++].len = npos1 - npos2 + 1; + } + + /********** * recreate buffer with extra headers and SDP * o form SDP * o count hdrs, extra hdrs, content-length hdr, SDP @@ -2113,167 +1998,168 @@ for (npos1 = 0; npos1 < pbuf->len; npos1++) * o replace orig buffer **********/ -str pSDP [1] = {STR_NULL}; -if (!form_rtp_SDP (pSDP, pcall, prtpsdp)) - { goto answer_done; } -for (npos1 = npos2 = 0; npos2 < nhdrcnt; npos2++) - { npos1 += pparse [npos2].len; } -char pbodylen [30]; -sprintf (pbodylen, "%s: %d\r\n\r\n", pclenhdr, pSDP->len); -npos1 += pextrahdr->len + strlen (pbodylen) + pSDP->len + 1; -char *pnewbuf = pkg_malloc (npos1); -if (!pnewbuf) - { - LM_ERR ("%sNo more memory!\n", pfncname); - goto answer_done; - } -for (npos1 = npos2 = 0; npos2 < nhdrcnt; npos2++) - { - memcpy (&pnewbuf [npos1], pparse [npos2].s, pparse [npos2].len); - npos1 += pparse [npos2].len; - } -npos2 = pextrahdr->len; -memcpy (&pnewbuf [npos1], pextrahdr->s, npos2); -npos1 += npos2; -npos2 = strlen (pbodylen); -memcpy (&pnewbuf [npos1], pbodylen, npos2); -npos1 += npos2; -npos2 = pSDP->len; -memcpy (&pnewbuf [npos1], pSDP->s, npos2); -npos1 += npos2; -pkg_free (pbuf->s); -pbuf->s = pnewbuf; -pbuf->len = npos1; - -/********** + str pSDP[1] = {STR_NULL}; + if(!form_rtp_SDP(pSDP, pcall, prtpsdp)) { + goto answer_done; + } + for(npos1 = npos2 = 0; npos2 < nhdrcnt; npos2++) { + npos1 += pparse[npos2].len; + } + char pbodylen[30]; + sprintf(pbodylen, "%s: %d\r\n\r\n", pclenhdr, pSDP->len); + npos1 += pextrahdr->len + strlen(pbodylen) + pSDP->len + 1; + char *pnewbuf = pkg_malloc(npos1); + if(!pnewbuf) { + LM_ERR("%sNo more memory!\n", pfncname); + goto answer_done; + } + for(npos1 = npos2 = 0; npos2 < nhdrcnt; npos2++) { + memcpy(&pnewbuf[npos1], pparse[npos2].s, pparse[npos2].len); + npos1 += pparse[npos2].len; + } + npos2 = pextrahdr->len; + memcpy(&pnewbuf[npos1], pextrahdr->s, npos2); + npos1 += npos2; + npos2 = strlen(pbodylen); + memcpy(&pnewbuf[npos1], pbodylen, npos2); + npos1 += npos2; + npos2 = pSDP->len; + memcpy(&pnewbuf[npos1], pSDP->s, npos2); + npos1 += npos2; + pkg_free(pbuf->s); + pbuf->s = pnewbuf; + pbuf->len = npos1; + + /********** * build SIP msg **********/ -struct sip_msg pnmsg [1]; -build_sip_msg_from_buf (pnmsg, pbuf->s, pbuf->len, 0); -memcpy (&pnmsg->rcv, &pmsg->rcv, sizeof (struct receive_info)); + struct sip_msg pnmsg[1]; + build_sip_msg_from_buf(pnmsg, pbuf->s, pbuf->len, 0); + memcpy(&pnmsg->rcv, &pmsg->rcv, sizeof(struct receive_info)); -/********** + /********** * ptime set? **********/ -int nsession; -sdp_session_cell_t *psession; -char pflagbuf [5]; -strcpy (pflagbuf, "z20"); -fparam_t zflag = {.orig="", .type=FPARAM_STRING, {.asciiz=pflagbuf}, .fixed=0}; -fparam_t *pzflag = &zflag; -for (nsession = 0; (psession = get_sdp_session (pmsg, nsession)); nsession++) - { - int nstream; - sdp_stream_cell_t *pstream; - for (nstream = 0; (pstream = get_sdp_stream (pmsg, nsession, nstream)); - nstream++) - { - /********** + int nsession; + sdp_session_cell_t *psession; + char pflagbuf[5]; + strcpy(pflagbuf, "z20"); + fparam_t zflag = {.orig = "", + .type = FPARAM_STRING, + {.asciiz = pflagbuf}, + .fixed = 0}; + fparam_t *pzflag = &zflag; + for(nsession = 0; (psession = get_sdp_session(pmsg, nsession)); + nsession++) { + int nstream; + sdp_stream_cell_t *pstream; + for(nstream = 0; (pstream = get_sdp_stream(pmsg, nsession, nstream)); + nstream++) { + /********** * ptime set? **********/ - if ((pstream->ptime.len < 1) || (pstream->ptime.len > 3)) - { continue; } - strncpy (&pzflag->v.asciiz [1], pstream->ptime.s, pstream->ptime.len); - pzflag->v.asciiz [pstream->ptime.len + 1] = 0; - mohq_debug (pcall->pmohq, - "%sSet ptime (%s) for RTP link for call (%s) from queue (%s)", - pfncname, - &pzflag->v.asciiz [1], pcall->call_from, pcall->pmohq->mohq_name); - break; - } - } - -/********** + if((pstream->ptime.len < 1) || (pstream->ptime.len > 3)) { + continue; + } + strncpy(&pzflag->v.asciiz[1], pstream->ptime.s, pstream->ptime.len); + pzflag->v.asciiz[pstream->ptime.len + 1] = 0; + mohq_debug(pcall->pmohq, + "%sSet ptime (%s) for RTP link for call (%s) from queue " + "(%s)", + pfncname, &pzflag->v.asciiz[1], pcall->call_from, + pcall->pmohq->mohq_name); + break; + } + } + + /********** * o send RTP answer * o form stream file * o send stream **********/ -mohq_debug (pcall->pmohq, "%sAnswering RTP link for call (%s)", - pfncname, pcall->call_from); -if (pmod_data->fn_rtp_answer (pnmsg, (char *) pzflag, 0) != 1) - { - LM_ERR ("%srtpproxy_answer refused for call (%s)!\n", - pfncname, pcall->call_from); - goto answer_done; - } -if (!start_stream (pnmsg, pcall, 0)) - { goto answer_done; } + mohq_debug(pcall->pmohq, "%sAnswering RTP link for call (%s)", pfncname, + pcall->call_from); + if(pmod_data->fn_rtp_answer(pnmsg, (char *)pzflag, 0) != 1) { + LM_ERR("%srtpproxy_answer refused for call (%s)!\n", pfncname, + pcall->call_from); + goto answer_done; + } + if(!start_stream(pnmsg, pcall, 0)) { + goto answer_done; + } -/********** + /********** * o create buffer from response * o find SDP **********/ -pbuf->s = build_res_buf_from_sip_res (pnmsg, (unsigned int *)&pbuf->len); -pkg_free (pnewbuf); -free_sip_msg (pnmsg); -if (!pbuf->s || !pbuf->len) - { - LM_ERR ("%sUnable to create SDP response for call (%s)!\n", - pfncname, pcall->call_from); - goto answer_done; - } -str pnewSDP [1]; -for (npos1 = 0; npos1 < pbuf->len; npos1++) - { - if (pbuf->s [npos1] != '\n') - { continue; } - if (pbuf->s [npos1 - 3] == '\r') - { break; } - } -pnewSDP->s = &pbuf->s [npos1 + 1]; -pnewSDP->len = pbuf->len - npos1 - 1; - -/********** + pbuf->s = build_res_buf_from_sip_res(pnmsg, (unsigned int *)&pbuf->len); + pkg_free(pnewbuf); + free_sip_msg(pnmsg); + if(!pbuf->s || !pbuf->len) { + LM_ERR("%sUnable to create SDP response for call (%s)!\n", pfncname, + pcall->call_from); + goto answer_done; + } + str pnewSDP[1]; + for(npos1 = 0; npos1 < pbuf->len; npos1++) { + if(pbuf->s[npos1] != '\n') { + continue; + } + if(pbuf->s[npos1 - 3] == '\r') { + break; + } + } + pnewSDP->s = &pbuf->s[npos1 + 1]; + pnewSDP->len = pbuf->len - npos1 - 1; + + /********** * o save media port number * o send adjusted reply **********/ -char *pfnd = strstr (pnewSDP->s, "m=audio "); -if (!pfnd) - { - // should not happen - LM_ERR ("%sUnable to find audio port for call (%s)!\n", - pfncname, pcall->call_from); - goto answer_done; - } -pcall->call_aport = strtol (pfnd + 8, NULL, 10); -if (!add_lump_rpl2 (pmsg, pextrahdr->s, pextrahdr->len, LUMP_RPL_HDR)) - { - LM_ERR ("%sUnable to add header for call (%s)!\n", - pfncname, pcall->call_from); - goto answer_done; - } -if (!add_lump_rpl2 (pmsg, pnewSDP->s, pnewSDP->len, LUMP_RPL_BODY)) - { - LM_ERR ("%sUnable to add SDP body for call (%s)!\n", - pfncname, pcall->call_from); - goto answer_done; - } -if (ptm->t_reply (pmsg, 200, presp_ok->s) < 0) - { - LM_ERR ("%sUnable to reply to INVITE for call (%s)!\n", - pfncname, pcall->call_from); - goto answer_done; - } -pcall->call_state = CLSTA_INVITED; -mohq_debug (pcall->pmohq, "%sResponded to INVITE with RTP for call (%s)", - pfncname, pcall->call_from); -nret = 1; - -/********** + char *pfnd = strstr(pnewSDP->s, "m=audio "); + if(!pfnd) { + // should not happen + LM_ERR("%sUnable to find audio port for call (%s)!\n", pfncname, + pcall->call_from); + goto answer_done; + } + pcall->call_aport = strtol(pfnd + 8, NULL, 10); + if(!add_lump_rpl2(pmsg, pextrahdr->s, pextrahdr->len, LUMP_RPL_HDR)) { + LM_ERR("%sUnable to add header for call (%s)!\n", pfncname, + pcall->call_from); + goto answer_done; + } + if(!add_lump_rpl2(pmsg, pnewSDP->s, pnewSDP->len, LUMP_RPL_BODY)) { + LM_ERR("%sUnable to add SDP body for call (%s)!\n", pfncname, + pcall->call_from); + goto answer_done; + } + if(ptm->t_reply(pmsg, 200, presp_ok->s) < 0) { + LM_ERR("%sUnable to reply to INVITE for call (%s)!\n", pfncname, + pcall->call_from); + goto answer_done; + } + pcall->call_state = CLSTA_INVITED; + mohq_debug(pcall->pmohq, "%sResponded to INVITE with RTP for call (%s)", + pfncname, pcall->call_from); + nret = 1; + + /********** * free buffer and return **********/ answer_done: -if (pSDP->s) - { pkg_free (pSDP->s); } -pkg_free (pbuf->s); -return nret; + if(pSDP->s) { + pkg_free(pSDP->s); + } + pkg_free(pbuf->s); + return nret; } /********** @@ -2286,34 +2172,32 @@ return nret; * OUTPUT: 0 if failed **********/ -int start_stream (sip_msg_t *pmsg, call_lst *pcall, int bserver) +int start_stream(sip_msg_t *pmsg, call_lst *pcall, int bserver) { -char *pfncname = "start_stream: "; -char pfile [MOHDIRLEN + MOHFILELEN + 2]; -strcpy (pfile, pcall->pmohq->mohq_mohdir); -int npos = strlen (pfile); -pfile [npos++] = '/'; -strcpy (&pfile [npos], pcall->pmohq->mohq_mohfile); -npos += strlen (&pfile [npos]); -str pMOH [1] = {{pfile, npos}}; -pv_elem_t *pmodel; -if (pv_parse_format (pMOH, &pmodel) < 0) - { - LM_ERR("failed to parse pv format string\n"); - return 0; - } -cmd_function fn_stream = bserver ? pmod_data->fn_rtp_stream_s - : pmod_data->fn_rtp_stream_c; -mohq_debug (pcall->pmohq, "%sStarting RTP link for call (%s)", - pfncname, pcall->call_from); -if (fn_stream (pmsg, (char *)pmodel, (char *)-1) != 1) - { - LM_ERR ("%srtpproxy_stream refused for call (%s)!\n", - pfncname, pcall->call_from); - return 0; - } -return 1; + char *pfncname = "start_stream: "; + char pfile[MOHDIRLEN + MOHFILELEN + 2]; + strcpy(pfile, pcall->pmohq->mohq_mohdir); + int npos = strlen(pfile); + pfile[npos++] = '/'; + strcpy(&pfile[npos], pcall->pmohq->mohq_mohfile); + npos += strlen(&pfile[npos]); + str pMOH[1] = {{pfile, npos}}; + pv_elem_t *pmodel; + if(pv_parse_format(pMOH, &pmodel) < 0) { + LM_ERR("failed to parse pv format string\n"); + return 0; + } + cmd_function fn_stream = + bserver ? pmod_data->fn_rtp_stream_s : pmod_data->fn_rtp_stream_c; + mohq_debug(pcall->pmohq, "%sStarting RTP link for call (%s)", pfncname, + pcall->call_from); + if(fn_stream(pmsg, (char *)pmodel, (char *)-1) != 1) { + LM_ERR("%srtpproxy_stream refused for call (%s)!\n", pfncname, + pcall->call_from); + return 0; + } + return 1; } /********** @@ -2326,21 +2210,20 @@ return 1; * OUTPUT: 0 if failed **********/ -int stop_stream (sip_msg_t *pmsg, call_lst *pcall, int bserver) +int stop_stream(sip_msg_t *pmsg, call_lst *pcall, int bserver) { -char *pfncname = "stop_stream: "; -cmd_function fn_stop = bserver ? pmod_data->fn_rtp_stop_s - : pmod_data->fn_rtp_stop_c; -mohq_debug (pcall->pmohq, "%sStopping RTP link for call (%s)", - pfncname, pcall->call_from); -if (fn_stop (pmsg, (char *)-1, (char *)-1) != 1) - { - LM_ERR ("%srtpproxy_stop refused for call (%s)!\n", - pfncname, pcall->call_from); - return 0; - } -return 1; + char *pfncname = "stop_stream: "; + cmd_function fn_stop = + bserver ? pmod_data->fn_rtp_stop_s : pmod_data->fn_rtp_stop_c; + mohq_debug(pcall->pmohq, "%sStopping RTP link for call (%s)", pfncname, + pcall->call_from); + if(fn_stop(pmsg, (char *)-1, (char *)-1) != 1) { + LM_ERR("%srtpproxy_stop refused for call (%s)!\n", pfncname, + pcall->call_from); + return 0; + } + return 1; } /********** @@ -2351,18 +2234,17 @@ return 1; * OUTPUT: char pointer; NULL if unable to allocate **********/ -char *form_tmpstr (str *pstr) +char *form_tmpstr(str *pstr) { -char *pcstr = malloc (pstr->len + 1); -if (!pcstr) - { - LM_ERR ("No more memory!\n"); - return NULL; - } -memcpy (pcstr, pstr->s, pstr->len); -pcstr [pstr->len] = 0; -return pcstr; + char *pcstr = malloc(pstr->len + 1); + if(!pcstr) { + LM_ERR("No more memory!\n"); + return NULL; + } + memcpy(pcstr, pstr->s, pstr->len); + pcstr[pstr->len] = 0; + return pcstr; } /********** @@ -2373,12 +2255,13 @@ return pcstr; * OUTPUT: none **********/ -void free_tmpstr (char *pcstr) +void free_tmpstr(char *pcstr) { -if (pcstr) - { free (pcstr); } -return; + if(pcstr) { + free(pcstr); + } + return; } /********** @@ -2394,42 +2277,42 @@ return; * OUTPUT: array of pointers for matching files; last element=0 **********/ -rtpmap **find_MOH (char *pmohdir, char *pmohfile) +rtpmap **find_MOH(char *pmohdir, char *pmohfile) { -/********** + /********** * form base file name **********/ -char pfile [MOHDIRLEN + MOHFILELEN + 6]; -strcpy (pfile, pmohdir); -int nflen = strlen (pfile); -pfile [nflen++] = '/'; -strcpy (&pfile [nflen], pmohfile); -nflen += strlen (&pfile [nflen]); -pfile [nflen++] = '.'; + char pfile[MOHDIRLEN + MOHFILELEN + 6]; + strcpy(pfile, pmohdir); + int nflen = strlen(pfile); + pfile[nflen++] = '/'; + strcpy(&pfile[nflen], pmohfile); + nflen += strlen(&pfile[nflen]); + pfile[nflen++] = '.'; -/********** + /********** * find available files based on RTP payload type **********/ -int nidx; -int nfound = 0; -for (nidx = 0; prtpmap [nidx].pencode; nidx++) - { - /********** + int nidx; + int nfound = 0; + for(nidx = 0; prtpmap[nidx].pencode; nidx++) { + /********** * o form file name based on payload type * o exists? **********/ - sprintf (&pfile [nflen], "%d", prtpmap [nidx].ntype); - struct stat psb [1]; - if (lstat (pfile, psb)) - { continue; } - pmohfiles [nfound++] = &prtpmap [nidx]; - } -pmohfiles [nfound] = 0; -return pmohfiles; + sprintf(&pfile[nflen], "%d", prtpmap[nidx].ntype); + struct stat psb[1]; + if(lstat(pfile, psb)) { + continue; + } + pmohfiles[nfound++] = &prtpmap[nidx]; + } + pmohfiles[nfound] = 0; + return pmohfiles; } /********** @@ -2445,49 +2328,47 @@ return pmohfiles; * OUTPUT: none **********/ -void mohqueue_rpc_debug (rpc_t *prpc, void *pctx) +void mohqueue_rpc_debug(rpc_t *prpc, void *pctx) { -/********** + /********** * o parm count correct? * o find queue * o lock queue **********/ -str pqname [1]; -int bdebug; -if (prpc->scan (pctx, "Sd", pqname, &bdebug) != 2) - { - prpc->fault (pctx, 400, "Too few parameters!"); - return; - } -int nq_idx = find_qname (pqname); -if (nq_idx == -1) - { - prpc->fault (pctx, 401, "No such queue (%.*s)!", STR_FMT (pqname)); - return; - } -if (!mohq_lock_set (pmod_data->pcall_lock, 0, 5000)) - { - prpc->fault - (pctx, 402, "Unable to lock the queue (%.*s)!", STR_FMT (pqname)); - return; - } - -/********** + str pqname[1]; + int bdebug; + if(prpc->scan(pctx, "Sd", pqname, &bdebug) != 2) { + prpc->fault(pctx, 400, "Too few parameters!"); + return; + } + int nq_idx = find_qname(pqname); + if(nq_idx == -1) { + prpc->fault(pctx, 401, "No such queue (%.*s)!", STR_FMT(pqname)); + return; + } + if(!mohq_lock_set(pmod_data->pcall_lock, 0, 5000)) { + prpc->fault( + pctx, 402, "Unable to lock the queue (%.*s)!", STR_FMT(pqname)); + return; + } + + /********** * o set flag * o update queue table * o release lock **********/ -mohq_lst *pqueue = &pmod_data->pmohq_lst [nq_idx]; -if (bdebug) - { pqueue->mohq_flags |= MOHQF_DBG; } -else - { pqueue->mohq_flags &= ~MOHQF_DBG; } -update_debug (pqueue, bdebug); -mohq_lock_release (pmod_data->pmohq_lock); -return; + mohq_lst *pqueue = &pmod_data->pmohq_lst[nq_idx]; + if(bdebug) { + pqueue->mohq_flags |= MOHQF_DBG; + } else { + pqueue->mohq_flags &= ~MOHQF_DBG; + } + update_debug(pqueue, bdebug); + mohq_lock_release(pmod_data->pmohq_lock); + return; } /********** @@ -2503,66 +2384,64 @@ return; * OUTPUT: none **********/ -void mohqueue_rpc_drop_call (rpc_t *prpc, void *pctx) +void mohqueue_rpc_drop_call(rpc_t *prpc, void *pctx) { -/********** + /********** * o parm count correct? * o find queue * o lock calls **********/ -str pcallid [1], pqname [1]; -if (prpc->scan (pctx, "SS", pqname, pcallid) != 2) - { - prpc->fault (pctx, 400, "Too few parameters!"); - return; - } -int nq_idx = find_qname (pqname); -if (nq_idx == -1) - { - prpc->fault (pctx, 401, "No such queue (%.*s)!", STR_FMT (pqname)); - return; - } -if (!mohq_lock_set (pmod_data->pcall_lock, 0, 5000)) - { - prpc->fault - (pctx, 402, "Unable to lock the queue (%.*s)!", STR_FMT (pqname)); - return; - } - -/********** + str pcallid[1], pqname[1]; + if(prpc->scan(pctx, "SS", pqname, pcallid) != 2) { + prpc->fault(pctx, 400, "Too few parameters!"); + return; + } + int nq_idx = find_qname(pqname); + if(nq_idx == -1) { + prpc->fault(pctx, 401, "No such queue (%.*s)!", STR_FMT(pqname)); + return; + } + if(!mohq_lock_set(pmod_data->pcall_lock, 0, 5000)) { + prpc->fault( + pctx, 402, "Unable to lock the queue (%.*s)!", STR_FMT(pqname)); + return; + } + + /********** * o find matching calls * o release lock **********/ -mohq_lst *pqueue = &pmod_data->pmohq_lst [nq_idx]; -int nidx; -for (nidx = 0; nidx < pmod_data->call_cnt; nidx++) - { - /********** + mohq_lst *pqueue = &pmod_data->pmohq_lst[nq_idx]; + int nidx; + for(nidx = 0; nidx < pmod_data->call_cnt; nidx++) { + /********** * o call active? * o callID matches? * o close call **********/ - call_lst *pcall = &pmod_data->pcall_lst [nidx]; - if (!pcall->call_state) - { continue; } - if (pqueue->mohq_id != pcall->pmohq->mohq_id) - { continue; } - str tmpstr [1]; - if (!STR_EQ (*pcallid, *pallq)) - { - tmpstr->s = pcall->call_id; - tmpstr->len = strlen (tmpstr->s); - if (!STR_EQ (*tmpstr, *pcallid)) - { continue; } - } - close_call (FAKED_REPLY, pcall); - } -mohq_lock_release (pmod_data->pcall_lock); -return; + call_lst *pcall = &pmod_data->pcall_lst[nidx]; + if(!pcall->call_state) { + continue; + } + if(pqueue->mohq_id != pcall->pmohq->mohq_id) { + continue; + } + str tmpstr[1]; + if(!STR_EQ(*pcallid, *pallq)) { + tmpstr->s = pcall->call_id; + tmpstr->len = strlen(tmpstr->s); + if(!STR_EQ(*tmpstr, *pcallid)) { + continue; + } + } + close_call(FAKED_REPLY, pcall); + } + mohq_lock_release(pmod_data->pcall_lock); + return; } /********** @@ -2575,70 +2454,66 @@ return; * OUTPUT: -1 if no items in queue; else result = count **********/ -int mohq_count (sip_msg_t *pmsg, char *pqueue, pv_spec_t *presult) +int mohq_count(sip_msg_t *pmsg, char *pqueue, pv_spec_t *presult) { -/********** + /********** * get queue and pv names **********/ -char *pfncname = "mohq_count: "; -str pqname [1]; -if (!pqueue || !presult) - { - LM_ERR ("%sParameters missing!\n", pfncname); - return -1; - } -if (fixup_get_svalue (pmsg, (gparam_p)pqueue, pqname)) - { - LM_ERR ("%sInvalid queue name!\n", pfncname); - return -1; - } + char *pfncname = "mohq_count: "; + str pqname[1]; + if(!pqueue || !presult) { + LM_ERR("%sParameters missing!\n", pfncname); + return -1; + } + if(fixup_get_svalue(pmsg, (gparam_p)pqueue, pqname)) { + LM_ERR("%sInvalid queue name!\n", pfncname); + return -1; + } -/********** + /********** * o find queue * o lock calls * o count items in queue **********/ -int nq_idx = find_qname (pqname); -int ncount = 0; -call_lst *pcalls = pmod_data->pcall_lst; -int ncall_idx, mohq_id; -if (!mohq_lock_set (pmod_data->pcall_lock, 0, 200)) - { LM_ERR ("%sUnable to lock calls!\n", pfncname); } -else - { - if (nq_idx != -1) - { - mohq_id = pmod_data->pmohq_lst [nq_idx].mohq_id; - for (ncall_idx = 0; ncall_idx < pmod_data->call_cnt; ncall_idx++) - { - if (!pcalls [ncall_idx].call_state) - { continue; } - if (pcalls [ncall_idx].pmohq->mohq_id == mohq_id - && pcalls [ncall_idx].call_state == CLSTA_INQUEUE) - { ncount++; } - } - } - mohq_lock_release (pmod_data->pcall_lock); - } - -/********** + int nq_idx = find_qname(pqname); + int ncount = 0; + call_lst *pcalls = pmod_data->pcall_lst; + int ncall_idx, mohq_id; + if(!mohq_lock_set(pmod_data->pcall_lock, 0, 200)) { + LM_ERR("%sUnable to lock calls!\n", pfncname); + } else { + if(nq_idx != -1) { + mohq_id = pmod_data->pmohq_lst[nq_idx].mohq_id; + for(ncall_idx = 0; ncall_idx < pmod_data->call_cnt; ncall_idx++) { + if(!pcalls[ncall_idx].call_state) { + continue; + } + if(pcalls[ncall_idx].pmohq->mohq_id == mohq_id + && pcalls[ncall_idx].call_state == CLSTA_INQUEUE) { + ncount++; + } + } + } + mohq_lock_release(pmod_data->pcall_lock); + } + + /********** * o set pv result * o exit with result **********/ -pv_value_t pavp_val [1]; -memset (pavp_val, 0, sizeof (pv_value_t)); -pavp_val->ri = ncount; -pavp_val->flags = PV_TYPE_INT | PV_VAL_INT; -if (presult->setf (pmsg, &presult->pvp, (int)EQ_T, pavp_val) < 0) - { - LM_ERR ("%sUnable to set pv value for mohq_count ()!\n", pfncname); - return -1; - } -return 1; + pv_value_t pavp_val[1]; + memset(pavp_val, 0, sizeof(pv_value_t)); + pavp_val->ri = ncount; + pavp_val->flags = PV_TYPE_INT | PV_VAL_INT; + if(presult->setf(pmsg, &presult->pvp, (int)EQ_T, pavp_val) < 0) { + LM_ERR("%sUnable to set pv value for mohq_count ()!\n", pfncname); + return -1; + } + return 1; } /********** @@ -2651,10 +2526,10 @@ return 1; * OUTPUT: outputs debugging values **********/ -void mohq_debug (mohq_lst *pmohq, char *pfmt, ...) +void mohq_debug(mohq_lst *pmohq, char *pfmt, ...) { -/********** + /********** * o get system and MOHQ log level * o exit if no debug printing * o force local debug @@ -2662,21 +2537,24 @@ void mohq_debug (mohq_lst *pmohq, char *pfmt, ...) * o reset log level **********/ -int nsys_log = get_debug_level (LOG_MNAME, LOG_MNAME_LEN); -int nmohq_log = (pmohq->mohq_flags & MOHQF_DBG) ? L_DBG : L_INFO; -if (nmohq_log < L_DBG && nsys_log < L_DBG) - { return; } -if (nsys_log < nmohq_log) - { set_local_debug_level (nmohq_log); } -char ptext [1024]; -va_list ap; -va_start (ap, pfmt); -vsnprintf (ptext, sizeof (ptext), pfmt, ap); -va_end (ap); -LM_DBG ("%s\n", ptext); -if (nsys_log < nmohq_log) - { reset_local_debug_level (); } -return; + int nsys_log = get_debug_level(LOG_MNAME, LOG_MNAME_LEN); + int nmohq_log = (pmohq->mohq_flags & MOHQF_DBG) ? L_DBG : L_INFO; + if(nmohq_log < L_DBG && nsys_log < L_DBG) { + return; + } + if(nsys_log < nmohq_log) { + set_local_debug_level(nmohq_log); + } + char ptext[1024]; + va_list ap; + va_start(ap, pfmt); + vsnprintf(ptext, sizeof(ptext), pfmt, ap); + va_end(ap); + LM_DBG("%s\n", ptext); + if(nsys_log < nmohq_log) { + reset_local_debug_level(); + } + return; } /********** @@ -2687,40 +2565,36 @@ return; * OUTPUT: -1=not directed to queue or other error; 1=processed **********/ -int mohq_process (sip_msg_t *pmsg) +int mohq_process(sip_msg_t *pmsg) { -/********** + /********** * read lock queue and check for updates **********/ -char *pfncname = "mohq_process: "; -if (!mohq_lock_set (pmod_data->pmohq_lock, 0, 500)) - { - LM_ERR ("%sUnable to read lock queue!\n", pfncname); - return -1; - } -db1_con_t *pconn = mohq_dbconnect (); -if (pconn) - { - /********** + char *pfncname = "mohq_process: "; + if(!mohq_lock_set(pmod_data->pmohq_lock, 0, 500)) { + LM_ERR("%sUnable to read lock queue!\n", pfncname); + return -1; + } + db1_con_t *pconn = mohq_dbconnect(); + if(pconn) { + /********** * o last update older than 1 minute? * o update write locked queue **********/ - if (pmod_data->mohq_update + 60 < time (0)) - { - if (mohq_lock_change (pmod_data->pmohq_lock, 1)) - { - update_mohq_lst (pconn); - mohq_lock_change (pmod_data->pmohq_lock, 0); - pmod_data->mohq_update = time (0); - } - } - mohq_dbdisconnect (pconn); - } - -/********** + if(pmod_data->mohq_update + 60 < time(0)) { + if(mohq_lock_change(pmod_data->pmohq_lock, 1)) { + update_mohq_lst(pconn); + mohq_lock_change(pmod_data->pmohq_lock, 0); + pmod_data->mohq_update = time(0); + } + } + mohq_dbdisconnect(pconn); + } + + /********** * o parse headers * o directed to message queue? * o write lock calls @@ -2728,78 +2602,74 @@ if (pconn) * o release call lock **********/ -if (parse_headers (pmsg, HDR_EOH_F, 0) < 0) - { - mohq_lock_release (pmod_data->pmohq_lock); - LM_ERR ("%sUnable to parse header!\n", pfncname); - return -1; - } -int mohq_idx = find_queue (pmsg); -if (mohq_idx < 0) - { - mohq_lock_release (pmod_data->pmohq_lock); - return -1; - } -if (!mohq_lock_set (pmod_data->pcall_lock, 1, 500)) - { - mohq_lock_release (pmod_data->pmohq_lock); - LM_ERR ("%sUnable to write lock calls!\n", pfncname); - return 1; - } -call_lst *pcall = find_call (pmsg, mohq_idx); -mohq_lock_release (pmod_data->pcall_lock); -if (!pcall) - { - mohq_lock_release (pmod_data->pmohq_lock); - return 1; - } - -/********** + if(parse_headers(pmsg, HDR_EOH_F, 0) < 0) { + mohq_lock_release(pmod_data->pmohq_lock); + LM_ERR("%sUnable to parse header!\n", pfncname); + return -1; + } + int mohq_idx = find_queue(pmsg); + if(mohq_idx < 0) { + mohq_lock_release(pmod_data->pmohq_lock); + return -1; + } + if(!mohq_lock_set(pmod_data->pcall_lock, 1, 500)) { + mohq_lock_release(pmod_data->pmohq_lock); + LM_ERR("%sUnable to write lock calls!\n", pfncname); + return 1; + } + call_lst *pcall = find_call(pmsg, mohq_idx); + mohq_lock_release(pmod_data->pcall_lock); + if(!pcall) { + mohq_lock_release(pmod_data->pmohq_lock); + return 1; + } + + /********** * o process message * o release queue lock **********/ -mohq_debug (&pmod_data->pmohq_lst [mohq_idx], - "%sProcessing %.*s, queue (%s)", pfncname, - STR_FMT (&REQ_LINE (pmsg).method), - pmod_data->pmohq_lst [mohq_idx].mohq_name); -str *ptotag; -switch (pmsg->REQ_METHOD) - { - case METHOD_INVITE: - /********** + mohq_debug(&pmod_data->pmohq_lst[mohq_idx], "%sProcessing %.*s, queue (%s)", + pfncname, STR_FMT(&REQ_LINE(pmsg).method), + pmod_data->pmohq_lst[mohq_idx].mohq_name); + str *ptotag; + switch(pmsg->REQ_METHOD) { + case METHOD_INVITE: + /********** * initial INVITE? **********/ - ptotag = &(get_to (pmsg)->tag_value); - if (!ptotag->len) - { ptotag = 0; } - if (!ptotag) - { first_invite_msg (pmsg, pcall); } - else - { reinvite_msg (pmsg, pcall); } - break; - case METHOD_NOTIFY: - notify_msg (pmsg, pcall); - break; - case METHOD_PRACK: - prack_msg (pmsg, pcall); - break; - case METHOD_ACK: - ack_msg (pmsg, pcall); - break; - case METHOD_BYE: - bye_msg (pmsg, pcall); - break; - case METHOD_CANCEL: - cancel_msg (pmsg, pcall); - break; - default: - deny_method (pmsg, pcall); - break; - } -mohq_lock_release (pmod_data->pmohq_lock); -return 1; + ptotag = &(get_to(pmsg)->tag_value); + if(!ptotag->len) { + ptotag = 0; + } + if(!ptotag) { + first_invite_msg(pmsg, pcall); + } else { + reinvite_msg(pmsg, pcall); + } + break; + case METHOD_NOTIFY: + notify_msg(pmsg, pcall); + break; + case METHOD_PRACK: + prack_msg(pmsg, pcall); + break; + case METHOD_ACK: + ack_msg(pmsg, pcall); + break; + case METHOD_BYE: + bye_msg(pmsg, pcall); + break; + case METHOD_CANCEL: + cancel_msg(pmsg, pcall); + break; + default: + deny_method(pmsg, pcall); + break; + } + mohq_lock_release(pmod_data->pmohq_lock); + return 1; } /********** @@ -2812,65 +2682,59 @@ return 1; * OUTPUT: -1 if no items in queue or error; 1 redirects oldest call **********/ -int mohq_retrieve (sip_msg_t *pmsg, char *pqueue, char *pURI) +int mohq_retrieve(sip_msg_t *pmsg, char *pqueue, char *pURI) { -/********** + /********** * o get queue name and URI * o check URI **********/ -char *pfncname = "mohq_retrieve: "; -str puri [1], pqname [1]; -if (!pqueue || !pURI) - { - LM_ERR ("%sParameters missing!\n", pfncname); - return -1; - } -if (fixup_get_svalue (pmsg, (gparam_p)pqueue, pqname)) - { - LM_ERR ("%sInvalid queue name!\n", pfncname); - return -1; - } -if (fixup_get_svalue (pmsg, (gparam_p)pURI, puri)) - { - LM_ERR ("%sInvalid URI!\n", pfncname); - return -1; - } -if (puri->len > URI_LEN) - { - LM_ERR ("%sURI too long!\n", pfncname); - return -1; - } -struct sip_uri puri_parsed [1]; -if (parse_uri (puri->s, puri->len, puri_parsed)) - { - LM_ERR ("%sInvalid URI (%.*s)!\n", pfncname, STR_FMT (puri)); - return -1; - } - -/********** + char *pfncname = "mohq_retrieve: "; + str puri[1], pqname[1]; + if(!pqueue || !pURI) { + LM_ERR("%sParameters missing!\n", pfncname); + return -1; + } + if(fixup_get_svalue(pmsg, (gparam_p)pqueue, pqname)) { + LM_ERR("%sInvalid queue name!\n", pfncname); + return -1; + } + if(fixup_get_svalue(pmsg, (gparam_p)pURI, puri)) { + LM_ERR("%sInvalid URI!\n", pfncname); + return -1; + } + if(puri->len > URI_LEN) { + LM_ERR("%sURI too long!\n", pfncname); + return -1; + } + struct sip_uri puri_parsed[1]; + if(parse_uri(puri->s, puri->len, puri_parsed)) { + LM_ERR("%sInvalid URI (%.*s)!\n", pfncname, STR_FMT(puri)); + return -1; + } + + /********** * o find queue * o lock calls * o find oldest call **********/ -int nq_idx = find_qname (pqname); -if (nq_idx == -1) - { return -1; } -if (!mohq_lock_set (pmod_data->pcall_lock, 0, 200)) - { - LM_ERR ("%sUnable to lock calls!\n", pfncname); - return -1; - } -call_lst *pcall = 0; -int ncall_idx; -time_t ntime = 0; -int nfound = -1; -int mohq_id = pmod_data->pmohq_lst [nq_idx].mohq_id; -for (ncall_idx = 0; ncall_idx < pmod_data->call_cnt; ncall_idx++) - { - /********** + int nq_idx = find_qname(pqname); + if(nq_idx == -1) { + return -1; + } + if(!mohq_lock_set(pmod_data->pcall_lock, 0, 200)) { + LM_ERR("%sUnable to lock calls!\n", pfncname); + return -1; + } + call_lst *pcall = 0; + int ncall_idx; + time_t ntime = 0; + int nfound = -1; + int mohq_id = pmod_data->pmohq_lst[nq_idx].mohq_id; + for(ncall_idx = 0; ncall_idx < pmod_data->call_cnt; ncall_idx++) { + /********** * o active call? * o matching queue? * o refer stuck? @@ -2878,57 +2742,54 @@ for (ncall_idx = 0; ncall_idx < pmod_data->call_cnt; ncall_idx++) * o check age **********/ - pcall = &pmod_data->pcall_lst [ncall_idx]; - if (!pcall->call_state) - { continue; } - if (pcall->pmohq->mohq_id != mohq_id) - { continue; } - if ((pcall->call_state == CLSTA_REFER) - || (pcall->call_state == CLSTA_RFRWAIT)) - { - if ((pcall->refer_time + 32) < time (0)) - { - LM_ERR - ("%sDropping call because no response to REFER for call (%s)!\n", - pfncname, pcall->call_from); - close_call (FAKED_REPLY, pcall); - } - } - if (pcall->call_state != CLSTA_INQUEUE) - { continue; } - if (!ntime) - { - nfound = ncall_idx; - ntime = pcall->call_time; - } - else - { - if (pcall->call_time < ntime) - { - nfound = ncall_idx; - ntime = pcall->call_time; - } - } - } -if (nfound == -1) - { - LM_WARN ("%sNo calls in queue (%.*s)\n", pfncname, STR_FMT (pqname)); - mohq_lock_release (pmod_data->pcall_lock); - return -1; - } -pcall = &pmod_data->pcall_lst [nfound]; - -/********** + pcall = &pmod_data->pcall_lst[ncall_idx]; + if(!pcall->call_state) { + continue; + } + if(pcall->pmohq->mohq_id != mohq_id) { + continue; + } + if((pcall->call_state == CLSTA_REFER) + || (pcall->call_state == CLSTA_RFRWAIT)) { + if((pcall->refer_time + 32) < time(0)) { + LM_ERR("%sDropping call because no response to REFER for call " + "(%s)!\n", + pfncname, pcall->call_from); + close_call(FAKED_REPLY, pcall); + } + } + if(pcall->call_state != CLSTA_INQUEUE) { + continue; + } + if(!ntime) { + nfound = ncall_idx; + ntime = pcall->call_time; + } else { + if(pcall->call_time < ntime) { + nfound = ncall_idx; + ntime = pcall->call_time; + } + } + } + if(nfound == -1) { + LM_WARN("%sNo calls in queue (%.*s)\n", pfncname, STR_FMT(pqname)); + mohq_lock_release(pmod_data->pcall_lock); + return -1; + } + pcall = &pmod_data->pcall_lst[nfound]; + + /********** * o save refer-to URI * o send refer **********/ -strncpy (pcall->call_referto, puri->s, puri->len); -pcall->call_referto [puri->len] = '\0'; -if (refer_call (pcall, pmod_data->pcall_lock)) - { return 1; } -LM_ERR ("%sUnable to refer call (%s)!\n", pfncname, pcall->call_from); -return -1; + strncpy(pcall->call_referto, puri->s, puri->len); + pcall->call_referto[puri->len] = '\0'; + if(refer_call(pcall, pmod_data->pcall_lock)) { + return 1; + } + LM_ERR("%sUnable to refer call (%s)!\n", pfncname, pcall->call_from); + return -1; } /********** @@ -2940,65 +2801,61 @@ return -1; * OUTPUT: -1 if no items in queue; 1 if successfull **********/ -int mohq_send (sip_msg_t *pmsg, char *pqueue) +int mohq_send(sip_msg_t *pmsg, char *pqueue) { -/********** + /********** * o first INVITE? * o get queue name **********/ -char *pfncname = "mohq_send: "; -if (pmsg->REQ_METHOD != METHOD_INVITE) - { - LM_ERR ("%sNot an INVITE message!\n", pfncname); - return -1; - } -to_body_t *pto_body = get_to (pmsg); -if (pto_body->tag_value.len) - { - LM_ERR ("%sNot a first INVITE message!\n", pfncname); - return -1; - } -str pqname [1]; -if (!pqueue) - { - LM_ERR ("%sParameters missing!\n", pfncname); - return -1; - } -if (fixup_get_svalue (pmsg, (gparam_p)pqueue, pqname)) - { - LM_ERR ("%sInvalid queue name!\n", pfncname); - return -1; - } - -/********** + char *pfncname = "mohq_send: "; + if(pmsg->REQ_METHOD != METHOD_INVITE) { + LM_ERR("%sNot an INVITE message!\n", pfncname); + return -1; + } + to_body_t *pto_body = get_to(pmsg); + if(pto_body->tag_value.len) { + LM_ERR("%sNot a first INVITE message!\n", pfncname); + return -1; + } + str pqname[1]; + if(!pqueue) { + LM_ERR("%sParameters missing!\n", pfncname); + return -1; + } + if(fixup_get_svalue(pmsg, (gparam_p)pqueue, pqname)) { + LM_ERR("%sInvalid queue name!\n", pfncname); + return -1; + } + + /********** * o find queue * o change RURI * o relay message **********/ -int nq_idx = find_qname (pqname); -if (nq_idx == -1) - { return -1; } -str pruri [1] = {{0, strlen (pmod_data->pmohq_lst [nq_idx].mohq_uri)}}; -pruri->s = pkg_malloc (pruri->len + 1); -if (!pruri->s) - { - LM_ERR ("%sNo more memory!\n", pfncname); - return -1; - } -strcpy (pruri->s, pmod_data->pmohq_lst [nq_idx].mohq_uri); -if (pmsg->new_uri.s) - { pkg_free (pmsg->new_uri.s); } -pmsg->new_uri.s = pruri->s; -pmsg->new_uri.len = pruri->len; -pmsg->parsed_uri_ok = 0; -pmsg->parsed_orig_ruri_ok = 0; -if (pmod_data->ptm->t_relay (pmsg, 0, 0) < 0) - { - LM_ERR ("%sUnable to relay INVITE!\n", pfncname); - return -1; - } -return 1; + int nq_idx = find_qname(pqname); + if(nq_idx == -1) { + return -1; + } + str pruri[1] = {{0, strlen(pmod_data->pmohq_lst[nq_idx].mohq_uri)}}; + pruri->s = pkg_malloc(pruri->len + 1); + if(!pruri->s) { + LM_ERR("%sNo more memory!\n", pfncname); + return -1; + } + strcpy(pruri->s, pmod_data->pmohq_lst[nq_idx].mohq_uri); + if(pmsg->new_uri.s) { + pkg_free(pmsg->new_uri.s); + } + pmsg->new_uri.s = pruri->s; + pmsg->new_uri.len = pruri->len; + pmsg->parsed_uri_ok = 0; + pmsg->parsed_orig_ruri_ok = 0; + if(pmod_data->ptm->t_relay(pmsg, 0, 0) < 0) { + LM_ERR("%sUnable to relay INVITE!\n", pfncname); + return -1; + } + return 1; } \ No newline at end of file diff --git a/src/modules/mohqueue/mohq_funcs.h b/src/modules/mohqueue/mohq_funcs.h index 35d55edaa05..6a0ba6d167a 100644 --- a/src/modules/mohqueue/mohq_funcs.h +++ b/src/modules/mohqueue/mohq_funcs.h @@ -26,13 +26,13 @@ * module function declarations **********/ -rtpmap **find_MOH (char *, char *); -int mohq_count (sip_msg_t *, char *, pv_spec_t *); -void mohq_debug (mohq_lst *, char *, ...); -int mohq_process (sip_msg_t *); -int mohq_retrieve (sip_msg_t *, char *, char *); -void mohqueue_rpc_debug (rpc_t *, void *); -void mohqueue_rpc_drop_call (rpc_t *, void *); -int mohq_send (sip_msg_t *, char *); +rtpmap **find_MOH(char *, char *); +int mohq_count(sip_msg_t *, char *, pv_spec_t *); +void mohq_debug(mohq_lst *, char *, ...); +int mohq_process(sip_msg_t *); +int mohq_retrieve(sip_msg_t *, char *, char *); +void mohqueue_rpc_debug(rpc_t *, void *); +void mohqueue_rpc_drop_call(rpc_t *, void *); +int mohq_send(sip_msg_t *, char *); #endif /* MOHQ_FUNCS_H */ \ No newline at end of file diff --git a/src/modules/mohqueue/mohq_locks.c b/src/modules/mohqueue/mohq_locks.c index b31e052cb8a..018bc792cfc 100644 --- a/src/modules/mohqueue/mohq_locks.c +++ b/src/modules/mohqueue/mohq_locks.c @@ -35,35 +35,30 @@ * OUTPUT: 0 if failed **********/ -int mohq_lock_change (mohq_lock *plock, int bexcl) +int mohq_lock_change(mohq_lock *plock, int bexcl) { -/********** + /********** * o lock memory * o check set type * o unlock memory **********/ -int nret = 0; -lock_get (plock->plock); -if (bexcl) - { - if (plock->lock_cnt == 1) - { - plock->lock_cnt = -1; - nret = 1; - } - } -else - { - if (plock->lock_cnt == -1) - { - plock->lock_cnt = 1; - nret = 1; - } - } -lock_release (plock->plock); -return nret; + int nret = 0; + lock_get(plock->plock); + if(bexcl) { + if(plock->lock_cnt == 1) { + plock->lock_cnt = -1; + nret = 1; + } + } else { + if(plock->lock_cnt == -1) { + plock->lock_cnt = 1; + nret = 1; + } + } + lock_release(plock->plock); + return nret; } /********** @@ -74,12 +69,12 @@ return nret; * OUTPUT: none **********/ -void mohq_lock_destroy (mohq_lock *plock) +void mohq_lock_destroy(mohq_lock *plock) { -lock_destroy (plock->plock); -lock_dealloc (plock->plock); -return; + lock_destroy(plock->plock); + lock_dealloc(plock->plock); + return; } /********** @@ -90,28 +85,26 @@ return; * OUTPUT: 0 if failed **********/ -int mohq_lock_init (mohq_lock *plock) +int mohq_lock_init(mohq_lock *plock) { -/********** + /********** * alloc memory and initialize **********/ -char *pfncname = "mohq_lock_init: "; -plock->plock = lock_alloc (); -if (!plock->plock) - { - LM_ERR ("%sUnable to allocate lock memory!\n", pfncname); - return 0; - } -if (!lock_init (plock->plock)) - { - LM_ERR ("%sUnable to init lock!\n", pfncname); - lock_dealloc (plock->plock); - return 0; - } -plock->lock_cnt = 0; -return -1; + char *pfncname = "mohq_lock_init: "; + plock->plock = lock_alloc(); + if(!plock->plock) { + LM_ERR("%sUnable to allocate lock memory!\n", pfncname); + return 0; + } + if(!lock_init(plock->plock)) { + LM_ERR("%sUnable to init lock!\n", pfncname); + lock_dealloc(plock->plock); + return 0; + } + plock->lock_cnt = 0; + return -1; } /********** @@ -122,30 +115,29 @@ return -1; * OUTPUT: none **********/ -void mohq_lock_release (mohq_lock *plock) +void mohq_lock_release(mohq_lock *plock) { -/********** + /********** * o lock memory * o reduce count * o unlock memory **********/ -lock_get (plock->plock); -switch (plock->lock_cnt) - { - case -1: - plock->lock_cnt = 0; - break; - case 0: - LM_WARN ("mohq_lock_release: Lock was not set.\n"); - break; - default: - plock->lock_cnt--; - break; - } -lock_release (plock->plock); -return; + lock_get(plock->plock); + switch(plock->lock_cnt) { + case -1: + plock->lock_cnt = 0; + break; + case 0: + LM_WARN("mohq_lock_release: Lock was not set.\n"); + break; + default: + plock->lock_cnt--; + break; + } + lock_release(plock->plock); + return; } /********** @@ -158,40 +150,34 @@ return; * OUTPUT: 0 if failed **********/ -int mohq_lock_set (mohq_lock *plock, int bexcl, int nms_cnt) +int mohq_lock_set(mohq_lock *plock, int bexcl, int nms_cnt) { -int nret = 0; -do - { - /********** + int nret = 0; + do { + /********** * o lock memory * o check set type * o unlock memory * o sleep if failed **********/ - lock_get (plock->plock); - if (bexcl) - { - if (!plock->lock_cnt) - { - plock->lock_cnt = -1; - nret = 1; - } - } - else - { - if (plock->lock_cnt != -1) - { - plock->lock_cnt++; - nret = 1; - } - } - lock_release (plock->plock); - if (!nret) - { usleep (1); } - } -while (!nret && --nms_cnt >= 0); -return nret; + lock_get(plock->plock); + if(bexcl) { + if(!plock->lock_cnt) { + plock->lock_cnt = -1; + nret = 1; + } + } else { + if(plock->lock_cnt != -1) { + plock->lock_cnt++; + nret = 1; + } + } + lock_release(plock->plock); + if(!nret) { + usleep(1); + } + } while(!nret && --nms_cnt >= 0); + return nret; } \ No newline at end of file diff --git a/src/modules/mohqueue/mohq_locks.h b/src/modules/mohqueue/mohq_locks.h index 20deed8b029..5a16b7b3f89 100644 --- a/src/modules/mohqueue/mohq_locks.h +++ b/src/modules/mohqueue/mohq_locks.h @@ -27,19 +27,19 @@ **********/ typedef struct - { - gen_lock_t *plock; - int lock_cnt; - } mohq_lock; +{ + gen_lock_t *plock; + int lock_cnt; +} mohq_lock; /********** * function declarations **********/ -int mohq_lock_change (mohq_lock *, int); -void mohq_lock_destroy (mohq_lock *); -int mohq_lock_init (mohq_lock *); -void mohq_lock_release (mohq_lock *); -int mohq_lock_set (mohq_lock *, int, int); +int mohq_lock_change(mohq_lock *, int); +void mohq_lock_destroy(mohq_lock *); +int mohq_lock_init(mohq_lock *); +void mohq_lock_release(mohq_lock *); +int mohq_lock_set(mohq_lock *, int, int); #endif /* MOHQ_LOCKS_H */ \ No newline at end of file diff --git a/src/modules/mohqueue/mohqueue_mod.c b/src/modules/mohqueue/mohqueue_mod.c index 8a17dfc45e7..6e0c4497603 100644 --- a/src/modules/mohqueue/mohqueue_mod.c +++ b/src/modules/mohqueue/mohqueue_mod.c @@ -32,10 +32,10 @@ MODULE_VERSION * local function declarations **********/ -int fixup_count (void **, int); -static int mod_child_init (int); -static void mod_destroy (void); -static int mod_init (void); +int fixup_count(void **, int); +static int mod_child_init(int); +static void mod_destroy(void); +static int mod_init(void); /********** * global varbs @@ -49,72 +49,67 @@ pv_spec_t *prtp_pv; **********/ /* COMMANDS */ -static cmd_export_t mod_cmds [] = { - { "mohq_count", (cmd_function) mohq_count, 2, fixup_count, 0, - REQUEST_ROUTE | FAILURE_ROUTE | ONREPLY_ROUTE }, - { "mohq_process", (cmd_function) mohq_process, 0, NULL, 0, REQUEST_ROUTE }, - { "mohq_retrieve", (cmd_function) mohq_retrieve, 2, fixup_spve_spve, 0, - REQUEST_ROUTE | FAILURE_ROUTE | ONREPLY_ROUTE }, - { "mohq_send", (cmd_function) mohq_send, 1, fixup_spve_spve, 0, REQUEST_ROUTE }, - { NULL, NULL, -1, 0, 0 }, +static cmd_export_t mod_cmds[] = { + {"mohq_count", (cmd_function)mohq_count, 2, fixup_count, 0, + REQUEST_ROUTE | FAILURE_ROUTE | ONREPLY_ROUTE}, + {"mohq_process", (cmd_function)mohq_process, 0, NULL, 0, REQUEST_ROUTE}, + {"mohq_retrieve", (cmd_function)mohq_retrieve, 2, fixup_spve_spve, 0, + REQUEST_ROUTE | FAILURE_ROUTE | ONREPLY_ROUTE}, + {"mohq_send", (cmd_function)mohq_send, 1, fixup_spve_spve, 0, + REQUEST_ROUTE}, + {NULL, NULL, -1, 0, 0}, }; /* PARAMETERS */ -str db_url = str_init (DEFAULT_DB_URL); -str db_ctable = str_init ("mohqcalls"); -str db_qtable = str_init ("mohqueues"); +str db_url = str_init(DEFAULT_DB_URL); +str db_ctable = str_init("mohqcalls"); +str db_qtable = str_init("mohqueues"); char *mohdir = ""; int moh_maxcalls = 50; -static param_export_t mod_parms [] = { - { "db_url", PARAM_STR, &db_url }, - { "db_ctable", PARAM_STR, &db_ctable }, - { "db_qtable", PARAM_STR, &db_qtable }, - { "mohdir", PARAM_STRING, &mohdir }, - { "moh_maxcalls", INT_PARAM, &moh_maxcalls }, - { NULL, 0, NULL }, +static param_export_t mod_parms[] = { + {"db_url", PARAM_STR, &db_url}, + {"db_ctable", PARAM_STR, &db_ctable}, + {"db_qtable", PARAM_STR, &db_qtable}, + {"mohdir", PARAM_STRING, &mohdir}, + {"moh_maxcalls", INT_PARAM, &moh_maxcalls}, + {NULL, 0, NULL}, }; -static const char *mohqueue_rpc_debug_doc [] = - { - "Toggle mohqueue debug mode. Parameters: queue name, state (0=off, <>0=on)", - 0 - }; +static const char *mohqueue_rpc_debug_doc[] = { + "Toggle mohqueue debug mode. Parameters: queue name, state (0=off, " + "<>0=on)", + 0}; -static const char *mohqueue_rpc_drop_call_doc [] = - { - "Drop a mohqueue call. Parameters: queue name, callID (*=all)", - 0 - }; +static const char *mohqueue_rpc_drop_call_doc[] = { + "Drop a mohqueue call. Parameters: queue name, callID (*=all)", 0}; /* RPC COMMANDS */ -rpc_export_t mohqueue_rpc [] = - { - { "mohqueue.debug", mohqueue_rpc_debug, mohqueue_rpc_debug_doc, 0 }, - { "mohqueue.drop_call", mohqueue_rpc_drop_call, - mohqueue_rpc_drop_call_doc, 0 }, - { 0, 0, 0, 0 } - }; +rpc_export_t mohqueue_rpc[] = { + {"mohqueue.debug", mohqueue_rpc_debug, mohqueue_rpc_debug_doc, 0}, + {"mohqueue.drop_call", mohqueue_rpc_drop_call, + mohqueue_rpc_drop_call_doc, 0}, + {0, 0, 0, 0}}; /* MODULE EXPORTS */ struct module_exports exports = { - "mohqueue", /* module name */ - DEFAULT_DLFLAGS, /* dlopen flags */ - mod_cmds, /* exported functions */ - mod_parms, /* exported parameters */ - 0, /* RPC methods */ - 0, /* exported pseudo-variables */ - 0, /* response handling function */ - mod_init, /* module initialization function */ - mod_child_init, /* per-child initialization function */ - mod_destroy /* destructor function */ + "mohqueue", /* module name */ + DEFAULT_DLFLAGS, /* dlopen flags */ + mod_cmds, /* exported functions */ + mod_parms, /* exported parameters */ + 0, /* RPC methods */ + 0, /* exported pseudo-variables */ + 0, /* response handling function */ + mod_init, /* module initialization function */ + mod_child_init, /* per-child initialization function */ + mod_destroy /* destructor function */ }; /********** * local constants **********/ -str prtpstat [1] = {STR_STATIC_INIT ("$rtpstat")}; +str prtpstat[1] = {STR_STATIC_INIT("$rtpstat")}; /********** * local functions @@ -129,14 +124,16 @@ str prtpstat [1] = {STR_STATIC_INIT ("$rtpstat")}; * OUTPUT: -1 if failed; 0 if saved as pv_elem_t **********/ -int fixup_count (void **param, int param_no) +int fixup_count(void **param, int param_no) { -if (param_no == 1) - { return fixup_spve_spve (param, 1); } -if (param_no == 2) - { return fixup_pvar_null (param, 1); } -return 0; + if(param_no == 1) { + return fixup_spve_spve(param, 1); + } + if(param_no == 2) { + return fixup_pvar_null(param, 1); + } + return 0; } /********** @@ -148,90 +145,80 @@ return 0; * OUTPUT: 0 if failed; else pmod_data has config values **********/ -static int init_cfg (void) +static int init_cfg(void) { -int bfnd = 0; -int berror = 0; -struct stat psb [1]; + int bfnd = 0; + int berror = 0; + struct stat psb[1]; -/********** + /********** * db_url, db_ctable, db_qtable exist? **********/ -if (!db_url.s || db_url.len <= 0) - { - LM_ERR ("db_url parameter not set!\n"); - berror = 1; - } -if (!db_ctable.s || db_ctable.len <= 0) - { - LM_ERR ("db_ctable parameter not set!\n"); - berror = 1; - } -if (!db_qtable.s || db_qtable.len <= 0) - { - LM_ERR ("db_qtable parameter not set!\n"); - berror = 1; - } - -/********** + if(!db_url.s || db_url.len <= 0) { + LM_ERR("db_url parameter not set!\n"); + berror = 1; + } + if(!db_ctable.s || db_ctable.len <= 0) { + LM_ERR("db_ctable parameter not set!\n"); + berror = 1; + } + if(!db_qtable.s || db_qtable.len <= 0) { + LM_ERR("db_qtable parameter not set!\n"); + berror = 1; + } + + /********** * mohdir * o exists? * o directory? **********/ -if (!*mohdir) - { - LM_ERR ("mohdir parameter not set!\n"); - berror = 1; - } -else if (strlen (mohdir) > MOHDIRLEN) - { - LM_ERR ("mohdir too long!\n"); - berror = 1; - } -else - { - if (!lstat (mohdir, psb)) - { - if ((psb->st_mode & S_IFMT) == S_IFDIR) - { bfnd = 1; } - } - if (!bfnd) - { - LM_ERR ("mohdir is not a directory!\n"); - berror = 1; - } - } - -/********** + if(!*mohdir) { + LM_ERR("mohdir parameter not set!\n"); + berror = 1; + } else if(strlen(mohdir) > MOHDIRLEN) { + LM_ERR("mohdir too long!\n"); + berror = 1; + } else { + if(!lstat(mohdir, psb)) { + if((psb->st_mode & S_IFMT) == S_IFDIR) { + bfnd = 1; + } + } + if(!bfnd) { + LM_ERR("mohdir is not a directory!\n"); + berror = 1; + } + } + + /********** * o max calls valid? * o alloc memory * o save data **********/ -if (moh_maxcalls < 1 || moh_maxcalls > 5000) - { - LM_ERR ("moh_maxcalls not in range of 1-5000!\n"); - berror = 1; - } -if (berror) - { return 0; } -pmod_data->pcall_lst = - (call_lst *) shm_malloc (sizeof (call_lst) * moh_maxcalls); -if (!pmod_data->pcall_lst) - { - LM_ERR ("Unable to allocate shared memory!\n"); - return 0; - } -pmod_data->pcfg->db_url = db_url; -pmod_data->pcfg->db_ctable = db_ctable; -pmod_data->pcfg->db_qtable = db_qtable; -pmod_data->pcfg->mohdir = mohdir; -memset (pmod_data->pcall_lst, 0, sizeof (call_lst) * moh_maxcalls); -pmod_data->call_cnt = moh_maxcalls; -return -1; + if(moh_maxcalls < 1 || moh_maxcalls > 5000) { + LM_ERR("moh_maxcalls not in range of 1-5000!\n"); + berror = 1; + } + if(berror) { + return 0; + } + pmod_data->pcall_lst = + (call_lst *)shm_malloc(sizeof(call_lst) * moh_maxcalls); + if(!pmod_data->pcall_lst) { + LM_ERR("Unable to allocate shared memory!\n"); + return 0; + } + pmod_data->pcfg->db_url = db_url; + pmod_data->pcfg->db_ctable = db_ctable; + pmod_data->pcfg->db_qtable = db_qtable; + pmod_data->pcfg->mohdir = mohdir; + memset(pmod_data->pcall_lst, 0, sizeof(call_lst) * moh_maxcalls); + pmod_data->call_cnt = moh_maxcalls; + return -1; } /********** @@ -242,63 +229,63 @@ return -1; * OUTPUT: 0 if failed; else pmod_data has db_api **********/ -static int init_db (void) +static int init_db(void) { -/********** + /********** * o bind to DB * o check capabilities * o init DB **********/ -str *pdb_url = &pmod_data->pcfg->db_url; -if (db_bind_mod (pdb_url, pmod_data->pdb)) - { - LM_ERR ("Unable to bind DB API using %s!\n", pdb_url->s); - return 0; - } -db_func_t *pdb = pmod_data->pdb; -if (!DB_CAPABILITY ((*pdb), DB_CAP_ALL)) - { - LM_ERR ("Selected database %s lacks required capabilities!\n", pdb_url->s); - return 0; - } -db1_con_t *pconn = mohq_dbconnect (); -if (!pconn) - { return 0; } - -/********** + str *pdb_url = &pmod_data->pcfg->db_url; + if(db_bind_mod(pdb_url, pmod_data->pdb)) { + LM_ERR("Unable to bind DB API using %s!\n", pdb_url->s); + return 0; + } + db_func_t *pdb = pmod_data->pdb; + if(!DB_CAPABILITY((*pdb), DB_CAP_ALL)) { + LM_ERR("Selected database %s lacks required capabilities!\n", + pdb_url->s); + return 0; + } + db1_con_t *pconn = mohq_dbconnect(); + if(!pconn) { + return 0; + } + + /********** * o check schema * o remove all call recs * o load queue list **********/ -if (db_check_table_version (pdb, pconn, - &pmod_data->pcfg->db_ctable, MOHQ_CTABLE_VERSION) < 0) - { - DB_TABLE_VERSION_ERROR (pmod_data->pcfg->db_ctable); - goto dberror; - } -if (db_check_table_version (pdb, pconn, - &pmod_data->pcfg->db_qtable, MOHQ_QTABLE_VERSION) < 0) - { - DB_TABLE_VERSION_ERROR (pmod_data->pcfg->db_qtable); - goto dberror; - } -clear_calls (pconn); -update_mohq_lst (pconn); -pmod_data->mohq_update = time (0); -mohq_dbdisconnect (pconn); -return -1; - -/********** + if(db_check_table_version( + pdb, pconn, &pmod_data->pcfg->db_ctable, MOHQ_CTABLE_VERSION) + < 0) { + DB_TABLE_VERSION_ERROR(pmod_data->pcfg->db_ctable); + goto dberror; + } + if(db_check_table_version( + pdb, pconn, &pmod_data->pcfg->db_qtable, MOHQ_QTABLE_VERSION) + < 0) { + DB_TABLE_VERSION_ERROR(pmod_data->pcfg->db_qtable); + goto dberror; + } + clear_calls(pconn); + update_mohq_lst(pconn); + pmod_data->mohq_update = time(0); + mohq_dbdisconnect(pconn); + return -1; + + /********** * close DB **********/ dberror: -pdb->close (pconn); -pconn = 0; -return 0; + pdb->close(pconn); + pconn = 0; + return 0; } /********** @@ -309,21 +296,21 @@ return 0; * OUTPUT: -1 if db_api not ready; else 0 **********/ -int mod_child_init (int rank) +int mod_child_init(int rank) { -/********** + /********** * make sure DB initialized **********/ -if (rank == PROC_INIT || rank == PROC_TCP_MAIN || rank == PROC_MAIN) - { return 0; } -if (!pmod_data->pdb->init) - { - LM_CRIT ("DB API not loaded!\n"); - return -1; - } -return 0; + if(rank == PROC_INIT || rank == PROC_TCP_MAIN || rank == PROC_MAIN) { + return 0; + } + if(!pmod_data->pdb->init) { + LM_CRIT("DB API not loaded!\n"); + return -1; + } + return 0; } /********** @@ -333,26 +320,31 @@ return 0; * OUTPUT: none **********/ -void mod_destroy (void) +void mod_destroy(void) { -/********** + /********** * o destroy MOH can call queue locks * o deallocate shared mem **********/ -if (!pmod_data) - { return; } -if (pmod_data->pmohq_lock->plock) - { mohq_lock_destroy (pmod_data->pmohq_lock); } -if (pmod_data->pcall_lock->plock) - { mohq_lock_destroy (pmod_data->pcall_lock); } -if (pmod_data->pmohq_lst) - { shm_free (pmod_data->pmohq_lst); } -if (pmod_data->pcall_lst) - { shm_free (pmod_data->pcall_lst); } -shm_free (pmod_data); -return; + if(!pmod_data) { + return; + } + if(pmod_data->pmohq_lock->plock) { + mohq_lock_destroy(pmod_data->pmohq_lock); + } + if(pmod_data->pcall_lock->plock) { + mohq_lock_destroy(pmod_data->pcall_lock); + } + if(pmod_data->pmohq_lst) { + shm_free(pmod_data->pmohq_lst); + } + if(pmod_data->pcall_lst) { + shm_free(pmod_data->pcall_lst); + } + shm_free(pmod_data); + return; } /********** @@ -362,140 +354,132 @@ return; * OUTPUT: -1 if failed; 0 if success **********/ -int mod_init (void) +int mod_init(void) { -int rtplen; + int rtplen; -/********** + /********** * o allocate shared mem and init * o init configuration data * o init DB **********/ -pmod_data = (mod_data *) shm_malloc (sizeof (mod_data)); -if (!pmod_data) - { - LM_ERR ("Unable to allocate shared memory!\n"); - return -1; - } -memset (pmod_data, 0, sizeof (mod_data)); -if (!init_cfg ()) - { goto initerr; } -if (!init_db ()) - { goto initerr; } - -/********** + pmod_data = (mod_data *)shm_malloc(sizeof(mod_data)); + if(!pmod_data) { + LM_ERR("Unable to allocate shared memory!\n"); + return -1; + } + memset(pmod_data, 0, sizeof(mod_data)); + if(!init_cfg()) { + goto initerr; + } + if(!init_db()) { + goto initerr; + } + + /********** * o bind to SL/TM/RR modules * o bind to RTPPROXY functions **********/ -if (sl_load_api (pmod_data->psl)) - { - LM_ERR ("Unable to load SL module!\n"); - goto initerr; - } -if (load_tm_api (pmod_data->ptm)) - { - LM_ERR ("Unable to load TM module!\n"); - goto initerr; - } -if (load_rr_api (pmod_data->prr)) - { - LM_ERR ("Unable to load RR module!\n"); - goto initerr; - } -pmod_data->fn_rtp_answer = find_export ("rtpproxy_answer", 0, 0); -if (!pmod_data->fn_rtp_answer) - { - LM_ERR ("Unable to load rtpproxy_answer!\n"); - goto initerr; - } -pmod_data->fn_rtp_offer = find_export ("rtpproxy_offer", 0, 0); -if (!pmod_data->fn_rtp_offer) - { - LM_ERR ("Unable to load rtpproxy_offer!\n"); - goto initerr; - } -pmod_data->fn_rtp_stream_c = find_export ("rtpproxy_stream2uac", 2, 0); -if (!pmod_data->fn_rtp_stream_c) - { - LM_ERR ("Unable to load rtpproxy_stream2uac!\n"); - goto initerr; - } -pmod_data->fn_rtp_stream_s = find_export ("rtpproxy_stream2uas", 2, 0); -if (!pmod_data->fn_rtp_stream_s) - { - LM_ERR ("Unable to load rtpproxy_stream2uas!\n"); - goto initerr; - } -pmod_data->fn_rtp_stop_c = find_export ("rtpproxy_stop_stream2uac", 0, 0); -if (!pmod_data->fn_rtp_stop_c) - { - LM_ERR ("Unable to load rtpproxy_stop_stream2uac!\n"); - goto initerr; - } -pmod_data->fn_rtp_stop_s = find_export ("rtpproxy_stop_stream2uas", 0, 0); -if (!pmod_data->fn_rtp_stop_s) - { - LM_ERR ("Unable to load rtpproxy_stop_stream2uas!\n"); - goto initerr; - } -pmod_data->fn_rtp_destroy = find_export ("rtpproxy_destroy", 0, 0); -if (!pmod_data->fn_rtp_destroy) - { - LM_ERR ("Unable to load rtpproxy_destroy!\n"); - goto initerr; - } - -/********** + if(sl_load_api(pmod_data->psl)) { + LM_ERR("Unable to load SL module!\n"); + goto initerr; + } + if(load_tm_api(pmod_data->ptm)) { + LM_ERR("Unable to load TM module!\n"); + goto initerr; + } + if(load_rr_api(pmod_data->prr)) { + LM_ERR("Unable to load RR module!\n"); + goto initerr; + } + pmod_data->fn_rtp_answer = find_export("rtpproxy_answer", 0, 0); + if(!pmod_data->fn_rtp_answer) { + LM_ERR("Unable to load rtpproxy_answer!\n"); + goto initerr; + } + pmod_data->fn_rtp_offer = find_export("rtpproxy_offer", 0, 0); + if(!pmod_data->fn_rtp_offer) { + LM_ERR("Unable to load rtpproxy_offer!\n"); + goto initerr; + } + pmod_data->fn_rtp_stream_c = find_export("rtpproxy_stream2uac", 2, 0); + if(!pmod_data->fn_rtp_stream_c) { + LM_ERR("Unable to load rtpproxy_stream2uac!\n"); + goto initerr; + } + pmod_data->fn_rtp_stream_s = find_export("rtpproxy_stream2uas", 2, 0); + if(!pmod_data->fn_rtp_stream_s) { + LM_ERR("Unable to load rtpproxy_stream2uas!\n"); + goto initerr; + } + pmod_data->fn_rtp_stop_c = find_export("rtpproxy_stop_stream2uac", 0, 0); + if(!pmod_data->fn_rtp_stop_c) { + LM_ERR("Unable to load rtpproxy_stop_stream2uac!\n"); + goto initerr; + } + pmod_data->fn_rtp_stop_s = find_export("rtpproxy_stop_stream2uas", 0, 0); + if(!pmod_data->fn_rtp_stop_s) { + LM_ERR("Unable to load rtpproxy_stop_stream2uas!\n"); + goto initerr; + } + pmod_data->fn_rtp_destroy = find_export("rtpproxy_destroy", 0, 0); + if(!pmod_data->fn_rtp_destroy) { + LM_ERR("Unable to load rtpproxy_destroy!\n"); + goto initerr; + } + + /********** * register RPC **********/ -if (rpc_register_array (mohqueue_rpc)) - { - LM_ERR ("Unable to register RPC commands!\n"); - return -1; - } + if(rpc_register_array(mohqueue_rpc)) { + LM_ERR("Unable to register RPC commands!\n"); + return -1; + } -/********** + /********** * get RTPSTAT pv spec **********/ -rtplen = pv_locate_name (prtpstat); -if(rtplen != prtpstat->len) - { - LM_ERR ("Unable to find RTPSTAT pv!\n"); - goto initerr; - } -prtp_pv = pv_cache_get (prtpstat); -if(!prtp_pv) - { - LM_ERR ("Unable to find pv spec for RTPSTAT!\n"); - goto initerr; - } - -/********** + rtplen = pv_locate_name(prtpstat); + if(rtplen != prtpstat->len) { + LM_ERR("Unable to find RTPSTAT pv!\n"); + goto initerr; + } + prtp_pv = pv_cache_get(prtpstat); + if(!prtp_pv) { + LM_ERR("Unable to find pv spec for RTPSTAT!\n"); + goto initerr; + } + + /********** * init MOH and call queue locks **********/ -if (!mohq_lock_init (pmod_data->pmohq_lock)) - { goto initerr; } -if (!mohq_lock_init (pmod_data->pcall_lock)) - { goto initerr; } -return 0; + if(!mohq_lock_init(pmod_data->pmohq_lock)) { + goto initerr; + } + if(!mohq_lock_init(pmod_data->pcall_lock)) { + goto initerr; + } + return 0; -/********** + /********** * o release shared mem * o exit with error **********/ initerr: -if (pmod_data->mohq_cnt) - { shm_free (pmod_data->pmohq_lst); } -if (pmod_data->pcall_lock->plock) - { mohq_lock_destroy (pmod_data->pcall_lock); } -shm_free (pmod_data); -pmod_data = NULL; -return -1; + if(pmod_data->mohq_cnt) { + shm_free(pmod_data->pmohq_lst); + } + if(pmod_data->pcall_lock->plock) { + mohq_lock_destroy(pmod_data->pcall_lock); + } + shm_free(pmod_data); + pmod_data = NULL; + return -1; } diff --git a/src/modules/mohqueue/mohqueue_mod.h b/src/modules/mohqueue/mohqueue_mod.h index 61d2f98c9cc..a8f0e979906 100644 --- a/src/modules/mohqueue/mohqueue_mod.h +++ b/src/modules/mohqueue/mohqueue_mod.h @@ -29,20 +29,20 @@ * definitions **********/ -#define URI_LEN 100 -#define USLEEP_LEN 10 -#define MOHDIRLEN 100 -#define MOHFILELEN 100 +#define URI_LEN 100 +#define USLEEP_LEN 10 +#define MOHDIRLEN 100 +#define MOHFILELEN 100 /********** * structures **********/ typedef struct - { - int ntype; - char *pencode; - } rtpmap; +{ + int ntype; + char *pencode; +} rtpmap; /* mohq_flags values */ #define MOHQF_ACT 0x01 @@ -50,81 +50,81 @@ typedef struct #define MOHQF_DBG 0x04 typedef struct - { - char mohq_name [26]; - char mohq_uri [URI_LEN + 1]; - char mohq_mohdir [MOHDIRLEN + 1]; - char mohq_mohfile [MOHFILELEN + 1]; - int mohq_flags; - int mohq_id; - } mohq_lst; +{ + char mohq_name[26]; + char mohq_uri[URI_LEN + 1]; + char mohq_mohdir[MOHDIRLEN + 1]; + char mohq_mohfile[MOHFILELEN + 1]; + int mohq_flags; + int mohq_id; +} mohq_lst; /* call_state values */ -#define CLSTA_ENTER 100 -#define CLSTA_TRYING 101 +#define CLSTA_ENTER 100 +#define CLSTA_TRYING 101 #define CLSTA_PRACKSTRT 102 #define CLSTA_PRACKRPLY 103 -#define CLSTA_INVITED 104 -#define CLSTA_CANCEL 105 -#define CLSTA_INQUEUE 200 -#define CLSTA_REFER 301 -#define CLSTA_RFRWAIT 302 -#define CLSTA_BYEOK 304 -#define CLSTA_BYE 305 +#define CLSTA_INVITED 104 +#define CLSTA_CANCEL 105 +#define CLSTA_INQUEUE 200 +#define CLSTA_REFER 301 +#define CLSTA_RFRWAIT 302 +#define CLSTA_BYEOK 304 +#define CLSTA_BYE 305 typedef struct - { - char call_buffer [1024]; - size_t call_buflen; - char *call_id; - char *call_from; - char call_referto [URI_LEN + 1]; - char *call_contact; - char *call_tag; - char *call_via; - char *call_route; - char call_addr [IP_ADDR_MAX_STR_SIZE + 4]; - int call_state; - int call_cseq; - int call_aport; - mohq_lst *pmohq; - time_t call_time; - time_t refer_time; - unsigned int call_hash; - unsigned int call_label; - sip_msg_t *call_pmsg; - } call_lst; +{ + char call_buffer[1024]; + size_t call_buflen; + char *call_id; + char *call_from; + char call_referto[URI_LEN + 1]; + char *call_contact; + char *call_tag; + char *call_via; + char *call_route; + char call_addr[IP_ADDR_MAX_STR_SIZE + 4]; + int call_state; + int call_cseq; + int call_aport; + mohq_lst *pmohq; + time_t call_time; + time_t refer_time; + unsigned int call_hash; + unsigned int call_label; + sip_msg_t *call_pmsg; +} call_lst; typedef struct - { - char *mohdir; - str db_url; - str db_ctable; - str db_qtable; - } mod_cfg; +{ + char *mohdir; + str db_url; + str db_ctable; + str db_qtable; +} mod_cfg; typedef struct - { - mod_cfg pcfg [1]; - time_t mohq_update; - int mohq_cnt; - mohq_lst *pmohq_lst; - mohq_lock pmohq_lock [1]; - int call_cnt; - call_lst *pcall_lst; - mohq_lock pcall_lock [1]; - db_func_t pdb [1]; - tm_api_t ptm [1]; - sl_api_t psl [1]; - rr_api_t prr [1]; - cmd_function fn_rtp_answer; - cmd_function fn_rtp_destroy; - cmd_function fn_rtp_offer; - cmd_function fn_rtp_stream_c; - cmd_function fn_rtp_stream_s; - cmd_function fn_rtp_stop_c; - cmd_function fn_rtp_stop_s; - } mod_data; +{ + mod_cfg pcfg[1]; + time_t mohq_update; + int mohq_cnt; + mohq_lst *pmohq_lst; + mohq_lock pmohq_lock[1]; + int call_cnt; + call_lst *pcall_lst; + mohq_lock pcall_lock[1]; + db_func_t pdb[1]; + tm_api_t ptm[1]; + sl_api_t psl[1]; + rr_api_t prr[1]; + cmd_function fn_rtp_answer; + cmd_function fn_rtp_destroy; + cmd_function fn_rtp_offer; + cmd_function fn_rtp_stream_c; + cmd_function fn_rtp_stream_s; + cmd_function fn_rtp_stop_c; + cmd_function fn_rtp_stop_s; +} mod_data; /********** * global varb declarations @@ -132,6 +132,6 @@ typedef struct extern mod_data *pmod_data; extern pv_spec_t *prtp_pv; -extern rtpmap prtpmap []; +extern rtpmap prtpmap[]; #endif /* MOHQ_H */ \ No newline at end of file