00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <stdio.h>
00030 #include <stdlib.h>
00031 #include <regex.h>
00032
00033 #include "mem/mem.h"
00034 #include "str.h"
00035 #include "ut.h"
00036 #include "error.h"
00037 #include "pvar.h"
00038 #include "mod_fix.h"
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 int fixup_str(void** param)
00067 {
00068 str* s;
00069
00070 s = (str*)pkg_malloc(sizeof(str));
00071 if (!s) {
00072 LM_ERR("no more pkg memory\n");
00073 return E_UNSPEC;
00074 }
00075
00076 s->s = (char*)*param;
00077 s->len = strlen(s->s);
00078 *param = (void*)s;
00079
00080 return 0;
00081 }
00082
00083
00084
00085
00086
00087 int fixup_free_str(void** param)
00088 {
00089 if(*param) {
00090 pkg_free(*param);
00091 *param = 0;
00092 }
00093 return 0;
00094 }
00095
00096
00097
00098
00099
00100 int fixup_str_null(void** param, int param_no)
00101 {
00102 if(param_no != 1)
00103 {
00104 LM_ERR("invalid parameter number %d\n", param_no);
00105 return E_UNSPEC;
00106 }
00107 return fixup_str(param);
00108 }
00109
00110
00111
00112
00113
00114
00115 int fixup_str_str(void** param, int param_no)
00116 {
00117 if (param_no != 1 && param_no != 2 )
00118 {
00119 LM_ERR("invalid parameter number %d\n", param_no);
00120 return E_UNSPEC;
00121 }
00122 return fixup_str(param);
00123 }
00124
00125
00126
00127
00128
00129 int fixup_free_str_null(void** param, int param_no)
00130 {
00131 if(param_no != 1)
00132 {
00133 LM_ERR("invalid parameter number %d\n", param_no);
00134 return E_UNSPEC;
00135 }
00136 return fixup_free_str(param);
00137 }
00138
00139
00140
00141
00142
00143
00144 int fixup_free_str_str(void** param, int param_no)
00145 {
00146 if (param_no != 1 && param_no != 2 )
00147 {
00148 LM_ERR("invalid parameter number %d\n", param_no);
00149 return E_UNSPEC;
00150 }
00151 return fixup_free_str(param);
00152 }
00153
00154
00155
00156
00157
00158
00159
00160 int fixup_uint(void** param)
00161 {
00162 unsigned int ui;
00163 str s;
00164
00165 s.s = (char*)*param;
00166 s.len = strlen(s.s);
00167 if(str2int(&s, &ui)==0)
00168 {
00169 pkg_free(*param);
00170 *param=(void *)(unsigned long)ui;
00171 return 0;
00172 }
00173 LM_ERR("bad number <%s>\n", (char *)(*param));
00174 return E_CFG;
00175 }
00176
00177
00178
00179
00180
00181 int fixup_uint_null(void** param, int param_no)
00182 {
00183 if(param_no != 1)
00184 {
00185 LM_ERR("invalid parameter number %d\n", param_no);
00186 return E_UNSPEC;
00187 }
00188 return fixup_uint(param);
00189 }
00190
00191
00192
00193
00194
00195
00196 int fixup_uint_uint(void** param, int param_no)
00197 {
00198 if (param_no != 1 && param_no != 2 )
00199 {
00200 LM_ERR("invalid parameter number %d\n", param_no);
00201 return E_UNSPEC;
00202 }
00203 return fixup_uint(param);
00204 }
00205
00206 #if 0
00207
00208
00209
00210
00211
00212
00213 int fixup_sint( void** param)
00214 {
00215 int si;
00216 str s;
00217
00218 s.s = (char*)*param;
00219 s.len = strlen(s.s);
00220 if(str2sint(&s, &si)==0)
00221 {
00222 pkg_free(*param);
00223 *param=(void *)si;
00224 return 0;
00225 }
00226 LM_ERR("bad number <%s>\n", (char *)(*param));
00227 return E_CFG;
00228 }
00229
00230
00231
00232
00233
00234 int fixup_sint_null(void** param, int param_no)
00235 {
00236 if(param_no != 1)
00237 {
00238 LM_ERR("invalid parameter number %d\n", param_no);
00239 return E_UNSPEC;
00240 }
00241 return fixup_sint(param);
00242 }
00243
00244
00245
00246
00247
00248
00249 int fixup_sint_sint(void** param, int param_no)
00250 {
00251 if (param_no != 1 && param_no != 2 )
00252 {
00253 LM_ERR("invalid parameter number %d\n", param_no);
00254 return E_UNSPEC;
00255 }
00256 return fixup_sint(param);
00257 }
00258
00259
00260
00261
00262
00263
00264 int fixup_sint_uint(void** param, int param_no)
00265 {
00266 if (param_no != 1 && param_no != 2 )
00267 {
00268 LM_ERR("invalid parameter number %d\n", param_no);
00269 return E_UNSPEC;
00270 }
00271 if (param_no == 1)
00272 return fixup_sint(param);
00273 return fixup_uint(param);
00274 }
00275
00276
00277
00278
00279
00280
00281 int fixup_uint_sint(void** param, int param_no)
00282 {
00283 if (param_no != 1 && param_no != 2 )
00284 {
00285 LM_ERR("invalid parameter number %d\n", param_no);
00286 return E_UNSPEC;
00287 }
00288 if (param_no == 1)
00289 return fixup_uint(param);
00290 return fixup_sint(param);
00291 }
00292 #endif
00293
00294
00295
00296
00297
00298
00299 static int fixup_regexp(void** param, int rflags)
00300 {
00301 regex_t* re;
00302
00303 if ((re=pkg_malloc(sizeof(regex_t)))==0) {
00304 LM_ERR("no more pkg memory\n");
00305 return E_OUT_OF_MEM;
00306 }
00307 if (regcomp(re, *param, (REG_EXTENDED|REG_ICASE|REG_NEWLINE)&(~rflags))) {
00308 pkg_free(re);
00309 LM_ERR("bad re %s\n", (char*)*param);
00310 return E_BAD_RE;
00311 }
00312
00313 pkg_free(*param);
00314
00315 *param=re;
00316 return 0;
00317 }
00318
00319
00320
00321
00322 int fixup_free_regexp(void** param)
00323 {
00324 if(*param)
00325 {
00326 regfree((regex_t*)(*param));
00327 pkg_free(*param);
00328 *param = 0;
00329 }
00330 return 0;
00331 }
00332
00333
00334
00335
00336
00337 int fixup_regexp_null(void** param, int param_no)
00338 {
00339 if(param_no != 1)
00340 {
00341 LM_ERR("invalid parameter number %d\n", param_no);
00342 return E_UNSPEC;
00343 }
00344 return fixup_regexp(param, 0);
00345 }
00346
00347
00348
00349
00350
00351
00352 int fixup_regexpNL_null(void** param, int param_no)
00353 {
00354 if(param_no != 1)
00355 {
00356 LM_ERR("invalid parameter number %d\n", param_no);
00357 return E_UNSPEC;
00358 }
00359 return fixup_regexp(param, REG_NEWLINE);
00360 }
00361
00362
00363
00364
00365
00366 int fixup_free_regexp_null(void** param, int param_no)
00367 {
00368 if(param_no != 1)
00369 {
00370 LM_ERR("invalid parameter number %d\n", param_no);
00371 return E_UNSPEC;
00372 }
00373 return fixup_free_regexp(param);
00374 }
00375
00376
00377
00378
00379
00380
00381 int fixup_regexp_none(void** param, int param_no)
00382 {
00383 if (param_no != 1 && param_no != 2 )
00384 {
00385 LM_ERR("invalid parameter number %d\n", param_no);
00386 return E_UNSPEC;
00387 }
00388 if (param_no == 1)
00389 return fixup_regexp(param, 0);
00390 return 0;
00391 }
00392
00393
00394
00395
00396
00397
00398
00399 int fixup_regexpNL_none(void** param, int param_no)
00400 {
00401 if (param_no != 1 && param_no != 2 )
00402 {
00403 LM_ERR("invalid parameter number %d\n", param_no);
00404 return E_UNSPEC;
00405 }
00406 if (param_no == 1)
00407 return fixup_regexp(param, REG_NEWLINE);
00408 return 0;
00409 }
00410
00411
00412
00413
00414
00415
00416 int fixup_free_regexp_none(void** param, int param_no)
00417 {
00418 if (param_no != 1 && param_no != 2 )
00419 {
00420 LM_ERR("invalid parameter number %d\n", param_no);
00421 return E_UNSPEC;
00422 }
00423 if (param_no == 1)
00424 return fixup_free_regexp(param);
00425 return 0;
00426 }
00427
00428
00429
00430
00431
00432 int fixup_pvar(void **param)
00433 {
00434 pv_spec_t *sp;
00435 str s;
00436
00437 sp = (pv_spec_t*)pkg_malloc(sizeof(pv_spec_t));
00438 if (sp == 0) {
00439 LM_ERR("no pkg memory left\n");
00440 return E_UNSPEC;
00441 }
00442 s.s = (char*)*param; s.len = strlen(s.s);
00443 if (pv_parse_spec(&s, sp) == 0) {
00444 LM_ERR("parsing of pseudo variable %s failed!\n", (char*)*param);
00445 pkg_free(sp);
00446 return E_UNSPEC;
00447 }
00448 if (sp->type == PVT_NULL) {
00449 LM_ERR("bad pseudo variable\n");
00450 pkg_free(sp);
00451 return E_UNSPEC;
00452 }
00453 *param = (void*)sp;
00454
00455 return 0;
00456 }
00457
00458
00459
00460
00461 int fixup_free_pvar(void** param)
00462 {
00463 if (*param) {
00464 pv_spec_free((pv_spec_t*)*param);
00465 }
00466
00467 return 0;
00468 }
00469
00470
00471
00472
00473
00474 int fixup_pvar_null(void** param, int param_no)
00475 {
00476 if(param_no != 1)
00477 {
00478 LM_ERR("invalid parameter number %d\n", param_no);
00479 return E_UNSPEC;
00480 }
00481 return fixup_pvar(param);
00482 }
00483
00484
00485
00486
00487
00488 int fixup_free_pvar_null(void** param, int param_no)
00489 {
00490 if(param_no != 1)
00491 {
00492 LM_ERR("invalid parameter number %d\n", param_no);
00493 return E_UNSPEC;
00494 }
00495 return fixup_free_pvar(param);
00496 }
00497
00498
00499
00500
00501
00502 int fixup_pvar_pvar(void** param, int param_no)
00503 {
00504 if (param_no == 1)
00505 {
00506 return fixup_pvar(param);
00507 }
00508 if (param_no != 2)
00509 {
00510 LM_ERR("invalid parameter number %d\n", param_no);
00511 return E_UNSPEC;
00512 }
00513 return fixup_pvar(param);
00514 }
00515
00516
00517
00518
00519
00520 int fixup_free_pvar_pvar(void** param, int param_no)
00521 {
00522 if(param_no == 1)
00523 {
00524 return fixup_free_pvar(param);
00525 }
00526 if (param_no != 2)
00527 {
00528 LM_ERR("invalid parameter number %d\n", param_no);
00529 return E_UNSPEC;
00530 }
00531 return fixup_free_pvar(param);
00532 }
00533
00534
00535
00536
00537
00538
00539 int fixup_pvar_str(void** param, int param_no)
00540 {
00541 if (param_no == 1)
00542 {
00543 return fixup_pvar(param);
00544 }
00545 if (param_no != 2)
00546 {
00547 LM_ERR("invalid parameter number %d\n", param_no);
00548 return E_UNSPEC;
00549 }
00550 return fixup_str(param);
00551 }
00552
00553
00554
00555
00556
00557
00558 int fixup_free_pvar_str(void** param, int param_no)
00559 {
00560 if(param_no == 1)
00561 {
00562 return fixup_free_pvar(param);
00563 }
00564 if (param_no != 2)
00565 {
00566 LM_ERR("invalid parameter number %d\n", param_no);
00567 return E_UNSPEC;
00568 }
00569 return fixup_free_str(param);
00570 }
00571
00572
00573
00574
00575
00576
00577
00578 int fixup_pvar_str_str(void** param, int param_no)
00579 {
00580 if (param_no == 1)
00581 {
00582 return fixup_pvar(param);
00583 }
00584 if (param_no != 2 && param_no != 3)
00585 {
00586 LM_ERR("invalid parameter number %d\n", param_no);
00587 return E_UNSPEC;
00588 }
00589 return fixup_str(param);
00590 }
00591
00592
00593
00594
00595
00596
00597
00598 int fixup_free_pvar_str_str(void** param, int param_no)
00599 {
00600 if(param_no == 1)
00601 {
00602 return fixup_free_pvar(param);
00603 }
00604 if (param_no != 2 && param_no != 3)
00605 {
00606 LM_ERR("invalid parameter number %d\n", param_no);
00607 return E_UNSPEC;
00608 }
00609 return fixup_free_str(param);
00610 }
00611
00612
00613
00614
00615
00616 int fixup_igp(void** param)
00617 {
00618 str s;
00619 gparam_p gp = NULL;
00620
00621 gp = (gparam_p)pkg_malloc(sizeof(gparam_t));
00622 if(gp == NULL)
00623 {
00624 LM_ERR("no more memory\n");
00625 return E_UNSPEC;
00626 }
00627 memset(gp, 0, sizeof(gparam_t));
00628 s.s = (char*)*param; s.len = strlen(s.s);
00629 if(s.s[0]==PV_MARKER)
00630 {
00631 gp->type = GPARAM_TYPE_PVS;
00632 gp->v.pvs = (pv_spec_t*)pkg_malloc(sizeof(pv_spec_t));
00633 if (gp->v.pvs == NULL)
00634 {
00635 LM_ERR("no pkg memory left for pv_spec_t\n");
00636 pkg_free(gp);
00637 return E_UNSPEC;
00638 }
00639
00640 if(pv_parse_spec(&s, gp->v.pvs)==NULL)
00641 {
00642 LM_ERR("Unsupported User Field identifier\n");
00643 pkg_free(gp->v.pvs);
00644 pkg_free(gp);
00645 return E_UNSPEC;
00646 }
00647 } else {
00648 gp->type = GPARAM_TYPE_INT;
00649 if(str2sint(&s, &gp->v.ival) != 0)
00650 {
00651 LM_ERR("Bad number <%s>\n", (char*)(*param));
00652 return E_UNSPEC;
00653 }
00654 }
00655 *param = (void*)gp;
00656
00657 return 0;
00658 }
00659
00660
00661
00662
00663
00664 int fixup_igp_null(void** param, int param_no)
00665 {
00666 if (param_no != 1)
00667 {
00668 LM_ERR("invalid parameter number %d\n", param_no);
00669 return E_UNSPEC;
00670 }
00671 return fixup_igp(param);
00672 }
00673
00674
00675
00676
00677
00678
00679 int fixup_igp_igp(void** param, int param_no)
00680 {
00681 if (param_no != 1 && param_no != 2 )
00682 {
00683 LM_ERR("invalid parameter number %d\n", param_no);
00684 return E_UNSPEC;
00685 }
00686 return fixup_igp(param);
00687 }
00688
00689
00690
00691
00692
00693
00694
00695 int fixup_igp_pvar_pvar(void** param, int param_no)
00696 {
00697 if(param_no == 1) {
00698 return fixup_igp(param);
00699 }
00700 if (param_no != 2 && param_no != 3) {
00701 LM_ERR("invalid parameter number %d\n", param_no);
00702 return E_UNSPEC;
00703 }
00704 return fixup_pvar(param);
00705 }
00706
00707
00708
00709
00710
00711
00712
00713 int fixup_free_igp_pvar_pvar(void** param, int param_no)
00714 {
00715 if(param_no == 1) {
00716 return 0;
00717 }
00718 if (param_no != 2 && param_no != 3) {
00719 LM_ERR("invalid parameter number %d\n", param_no);
00720 return E_UNSPEC;
00721 }
00722 return fixup_free_pvar(param);
00723 }
00724
00725
00726
00727
00728
00729 int fixup_get_ivalue(struct sip_msg* msg, gparam_p gp, int *val)
00730 {
00731 pv_value_t value;
00732
00733 if(gp->type==GPARAM_TYPE_INT)
00734 {
00735 *val = gp->v.ival;
00736 return 0;
00737 }
00738
00739 if(pv_get_spec_value(msg, gp->v.pvs, &value)!=0
00740 || value.flags&PV_VAL_NULL || !(value.flags&PV_VAL_INT))
00741 {
00742 LM_ERR("no valid PV value found (error in scripts)\n");
00743 return -1;
00744 }
00745 *val = value.ri;
00746 return 0;
00747 }
00748
00749
00750
00751
00752
00753 int fixup_spve(void** param)
00754 {
00755 str s;
00756 gparam_p gp = NULL;
00757
00758 gp = (gparam_p)pkg_malloc(sizeof(gparam_t));
00759 if(gp == NULL)
00760 {
00761 LM_ERR("no more memory\n");
00762 return E_UNSPEC;
00763 }
00764 memset(gp, 0, sizeof(gparam_t));
00765
00766 s.s = (char*)(*param); s.len = strlen(s.s);
00767 if(pv_parse_format(&s, &gp->v.pve)<0)
00768 {
00769 LM_ERR("wrong format[%s]\n", s.s);
00770 return E_UNSPEC;
00771 }
00772 if(gp->v.pve->spec.getf==NULL)
00773 {
00774 gp->type = GPARAM_TYPE_STR;
00775 pv_elem_free_all(gp->v.pve);
00776 gp->v.sval = s;
00777 } else {
00778 gp->type = GPARAM_TYPE_PVE;
00779 }
00780 *param = (void*)gp;
00781 return 0;
00782 }
00783
00784
00785
00786
00787
00788 int fixup_spve_null(void** param, int param_no)
00789 {
00790 if (param_no != 1)
00791 {
00792 LM_ERR("invalid parameter number %d\n", param_no);
00793 return E_UNSPEC;
00794 }
00795 return fixup_spve(param);
00796 }
00797
00798
00799
00800
00801
00802
00803 int fixup_spve_spve(void** param, int param_no)
00804 {
00805 if (param_no != 1 && param_no != 2 )
00806 {
00807 LM_ERR("invalid parameter number %d\n", param_no);
00808 return E_UNSPEC;
00809 }
00810 return fixup_spve(param);
00811 }
00812
00813
00814
00815
00816
00817
00818 int fixup_spve_uint(void** param, int param_no)
00819 {
00820 if (param_no != 1 && param_no != 2 )
00821 {
00822 LM_ERR("invalid parameter number %d\n", param_no);
00823 return E_UNSPEC;
00824 }
00825 if (param_no == 1)
00826 return fixup_spve(param);
00827
00828 return fixup_uint(param);
00829 }
00830
00831
00832
00833
00834
00835
00836 int fixup_spve_str(void** param, int param_no)
00837 {
00838 if (param_no != 1 && param_no != 2 )
00839 {
00840 LM_ERR("invalid parameter number %d\n", param_no);
00841 return E_UNSPEC;
00842 }
00843 if (param_no == 1)
00844 return fixup_spve(param);
00845
00846 return fixup_str(param);
00847 }
00848
00849
00850
00851
00852
00853 int fixup_get_svalue(struct sip_msg* msg, gparam_p gp, str *val)
00854 {
00855 pv_value_t value;
00856
00857 if(gp->type==GPARAM_TYPE_STR)
00858 {
00859 *val = gp->v.sval;
00860 return 0;
00861 }
00862
00863 if(gp->type==GPARAM_TYPE_PVS)
00864 {
00865 if(pv_get_spec_value(msg, gp->v.pvs, &value)!=0
00866 || value.flags&PV_VAL_NULL || !(value.flags&PV_VAL_STR))
00867 {
00868 LM_ERR("no valid PV value found (error in scripts)\n");
00869 return -1;
00870 }
00871 *val = value.rs;
00872 return 0;
00873 }
00874
00875 if(gp->type==GPARAM_TYPE_PVE)
00876 {
00877 if(pv_printf_s( msg, gp->v.pve, val)!=0)
00878 {
00879 LM_ERR("cannot print the PV-formated string\n");
00880 return -1;
00881 }
00882 return 0;
00883 }
00884
00885 return -1;
00886 }
00887