<div dir="ltr">Hi all,<br><br>I need a help to solve some problems in the clearance of a function to perform a query Mysql....I created a function based on documentation of asipto / kamailio devel which is very good... But as I did not want to create a new module I&#39;m trying to use the module domain... whose goal a proxy SIP receive msg that will should validate the realm comparing with a table set up in MySQL(trusdomain)... it should be used into config file to to declare of the table created in the Mysql: modparam ( &quot;domain&quot;, &quot;trusdomain_table,&quot; trusdomain)<br>
the version table of the openser has updated with the creation of this new table (trusdomain) and created a function into file: domain.c / h and a part was need be exported to config file in domain_mod.c / h....but on the tests a call..this proxy kills the pid openser ...<br>
<br>Sep&nbsp; 5 06:32:21 notehome openser[7962]: INFO:core:handle_sigs: child process 7964 exited by a signal 11 <br>Sep&nbsp; 5 06:32:21 notehome openser[7962]: INFO:core:handle_sigs: core was generated <br>Sep&nbsp; 5 06:32:21 notehome openser[7962]: INFO:core:handle_sigs: terminating due to SIGCHLD <br>
Sep&nbsp; 5 06:32:21 notehome openser[7967]: INFO:core:sig_usr: signal 15 received <br>Sep&nbsp; 5 06:32:21 notehome openser[7963]: INFO:core:sig_usr: signal 15 received <br>Sep&nbsp; 5 06:32:21 notehome openser[7968]: INFO:core:sig_usr: signal 15 received <br>
Sep&nbsp; 5 06:32:21 notehome openser[7966]: INFO:core:sig_usr: signal 15 received <br>Sep&nbsp; 5 06:32:21 notehome openser[7965]: INFO:core:sig_usr: signal 15 received<br><br>The function created in domain.c:<br>int is_from_trusted(struct sip_msg* _msg, char* _s1, char* _s2)<br>
{<br>&nbsp;&nbsp;&nbsp; struct sip_uri *puri;<br>/*&nbsp;&nbsp;&nbsp; struct str* _host;&nbsp; */<br>/*&nbsp;&nbsp;&nbsp; str table_trus;<br>&nbsp;&nbsp;&nbsp; str col_id;<br>&nbsp;&nbsp;&nbsp; str col_dom;<br>&nbsp;&nbsp;&nbsp; str col_lastmod; */<br><br>str* _host = (str*)(&amp;(puri-&gt;host));<br>&nbsp;&nbsp;&nbsp; char* db_url = DEFAULT_RODB_URL;<br>
<br>&nbsp;&nbsp;&nbsp; db_key_t keys[1];&nbsp; /* Tipo da coluna .. Nome das colunas */<br>&nbsp;&nbsp;&nbsp; db_val_t vals[1];<br>&nbsp;&nbsp;&nbsp; db_key_t cols[1];<br>&nbsp;&nbsp;&nbsp; db_res_t* res = NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; if ((puri=parse_from_uri(_msg))==NULL){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM_ERR(&quot;Error while parsing From header\n&quot;);&nbsp;&nbsp;&nbsp; return -2;<br>
&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; /* Bind the database module */<br>&nbsp;&nbsp;&nbsp; if (bind_dbmod(db_url, &amp;domain_dbf )) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM_ERR(&quot;Cannot bind to database module!\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; /* Check for SELECT capability&nbsp; */<br>
&nbsp;&nbsp;&nbsp; if (!DB_CAPABILITY(domain_dbf, DB_CAP_QUERY)){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM_ERR(&quot;Database modules does not provide all functions needed\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }<br><br>/* Connect to DB */<br>&nbsp;&nbsp;&nbsp; db_handle = domain_dbf.init(db_url);<br>
&nbsp;&nbsp;&nbsp; if (!db_handle){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM_ERR(&quot;failed to connect database\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; keys[0]=trusdomain_col.s;<br>&nbsp;&nbsp;&nbsp; cols[0]=trusdomain_col.s;&nbsp;&nbsp; <br><br><br>&nbsp;&nbsp;&nbsp; LM_INFO(&quot;&gt;&gt;domain.c&gt;&gt;-2-IF RES_ROW_N(res)=&gt;%d\n&quot;,RES_ROW_N(res));<br>
&nbsp;&nbsp;&nbsp; /* Estrutura dos vls das colunas - arq. db/db_val.h */<br>&nbsp;&nbsp;&nbsp; VAL_TYPE(vals) = DB_STR;<br>&nbsp;&nbsp;&nbsp; VAL_NULL(vals) = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; VAL_STR(vals).s = _host-&gt;s;<br>&nbsp;&nbsp;&nbsp; VAL_STR(vals).len = _host-&gt;len;<br><br>/*&nbsp;&nbsp;&nbsp; LM_INFO(&quot;&gt;&gt;domain.c&gt;&gt;-1-connector=%d and tab=%s\n&quot;,db_handle,trusdomain_table.s);&nbsp;&nbsp;&nbsp; */<br>
&nbsp;&nbsp;&nbsp; if (domain_dbf.use_table(db_handle, trusdomain_table.s) &lt; 0) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM_ERR(&quot;Error while trying to use trusdomain table\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; if (domain_dbf.query(db_handle, keys, NULL, vals, cols, 1, 1, 0, &amp;res) &lt; 0) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM_ERR(&quot;Error while querying database\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; domain_dbf.close(db_handle);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; /* RES_ROW_N(res) Num. de linhas no fetch */<br>&nbsp;&nbsp;&nbsp; if (RES_ROW_N(res) &lt;= 0 || RES_ROWS(res)[0].values[0].nul != 0){<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM_DBG(&quot;no value found\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (res != NULL &amp;&amp; domain_dbf.free_result(db_handle, res) &lt; 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM_DBG(&quot;failed to free the result\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; domain_dbf.close(db_handle);<br>
&nbsp;&nbsp;&nbsp; } else if (RES_ROW_N(res) &gt;= 1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Teste do que estah na tab. trusdomain com o que vem na URI */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM_DBG(&quot;Realm &#39;%.*s&#39; is trusted\n&quot;,_host-&gt;len, ZSW(_host-&gt;s));<br>&nbsp;&nbsp;&nbsp; }<br>
<br>&nbsp;&nbsp;&nbsp; /* Free the result */<br>&nbsp;&nbsp;&nbsp; domain_dbf.free_result(db_handle, res);<br>&nbsp;&nbsp;&nbsp; domain_dbf.close(db_handle);<br><br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br>And declaration in domain_mod.c :<br>...<br>/* by mrg */<br>#define TRUSDOMAIN_TABLE &quot;trusdomain&quot;<br>
#define TRUSDOMAIN_TABLE_LEN (sizeof(TRUSDOMAIN_TABLE) - 1)<br>#define TRUSDOMAIN_COL &quot;trusdomain&quot;<br>#define TRUSDOMAIN_COL_LEN (sizeof(TRUSDOMAIN_COL) - 1)<br>...<br>...<br>str trusdomain_table = {TRUSDOMAIN_TABLE, TRUSDOMAIN_TABLE_LEN}; /* Name of trusted table */<br>
str trusdomain_col = {TRUSDOMAIN_COL, TRUSDOMAIN_COL_LEN};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Name of trusted column */<br>...<br>...<br>/*<br>&nbsp;* Exported functions<br>&nbsp;*/<br>static cmd_export_t cmds[] = {<br>&nbsp;&nbsp;&nbsp; .............<br>&nbsp;&nbsp;&nbsp; {&quot;is_domain_local&quot;,&nbsp;&nbsp;&nbsp;&nbsp; w_is_domain_local,&nbsp;&nbsp; 1,&nbsp; parameter_fixup, 0,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REQUEST_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE},<br>&nbsp;&nbsp;&nbsp; {&quot;is_from_trusted&quot;,&nbsp;&nbsp;&nbsp;&nbsp; is_from_trusted,&nbsp;&nbsp; 0,&nbsp; 0, 0,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REQUEST_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE},<br>&nbsp;&nbsp;&nbsp; {0, 0, 0, 0, 0, 0}<br>
};<br>.../*<br>&nbsp;* Exported parameters<br>&nbsp;*/<br>static param_export_t params[] = {<br>&nbsp;&nbsp;&nbsp; ............<br>&nbsp;&nbsp;&nbsp; {&quot;domain_table&quot;,&nbsp;&nbsp; STR_PARAM, &amp;domain_table.s},<br>&nbsp;&nbsp;&nbsp; {&quot;domain_col&quot;,&nbsp;&nbsp;&nbsp;&nbsp; STR_PARAM, &amp;domain_col.s&nbsp; },<br>
&nbsp;&nbsp;&nbsp; {&quot;trusdomain_table&quot;,&nbsp;&nbsp; STR_PARAM, &amp;trusdomain_table.s},<br>&nbsp;&nbsp;&nbsp; {&quot;trusdomain_col&quot;,&nbsp;&nbsp;&nbsp;&nbsp; STR_PARAM, &amp;trusdomain_col.s},<br>&nbsp;&nbsp;&nbsp; {0, 0, 0}<br>};<br>...<br>...<br>static int mod_init(void)<br>{<br>
&nbsp; int vertr....;<br>.....<br>&nbsp;&nbsp;&nbsp; trusdomain_table.len = strlen(trusdomain_table.s);<br>&nbsp;&nbsp;&nbsp; trusdomain_col.len = strlen(trusdomain_col.s);<br>.....<br>&nbsp;&nbsp;&nbsp; if (db_mode != 0) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (domain_db_init(db_url.s)&lt;0) return -1;<br>
&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Check table version */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ver = domain_db_ver(&amp;domain_table);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vertr = domain_db_ver(&amp;trusdomain_table);<br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((ver &lt; 0) &amp;&amp; (vertr &lt; 0)) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM_ERR(&quot;Error while querying table version\n&quot;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto error;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if ((ver &lt; TABLE_VERSION) &amp;&amp; (vertr &lt; TABLE_VERSION)) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM_ERR(&quot;Invalid table version &lt;%d&gt; trustable version &lt;%d&gt; (should be %d)\n&quot;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ver, vertr, TABLE_VERSION);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto error;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>.......<br>.......<br>&nbsp;&nbsp;&nbsp; /* Initializing hash tables and hash table variable */<br>........<br>&nbsp;&nbsp;&nbsp; domain_db_close();<br>&nbsp;&nbsp;&nbsp; }<br><br>
&nbsp;&nbsp;&nbsp; return 0;<br>error:<br>&nbsp;&nbsp;&nbsp; domain_db_close();<br>&nbsp;&nbsp;&nbsp; return -1;<br>}<br><br>So I think that I must be something doing wrong&nbsp; ..... as would be the right and as I could learn fast to resolve error debugging of pID of Openser that has been deads...???<br>
<br>thx<br>Marcio<br></div>