pv.c

00001 
00023 #include <stdio.h>
00024 #include <string.h>
00025 #include <stdlib.h>
00026 
00027 #include "../../sr_module.h"
00028 #include "../../pvar.h"
00029 #include "../../mod_fix.h"
00030 #include "../../lib/kmi/mi.h"
00031 
00032 #include "pv_branch.h"
00033 #include "pv_core.h"
00034 #include "pv_stats.h"
00035 #include "pv_shv.h"
00036 #include "pv_time.h"
00037 #include "pv_trans.h"
00038 #include "pv_select.h"
00039 #ifdef WITH_XAVP
00040 #include "pv_xavp.h"
00041 #endif
00042 
00043 MODULE_VERSION
00044 
00045 static tr_export_t mod_trans[] = {
00046         { {"s", sizeof("s")-1}, /* string class */
00047                 tr_parse_string },
00048         { {"nameaddr", sizeof("nameaddr")-1}, /* nameaddr class */
00049                 tr_parse_nameaddr },
00050         { {"uri", sizeof("uri")-1}, /* uri class */
00051                 tr_parse_uri },
00052         { {"param", sizeof("param")-1}, /* param class */
00053                 tr_parse_paramlist },
00054         { {"tobody", sizeof("tobody")-1}, /* param class */
00055                 tr_parse_tobody },
00056         { {"line", sizeof("line")-1}, /* line class */
00057                 tr_parse_line },
00058 
00059         { { 0, 0 }, 0 }
00060 };
00061 
00062 static pv_export_t mod_pvs[] = {
00063         { {"branch", sizeof("branch")-1}, /* branch attributes */
00064                 PVT_CONTEXT, pv_get_branchx, pv_set_branchx,
00065                 pv_parse_branchx_name, pv_parse_index, 0, 0 },
00066         { {"mi", (sizeof("mi")-1)}, /* message id */
00067                 PVT_OTHER, pv_get_msgid, 0,
00068                 0, 0, 0, 0},
00069         { {"stat", sizeof("stat")-1}, /* statistics */
00070                 PVT_OTHER, pv_get_stat, 0,
00071                 pv_parse_stat_name, 0, 0, 0 },
00072         { {"sel", sizeof("sel")-1}, /* select */
00073                 PVT_OTHER, pv_get_select, 0,
00074                 pv_parse_select_name, 0, 0, 0 },
00075         { {"snd", (sizeof("snd")-1)}, PVT_OTHER, pv_get_sndto, 0,
00076                 pv_parse_snd_name, 0, 0, 0 },
00077         { {"sndto", (sizeof("sndto")-1)}, PVT_OTHER, pv_get_sndto, 0,
00078                 pv_parse_snd_name, 0, 0, 0 },
00079         { {"sndfrom", (sizeof("sndfrom")-1)}, PVT_OTHER, pv_get_sndfrom, 0,
00080                 pv_parse_snd_name, 0, 0, 0 },
00081 #ifdef WITH_XAVP
00082         { {"xavp", sizeof("xavp")-1}, /* xavp */
00083                 PVT_OTHER, pv_get_xavp, pv_set_xavp,
00084                 pv_parse_xavp_name, 0, 0, 0 },
00085 #endif
00086 
00087         {{"avp", (sizeof("avp")-1)}, PVT_AVP, pv_get_avp, pv_set_avp,
00088                 pv_parse_avp_name, pv_parse_index, 0, 0},
00089         {{"hdr", (sizeof("hdr")-1)}, PVT_HDR, pv_get_hdr, 0, pv_parse_hdr_name,
00090                 pv_parse_index, 0, 0},
00091         {{"var", (sizeof("var")-1)}, PVT_SCRIPTVAR, pv_get_scriptvar,
00092                 pv_set_scriptvar, pv_parse_scriptvar_name, 0, 0, 0},
00093         {{"ai", (sizeof("ai")-1)}, /* */
00094                 PVT_OTHER, pv_get_pai, 0,
00095                 0, 0, 0, 0},
00096         {{"adu", (sizeof("adu")-1)}, /* auth digest uri */
00097                 PVT_OTHER, pv_get_authattr, 0,
00098                 0, 0, pv_init_iname, 3},
00099         {{"ar", (sizeof("ar")-1)}, /* auth realm */
00100                 PVT_OTHER, pv_get_authattr, 0,
00101                 0, 0, pv_init_iname, 2},
00102         {{"au", (sizeof("au")-1)}, /* */
00103                 PVT_OTHER, pv_get_authattr, 0,
00104                 0, 0, pv_init_iname, 1},
00105         {{"ad", (sizeof("ad")-1)}, /* */
00106                 PVT_OTHER, pv_get_authattr, 0,
00107                 0, 0, pv_init_iname, 4},
00108         {{"aU", (sizeof("aU")-1)}, /* */
00109                 PVT_OTHER, pv_get_authattr, 0,
00110                 0, 0, pv_init_iname, 5},
00111         {{"Au", (sizeof("Au")-1)}, /* */
00112                 PVT_OTHER, pv_get_acc_username, 0,
00113                 0, 0, pv_init_iname, 1},
00114         {{"bf", (sizeof("bf")-1)}, /* */
00115                 PVT_CONTEXT, pv_get_bflags, pv_set_bflags,
00116                 0, 0, 0, 0},
00117         {{"bF", (sizeof("bF")-1)}, /* */
00118                 PVT_CONTEXT, pv_get_hexbflags, pv_set_bflags,
00119                 0, 0, 0, 0},
00120         {{"br", (sizeof("br")-1)}, /* */
00121                 PVT_BRANCH, pv_get_branch, pv_set_branch,
00122                 0, 0, 0, 0},
00123         {{"bR", (sizeof("bR")-1)}, /* */
00124                 PVT_CONTEXT, pv_get_branches, 0,
00125                 0, 0, 0, 0},
00126         {{"bs", (sizeof("bs")-1)}, /* */
00127                 PVT_OTHER, pv_get_body_size, 0,
00128                 0, 0, 0, 0},
00129         {{"ci", (sizeof("ci")-1)}, /* */
00130                 PVT_OTHER, pv_get_callid, 0,
00131                 0, 0, 0, 0},
00132         {{"cl", (sizeof("cl")-1)}, /* */
00133                 PVT_OTHER, pv_get_content_length, 0,
00134                 0, 0, 0, 0},
00135         {{"cs", (sizeof("cs")-1)}, /* */
00136                 PVT_OTHER, pv_get_cseq, 0,
00137                 0, 0, 0, 0},
00138         {{"ct", (sizeof("ct")-1)}, /* */
00139                 PVT_OTHER, pv_get_contact, 0,
00140                 0, 0, 0, 0},
00141         {{"cT", (sizeof("cT")-1)}, /* */
00142                 PVT_OTHER, pv_get_content_type, 0,
00143                 0, 0, 0, 0},
00144         {{"dd", (sizeof("dd")-1)}, /* */
00145                 PVT_OTHER, pv_get_dsturi_attr, 0,
00146                 0, 0, pv_init_iname, 1},
00147         {{"di", (sizeof("di")-1)}, /* */
00148                 PVT_OTHER, pv_get_diversion, 0,
00149                 0, 0, pv_init_iname, 1},
00150         {{"dir", (sizeof("dir")-1)}, /* */
00151                 PVT_OTHER, pv_get_diversion, 0,
00152                 0, 0, pv_init_iname, 2},
00153         {{"dip", (sizeof("dis")-1)}, /* */
00154                 PVT_OTHER, pv_get_diversion, 0,
00155                 0, 0, pv_init_iname, 3},
00156         {{"dic", (sizeof("dic")-1)}, /* */
00157                 PVT_OTHER, pv_get_diversion, 0,
00158                 0, 0, pv_init_iname, 4},
00159         {{"dp", (sizeof("dp")-1)}, /* */
00160                 PVT_OTHER, pv_get_dsturi_attr, 0,
00161                 0, 0, pv_init_iname, 2},
00162         {{"dP", (sizeof("dP")-1)}, /* */
00163                 PVT_OTHER, pv_get_dsturi_attr, 0,
00164                 0, 0, pv_init_iname, 3},
00165         {{"ds", (sizeof("ds")-1)}, /* */
00166                 PVT_CONTEXT, pv_get_dset, 0,
00167                 0, 0, 0, 0},
00168         {{"du", (sizeof("du")-1)}, /* */
00169                 PVT_DSTURI, pv_get_dsturi, pv_set_dsturi,
00170                 0, 0, 0, 0},
00171         {{"duri", (sizeof("duri")-1)}, /* */
00172                 PVT_DSTURI, pv_get_dsturi, pv_set_dsturi,
00173                 0, 0, 0, 0},
00174         {{"err.class", (sizeof("err.class")-1)}, /* */
00175                 PVT_OTHER, pv_get_errinfo_attr, 0,
00176                 0, 0, 0, 0},
00177         {{"err.level", (sizeof("err.level")-1)}, /* */
00178                 PVT_OTHER, pv_get_errinfo_attr, 0,
00179                 0, 0, pv_init_iname, 1},
00180         {{"err.info", (sizeof("err.info")-1)}, /* */
00181                 PVT_OTHER, pv_get_errinfo_attr, 0,
00182                 0, 0, pv_init_iname, 2},
00183         {{"err.rcode", (sizeof("err.rcode")-1)}, /* */
00184                 PVT_OTHER, pv_get_errinfo_attr, 0,
00185                 0, 0, pv_init_iname, 3},
00186         {{"err.rreason", (sizeof("err.rreason")-1)}, /* */
00187                 PVT_OTHER, pv_get_errinfo_attr, 0,
00188                 0, 0, pv_init_iname, 4},
00189         {{"fd", (sizeof("fd")-1)}, /* */
00190                 PVT_OTHER, pv_get_from_attr, pv_set_from_domain,
00191                 0, 0, pv_init_iname, 3},
00192         {{"from.domain", (sizeof("from.domain")-1)}, /* */
00193                 PVT_OTHER, pv_get_from_attr, pv_set_from_domain,
00194                 0, 0, pv_init_iname, 3},
00195         {{"fn", (sizeof("fn")-1)}, /* */
00196                 PVT_OTHER, pv_get_from_attr, pv_set_from_display,
00197                 0, 0, pv_init_iname, 5},
00198         {{"fs", (sizeof("fs")-1)}, /* */
00199                 PVT_OTHER, pv_get_force_sock, pv_set_force_sock,
00200                 0, 0, 0, 0},
00201         {{"ft", (sizeof("ft")-1)}, /* */
00202                 PVT_OTHER, pv_get_from_attr, 0,
00203                 0, 0, pv_init_iname, 4},
00204         {{"fu", (sizeof("fu")-1)}, /* */
00205                 PVT_FROM, pv_get_from_attr, pv_set_from_uri,
00206                 0, 0, pv_init_iname, 1},
00207         {{"from", (sizeof("from")-1)}, /* */
00208                 PVT_FROM, pv_get_from_attr, pv_set_from_uri,
00209                 0, 0, pv_init_iname, 1},
00210         {{"fU", (sizeof("fU")-1)}, /* */
00211                 PVT_OTHER, pv_get_from_attr, pv_set_from_username,
00212                 0, 0, pv_init_iname, 2},
00213         {{"from.user", (sizeof("from.user")-1)}, /* */
00214                 PVT_OTHER, pv_get_from_attr, pv_set_from_username,
00215                 0, 0, pv_init_iname, 2},
00216         {{"mb", (sizeof("mb")-1)}, /* */
00217                 PVT_OTHER, pv_get_msg_buf, 0,
00218                 0, 0, 0, 0},
00219         {{"mf", (sizeof("mf")-1)}, /* */
00220                 PVT_OTHER, pv_get_flags, pv_set_mflags,
00221                 0, 0, 0, 0},
00222         {{"mF", (sizeof("mF")-1)}, /* */
00223                 PVT_OTHER, pv_get_hexflags, pv_set_mflags,
00224                 0, 0, 0, 0},
00225         {{"ml", (sizeof("ml")-1)}, /* */
00226                 PVT_OTHER, pv_get_msg_len, 0,
00227                 0, 0, 0, 0},
00228         {{"mt", (sizeof("mt")-1)}, /* */
00229                 PVT_OTHER, pv_get_msgtype, 0,
00230                 0, 0, 0, 0},
00231         {{"od", (sizeof("od")-1)}, /* */
00232                 PVT_OTHER, pv_get_ouri_attr, 0,
00233                 0, 0, pv_init_iname, 2},
00234         {{"op", (sizeof("op")-1)}, /* */
00235                 PVT_OTHER, pv_get_ouri_attr, 0,
00236                 0, 0, pv_init_iname, 3},
00237         {{"oP", (sizeof("oP")-1)}, /* */
00238                 PVT_OTHER, pv_get_ouri_attr, 0,
00239                 0, 0, pv_init_iname, 4},
00240         {{"ou", (sizeof("ou")-1)}, /* */
00241                 PVT_OURI, pv_get_ouri, 0,
00242                 0, 0, 0, 0},
00243         {{"ouri", (sizeof("ouri")-1)}, /* */
00244                 PVT_OURI, pv_get_ouri, 0,
00245                 0, 0, 0, 0},
00246         {{"oU", (sizeof("oU")-1)}, /* */
00247                 PVT_OTHER, pv_get_ouri_attr, 0,
00248                 0, 0, pv_init_iname, 1},
00249         {{"pd", (sizeof("pd")-1)}, /* */
00250                 PVT_OTHER, pv_get_ppi_attr, 0,
00251                 0, 0, pv_init_iname, 3},
00252         {{"pn", (sizeof("pn")-1)}, /* */
00253                 PVT_OTHER, pv_get_ppi_attr, 0,
00254                 0, 0, pv_init_iname, 4},
00255         {{"pp", (sizeof("pp")-1)}, /* */
00256                 PVT_OTHER, pv_get_pid, 0,
00257                 0, 0, 0, 0},
00258         {{"pr", (sizeof("pr")-1)}, /* */
00259                 PVT_OTHER, pv_get_proto, 0,
00260                 0, 0, 0, 0},
00261         {{"proto", (sizeof("proto")-1)}, /* */
00262                 PVT_OTHER, pv_get_proto, 0,
00263                 0, 0, 0, 0},
00264         {{"pu", (sizeof("pu")-1)}, /* */
00265                 PVT_OTHER, pv_get_ppi_attr, 0,
00266                 0, 0, pv_init_iname, 1},
00267         {{"pU", (sizeof("pU")-1)}, /* */
00268                 PVT_OTHER, pv_get_ppi_attr, 0,
00269                 0, 0, pv_init_iname, 2},
00270         {{"rb", (sizeof("rb")-1)}, /* */
00271                 PVT_MSG_BODY, pv_get_msg_body, 0,
00272                 0, 0, 0, 0},
00273         /* {{"rc", (sizeof("rc")-1)},
00274                 PVT_OTHER, pv_get_return_code, 0,
00275                 0, 0, 0, 0},
00276         {{"retcode", (sizeof("retcode")-1)},
00277                 PVT_OTHER, pv_get_return_code, 0,
00278                 0, 0, 0, 0}, */
00279         {{"rd", (sizeof("rd")-1)}, /* */
00280                 PVT_RURI_DOMAIN, pv_get_ruri_attr, pv_set_ruri_host,
00281                 0, 0, pv_init_iname, 2},
00282         {{"ruri.domain", (sizeof("ruri.domain")-1)}, /* */
00283                 PVT_RURI_DOMAIN, pv_get_ruri_attr, pv_set_ruri_host,
00284                 0, 0, pv_init_iname, 2},
00285         {{"re", (sizeof("re")-1)}, /* */
00286                 PVT_OTHER, pv_get_rpid, 0,
00287                 0, 0, 0, 0},
00288         {{"rm", (sizeof("rm")-1)}, /* */
00289                 PVT_OTHER, pv_get_method, 0,
00290                 0, 0, 0, 0},
00291         {{"rmid", (sizeof("rmid")-1)}, /* */
00292                 PVT_OTHER, pv_get_methodid, 0,
00293                 0, 0, 0, 0},
00294         {{"rp", (sizeof("rp")-1)}, /* */
00295                 PVT_OTHER, pv_get_ruri_attr, pv_set_ruri_port,
00296                 0, 0, pv_init_iname, 3},
00297         {{"rP", (sizeof("rP")-1)}, /* */
00298                 PVT_OTHER, pv_get_ruri_attr, 0,
00299                 0, 0, pv_init_iname, 4},
00300         {{"rr", (sizeof("rr")-1)}, /* */
00301                 PVT_OTHER, pv_get_reason, 0,
00302                 0, 0, 0, 0},
00303         {{"rs", (sizeof("rs")-1)}, /* */
00304                 PVT_OTHER, pv_get_status, 0,
00305                 0, 0, 0, 0},
00306         {{"rt", (sizeof("rt")-1)}, /* */
00307                 PVT_OTHER, pv_get_refer_to, 0,
00308                 0, 0, 0, 0},
00309         {{"ru", (sizeof("ru")-1)}, /* */
00310                 PVT_RURI, pv_get_ruri, pv_set_ruri,
00311                 0, 0, 0, 0},
00312         {{"ruri", (sizeof("ruri")-1)}, /* */
00313                 PVT_RURI, pv_get_ruri, pv_set_ruri,
00314                 0, 0, 0, 0},
00315         {{"rU", (sizeof("rU")-1)}, /* */
00316                 PVT_RURI_USERNAME, pv_get_ruri_attr, pv_set_ruri_user,
00317                 0, 0, pv_init_iname, 1},
00318         {{"ruri.user", (sizeof("ruri.user")-1)}, /* */
00319                 PVT_RURI_USERNAME, pv_get_ruri_attr, pv_set_ruri_user,
00320                 0, 0, pv_init_iname, 1},
00321         {{"rv", (sizeof("rv")-1)}, /* */
00322                 PVT_OTHER, pv_get_version, 0,
00323                 0, 0, 0, 0},
00324         {{"rz", (sizeof("rz")-1)}, /* */
00325                 PVT_OTHER, pv_get_ruri_attr, 0,
00326                 0, 0, pv_init_iname, 5},
00327         {{"Ri", (sizeof("Ri")-1)}, /* */
00328                 PVT_OTHER, pv_get_rcvip, 0,
00329                 0, 0, 0, 0},
00330         {{"Rp", (sizeof("Rp")-1)}, /* */
00331                 PVT_OTHER, pv_get_rcvport, 0,
00332                 0, 0, 0, 0},
00333         {{"sf", (sizeof("sf")-1)}, /* */
00334                 PVT_OTHER, pv_get_sflags, pv_set_sflags,
00335                 0, 0, 0, 0},
00336         {{"sF", (sizeof("sF")-1)}, /* */
00337                 PVT_OTHER, pv_get_hexsflags, pv_set_sflags,
00338                 0, 0, 0, 0},
00339         {{"src_ip", (sizeof("src_ip")-1)}, /* */
00340                 PVT_OTHER, pv_get_srcip, 0,
00341                 0, 0, 0, 0},
00342         {{"si", (sizeof("si")-1)}, /* */
00343                 PVT_OTHER, pv_get_srcip, 0,
00344                 0, 0, 0, 0},
00345         { {"sid", (sizeof("sid")-1)}, /* server id */
00346                 PVT_OTHER, pv_get_server_id, 0,
00347                 0, 0, 0, 0},
00348         {{"sp", (sizeof("sp")-1)}, /* */
00349                 PVT_OTHER, pv_get_srcport, 0,
00350                 0, 0, 0, 0},
00351         {{"td", (sizeof("td")-1)}, /* */
00352                 PVT_OTHER, pv_get_to_attr, pv_set_to_domain,
00353                 0, 0, pv_init_iname, 3},
00354         {{"to.domain", (sizeof("to.domain")-1)}, /* */
00355                 PVT_OTHER, pv_get_to_attr, pv_set_to_domain,
00356                 0, 0, pv_init_iname, 3},
00357         {{"tn", (sizeof("tn")-1)}, /* */
00358                 PVT_OTHER, pv_get_to_attr, pv_set_to_display,
00359                 0, 0, pv_init_iname, 5},
00360         {{"tt", (sizeof("tt")-1)}, /* */
00361                 PVT_OTHER, pv_get_to_attr, 0,
00362                 0, 0, pv_init_iname, 4},
00363         {{"tu", (sizeof("tu")-1)}, /* */
00364                 PVT_TO, pv_get_to_attr, pv_set_to_uri,
00365                 0, 0, pv_init_iname, 1},
00366         {{"to", (sizeof("to")-1)}, /* */
00367                 PVT_TO, pv_get_to_attr, pv_set_to_uri,
00368                 0, 0, pv_init_iname, 1},
00369         {{"tU", (sizeof("tU")-1)}, /* */
00370                 PVT_OTHER, pv_get_to_attr, pv_set_to_username,
00371                 0, 0, pv_init_iname, 2},
00372         {{"to.user", (sizeof("to.user")-1)}, /* */
00373                 PVT_OTHER, pv_get_to_attr, pv_set_to_username,
00374                 0, 0, pv_init_iname, 2},
00375         {{"true", (sizeof("true")-1)}, /* */
00376                 PVT_OTHER, pv_get_true, 0,
00377                 0, 0, 0, 0},
00378         {{"Tb", (sizeof("Tb")-1)}, /* */
00379                 PVT_OTHER, pv_get_timeb, 0,
00380                 0, 0, 0, 0},
00381         {{"Tf", (sizeof("Tf")-1)}, /* */
00382                 PVT_CONTEXT, pv_get_timef, 0,
00383                 0, 0, 0, 0},
00384         {{"TF", (sizeof("TF")-1)}, /* */
00385                 PVT_OTHER, pv_get_timenowf, 0,
00386                 0, 0, 0, 0},
00387         {{"Ts", (sizeof("Ts")-1)}, /* */
00388                 PVT_CONTEXT, pv_get_times, 0,
00389                 0, 0, 0, 0},
00390         {{"TS", (sizeof("TS")-1)}, /* */
00391                 PVT_OTHER, pv_get_timenows, 0,
00392                 0, 0, 0, 0},
00393         {{"ua", (sizeof("ua")-1)}, /* */
00394                 PVT_OTHER, pv_get_useragent, 0,
00395                 0, 0, 0, 0},
00396 
00397         { {"shv", (sizeof("shv")-1)}, PVT_OTHER, pv_get_shvar,
00398                 pv_set_shvar, pv_parse_shvar_name, 0, 0, 0},
00399         { {"time", (sizeof("time")-1)}, PVT_CONTEXT, pv_get_time,
00400                 0, pv_parse_time_name, 0, 0, 0},
00401         { {"timef", (sizeof("timef")-1)}, PVT_CONTEXT, pv_get_strftime,
00402                 0, pv_parse_strftime_name, 0, 0, 0},
00403         { {"TV", (sizeof("TV")-1)}, PVT_OTHER, pv_get_timeval,
00404                 0, pv_parse_timeval_name, 0, 0, 0},
00405         { {"nh", (sizeof("nh")-1)}, PVT_OTHER, pv_get_nh,
00406                 0, pv_parse_nh_name, 0, 0, 0},
00407 
00408         { {0, 0}, 0, 0, 0, 0, 0, 0, 0 }
00409 };
00410 
00411 static int add_avp_aliases(modparam_t type, void* val);
00412 
00413 static param_export_t params[]={ 
00414         {"shvset",              STR_PARAM|USE_FUNC_PARAM, (void*)param_set_shvar },
00415         {"varset",              STR_PARAM|USE_FUNC_PARAM, (void*)param_set_var },
00416         {"avp_aliases",         STR_PARAM|USE_FUNC_PARAM, (void*)add_avp_aliases },
00417         {0,0,0}
00418 };
00419 
00420 static mi_export_t mi_cmds[] = {
00421         { "shv_get",       mi_shvar_get,  0,                 0,  0 },
00422         { "shv_set" ,      mi_shvar_set,  0,                 0,  0 },
00423         { 0, 0, 0, 0, 0}
00424 };
00425 
00426 static int mod_init(void);
00427 static void mod_destroy(void);
00428 static int pv_isset(struct sip_msg* msg, char* pvid, char *foo);
00429 static int pv_unset(struct sip_msg* msg, char* pvid, char *foo);
00430 static int is_int(struct sip_msg* msg, char* pvar, char* s2);
00431 
00432 static cmd_export_t cmds[]={
00433         {"pv_isset",  (cmd_function)pv_isset,  1, fixup_pvar_null, 0, 
00434                 ANY_ROUTE },
00435         {"pv_unset",  (cmd_function)pv_unset,  1, fixup_pvar_null, 0, 
00436                 ANY_ROUTE },
00437 #ifdef WITH_XAVP
00438         {"pv_xavp_print",  (cmd_function)pv_xavp_print,  0, 0, 0, 
00439                 ANY_ROUTE },
00440 #endif
00441         {"is_int", (cmd_function)is_int, 1, fixup_pvar_null, fixup_free_pvar_null,
00442                 ANY_ROUTE},
00443 
00444         {0,0,0,0,0,0}
00445 };
00446 
00447 
00448 
00450 struct module_exports exports= {
00451         "pv",
00452         DEFAULT_DLFLAGS, /* dlopen flags */
00453         cmds,
00454         params,
00455         0,          /* exported statistics */
00456         mi_cmds,    /* exported MI functions */
00457         mod_pvs,    /* exported pseudo-variables */
00458         0,          /* extra processes */
00459         mod_init,   /* module initialization function */
00460         0,
00461         mod_destroy,
00462         0           /* per-child init function */
00463 };
00464 
00465 static int mod_init(void)
00466 {
00467         if(register_mi_mod(exports.name, mi_cmds)!=0)
00468         {
00469                 LM_ERR("failed to register MI commands\n");
00470                 return -1;
00471         }
00472 
00473         return 0;
00474 }
00475 
00476 static void mod_destroy(void)
00477 {
00478         shvar_destroy_locks();
00479         destroy_shvars();
00480 }
00481 
00482 int mod_register(char *path, int *dlflags, void *p1, void *p2)
00483 {
00484         if(tr_init_buffers()<0)
00485         {
00486                 LM_ERR("failed to initialize transformations buffers\n");
00487                 return -1;
00488         }
00489         return register_trans_mod(path, mod_trans);
00490 }
00491 
00492 static int pv_isset(struct sip_msg* msg, char* pvid, char *foo)
00493 {
00494         pv_spec_t *sp;
00495         pv_value_t value;
00496         int ret;
00497 
00498         sp = (pv_spec_t*)pvid;
00499         if(pv_get_spec_value(msg, sp, &value)!=0)
00500                 return -1;
00501         ret =1;
00502         if(value.flags & (PV_VAL_EMPTY|PV_VAL_NULL))
00503                 ret = -1;
00504         pv_value_destroy(&value);
00505         return ret;
00506 }
00507 
00508 static int pv_unset(struct sip_msg* msg, char* pvid, char *foo)
00509 {
00510         pv_spec_t *sp;
00511         
00512         sp = (pv_spec_t*)pvid;
00513         pv_set_spec_value(msg, sp, 0, NULL);
00514 
00515         return 1;
00516 }
00517 
00518 static int add_avp_aliases(modparam_t type, void* val)
00519 {
00520         if (val!=0 && ((char*)val)[0]!=0)
00521         {
00522                 if ( add_avp_galias_str((char*)val)!=0 )
00523                         return -1;
00524         }
00525 
00526         return 0;
00527 }
00528 
00534 static int is_int(struct sip_msg* msg, char* pvar, char* s2)
00535 {
00536         pv_spec_t *pvar_sp;
00537         pv_value_t pv_val;
00538 
00539         pvar_sp = (pv_spec_t *)pvar;
00540 
00541         if (pvar_sp && (pv_get_spec_value(msg, pvar_sp, &pv_val) == 0)) {
00542                 return (pv_val.flags & PV_VAL_INT)?1:-1;
00543         }
00544 
00545         return -1;
00546 }