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,
00123 cmds,
00124 params,
00125 0,
00126 0,
00127 mod_pvs,
00128 0,
00129 mod_init,
00130 0,
00131 (destroy_function) destroy,
00132 child_init
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