kex_mod.c

00001 
00025 #include <stdio.h>
00026 #include <string.h>
00027 #include <stdlib.h>
00028 
00029 #include "../../sr_module.h"
00030 #include "../../dprint.h"
00031 #include "../../forward.h"
00032 #include "../../flags.h"
00033 #include "../../dset.h"
00034 #include "../../mod_fix.h"
00035 #include "../../parser/parse_uri.h"
00036 #include "../../lib/srutils/sruid.h"
00037 
00038 #include "flags.h"
00039 #include "km_core.h"
00040 #include "mi_core.h"
00041 #include "core_stats.h"
00042 #include "pkg_stats.h"
00043 
00044 
00045 MODULE_VERSION
00046 
00047 
00051 int w_is_myself(struct sip_msg *msg, char *uri, str *s2);
00052 int w_setdebug(struct sip_msg *msg, char *level, str *s2);
00053 int w_resetdebug(struct sip_msg *msg, char *uri, str *s2);
00054 
00055 static int mod_init(void);
00056 static int child_init(int rank);
00057 static void destroy(void);
00058 
00059 
00060 static sruid_t _kex_sruid;
00061 
00062 static int pv_get_sruid_val(struct sip_msg *msg, pv_param_t *param,
00063                 pv_value_t *res);
00064 
00065 static pv_export_t mod_pvs[] = {
00066         { {"sruid", sizeof("sruid")-1}, PVT_OTHER, pv_get_sruid_val, 0,
00067                 0, 0, 0, 0 },
00068         { {0, 0}, 0, 0, 0, 0, 0, 0, 0 }
00069 };
00070 
00071 static cmd_export_t cmds[]={
00072         {"setsflag", (cmd_function)w_setsflag,          1,fixup_igp_null,
00073                         0, ANY_ROUTE },
00074         {"resetsflag", (cmd_function)w_resetsflag,      1,fixup_igp_null,
00075                         0, ANY_ROUTE },
00076         {"issflagset", (cmd_function)w_issflagset,      1,fixup_igp_null,
00077                         0, ANY_ROUTE },
00078         {"setbflag", (cmd_function)w_setbflag,          1,fixup_igp_null,
00079                         0, ANY_ROUTE },
00080         {"setbflag", (cmd_function)w_setbflag,          2,fixup_igp_igp,
00081                         0, ANY_ROUTE },
00082         {"resetbflag", (cmd_function)w_resetbflag,      1,fixup_igp_null,
00083                         0, ANY_ROUTE },
00084         {"resetbflag", (cmd_function)w_resetbflag,      2,fixup_igp_igp,
00085                         0, ANY_ROUTE },
00086         {"isbflagset", (cmd_function)w_isbflagset,      1,fixup_igp_null,
00087                         0, ANY_ROUTE },
00088         {"isbflagset", (cmd_function)w_isbflagset,      2,fixup_igp_igp,
00089                         0, ANY_ROUTE },
00090         {"km_append_branch", (cmd_function)w_km_append_branch, 0, 0,
00091                         0, REQUEST_ROUTE | FAILURE_ROUTE },
00092         {"km_append_branch", (cmd_function)w_km_append_branch, 1, fixup_spve_null,
00093                         0, REQUEST_ROUTE | FAILURE_ROUTE },
00094         {"setdsturi", (cmd_function)w_setdsturi,     1, 0,
00095                         0, ANY_ROUTE },
00096         {"resetdsturi", (cmd_function)w_resetdsturi, 0, 0,
00097                         0, ANY_ROUTE },
00098         {"isdsturiset", (cmd_function)w_isdsturiset, 0, 0,
00099                         0, ANY_ROUTE },
00100         {"pv_printf", (cmd_function)w_pv_printf,    2, pv_printf_fixup,
00101                         0, ANY_ROUTE },
00102         {"avp_printf", (cmd_function)w_pv_printf,   2, pv_printf_fixup,
00103                         0, ANY_ROUTE },
00104         {"is_myself", (cmd_function)w_is_myself,    1, fixup_spve_null,
00105                         0, ANY_ROUTE },
00106         {"setdebug", (cmd_function)w_setdebug,      1, fixup_igp_null,
00107                         0, ANY_ROUTE },
00108         {"resetdebug", (cmd_function)w_resetdebug,  0, 0,
00109                         0, ANY_ROUTE },
00110 
00111         {0,0,0,0,0,0}
00112 };
00113 
00114 static param_export_t params[]={
00115         {0,0,0}
00116 };
00117 
00118 
00120 struct module_exports exports= {
00121         "kex",
00122         DEFAULT_DLFLAGS, /* dlopen flags */
00123         cmds,
00124         params,
00125         0,          /* exported statistics */
00126         0,          /* exported MI functions */
00127         mod_pvs,    /* exported pseudo-variables */
00128         0,          /* extra processes */
00129         mod_init,   /* module initialization function */
00130         0,
00131         (destroy_function) destroy,
00132         child_init  /* per-child init function */
00133 };
00134 
00138 static int mod_init(void)
00139 {
00140         if(sruid_init(&_kex_sruid, '-', NULL, 0)<0)
00141                 return -1;
00142         if(init_mi_core()<0)
00143                 return -1;
00144 #ifdef STATISTICS
00145         if(register_core_stats()<0)
00146                 return -1;
00147         if(register_mi_stats()<0)
00148                 return -1;
00149 #endif
00150         register_pkg_proc_stats();
00151         pkg_proc_stats_init_rpc();
00152         return 0;
00153 }
00154 
00158 static int child_init(int rank)
00159 {
00160         LM_DBG("rank is (%d)\n", rank);
00161         if(sruid_init(&_kex_sruid, '-', NULL, 0)<0)
00162                 return -1;
00163         if (rank==PROC_INIT)
00164                 return pkg_proc_stats_init();
00165         return pkg_proc_stats_myinit(rank);
00166 }
00167 
00168 
00172 static void destroy(void)
00173 {
00174         return;
00175 }
00176 
00177 
00181 int w_is_myself(struct sip_msg *msg, char *uri, str *s2)
00182 {
00183         int ret;
00184         str suri;
00185         struct sip_uri puri;
00186 
00187         if(fixup_get_svalue(msg, (gparam_p)uri, &suri)!=0)
00188         {
00189                 LM_ERR("cannot get the URI parameter\n");
00190                 return -1;
00191         }
00192         if(suri.len>4 && (strncmp(suri.s, "sip:", 4)==0
00193                                 || strncmp(suri.s, "sips:", 5)==0))
00194         {
00195                 if(parse_uri(suri.s, suri.len, &puri)!=0)
00196                 {
00197                         LM_ERR("failed to parse uri [%.*s]\n", suri.len, suri.s);
00198                         return -1;
00199                 }
00200                 ret = check_self(&puri.host, (puri.port.s)?puri.port_no:0,
00201                                 (puri.transport_val.s)?puri.proto:0);
00202         } else {
00203                 ret = check_self(&suri, 0, 0);
00204         }
00205         if(ret!=1)
00206                 return -1;
00207         return 1;
00208 }
00209 
00210 int w_setdebug(struct sip_msg *msg, char *level, str *s2)
00211 {
00212         int lval=0;
00213         if(fixup_get_ivalue(msg, (gparam_p)level, &lval)!=0)
00214         {
00215                 LM_ERR("no debug level value\n");
00216                 return -1;
00217         }
00218         set_local_debug_level(lval);
00219         return 1;
00220 }
00221 
00222 int w_resetdebug(struct sip_msg *msg, char *uri, str *s2)
00223 {
00224         reset_local_debug_level();
00225         return 1;
00226 }
00227 
00228 
00229 static int pv_get_sruid_val(struct sip_msg *msg, pv_param_t *param,
00230                 pv_value_t *res)
00231 {
00232         if(res==NULL)
00233                 return -1;
00234         if(sruid_next(&_kex_sruid)<0)
00235                 return pv_get_null(msg, param, res);
00236         return pv_get_strval(msg, param, res, &_kex_sruid.uid);
00237 }
00238