PageRenderTime 50ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 1ms

/openser-1.3.4-tls/route.c

#
C | 1657 lines | 1470 code | 96 blank | 91 comment | 330 complexity | 42876e014bb79ab6d63f2cf4dbb4406b MD5 | raw file
Possible License(s): AGPL-1.0
  1. /*
  2. * $Id: route.c 5045 2008-10-08 13:37:39Z henningw $
  3. *
  4. * SIP routing engine
  5. *
  6. * Copyright (C) 2001-2003 FhG Fokus
  7. * Copyright (C) 2005-2006 Voice Sistem S.R.L.
  8. *
  9. * This file is part of openser, a free SIP server.
  10. *
  11. * openser is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version
  15. *
  16. * openser is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License
  22. * along with this program; if not, write to the Free Software
  23. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  24. *
  25. * History:
  26. * --------
  27. * 2003-01-28 scratchpad removed, src_port introduced (jiri)
  28. * 2003-02-28 scratchpad compatibility abandoned (jiri)
  29. * 2003-03-10 updated to the new module exports format (andrei)
  30. * 2003-03-19 replaced all mallocs/frees w/ pkg_malloc/pkg_free (andrei)
  31. * 2003-04-01 added dst_port, proto, af; renamed comp_port to comp_no,
  32. * inlined all the comp_* functions (andrei)
  33. * 2003-04-05 s/reply_route/failure_route, onreply_route introduced (jiri)
  34. * 2003-05-23 comp_ip fixed, now it will resolve its operand and compare
  35. * the ip with all the addresses (andrei)
  36. * 2003-10-10 added more operators support to comp_* (<,>,<=,>=,!=) (andrei)
  37. * 2004-10-19 added from_uri & to_uri (andrei)
  38. * 2006-03-02 MODULE_T action points to a cmd_export_t struct instead to
  39. * a function address - more info is accessible (bogdan)
  40. * Fixup failure reports the config line (bogdan)
  41. * 2006-12-22 support for script and branch flags added (bogdan)
  42. */
  43. #include <stdlib.h>
  44. #include <sys/types.h>
  45. #include <regex.h>
  46. #include <netdb.h>
  47. #include <string.h>
  48. #include <sys/socket.h>
  49. #include <netinet/in.h>
  50. #include <arpa/inet.h>
  51. #include <netdb.h>
  52. #include "route.h"
  53. #include "forward.h"
  54. #include "dprint.h"
  55. #include "proxy.h"
  56. #include "action.h"
  57. #include "sr_module.h"
  58. #include "ip_addr.h"
  59. #include "resolve.h"
  60. #include "socket_info.h"
  61. #include "blacklists.h"
  62. #include "parser/parse_uri.h"
  63. #include "parser/parse_from.h"
  64. #include "parser/parse_to.h"
  65. #include "mem/mem.h"
  66. /* main routing script table */
  67. struct action* rlist[RT_NO];
  68. /* reply routing table */
  69. struct action* onreply_rlist[ONREPLY_RT_NO];
  70. struct action* failure_rlist[FAILURE_RT_NO];
  71. struct action* branch_rlist[BRANCH_RT_NO];
  72. struct action* error_rlist;
  73. int route_type = REQUEST_ROUTE;
  74. static int fix_actions(struct action* a); /*fwd declaration*/
  75. extern int return_code;
  76. /*
  77. *
  78. */
  79. void init_route_lists(void)
  80. {
  81. memset(rlist, 0, sizeof(rlist));
  82. memset(onreply_rlist, 0, sizeof(onreply_rlist));
  83. memset(failure_rlist, 0, sizeof(failure_rlist));
  84. memset(branch_rlist, 0, sizeof(branch_rlist));
  85. error_rlist = 0;
  86. }
  87. /* traverses an expr tree and compiles the REs where necessary)
  88. * returns: 0 for ok, <0 if errors */
  89. static int fix_expr(struct expr* exp)
  90. {
  91. regex_t* re;
  92. int ret;
  93. ret=E_BUG;
  94. if (exp==0){
  95. LM_CRIT("null pointer\n");
  96. return E_BUG;
  97. }
  98. if (exp->type==EXP_T){
  99. switch(exp->op){
  100. case AND_OP:
  101. case OR_OP:
  102. if ((ret=fix_expr(exp->left.v.expr))!=0)
  103. return ret;
  104. ret=fix_expr(exp->right.v.expr);
  105. break;
  106. case NOT_OP:
  107. case EVAL_OP:
  108. ret=fix_expr(exp->left.v.expr);
  109. break;
  110. default:
  111. LM_CRIT("unknown op %d\n", exp->op);
  112. }
  113. }else if (exp->type==ELEM_T){
  114. if (exp->op==MATCH_OP || exp->op==NOTMATCH_OP){
  115. if (exp->right.type==STRING_ST){
  116. re=(regex_t*)pkg_malloc(sizeof(regex_t));
  117. if (re==0){
  118. LM_CRIT("out of pkg memory\n");
  119. return E_OUT_OF_MEM;
  120. }
  121. if (regcomp(re, (char*) exp->right.v.data,
  122. REG_EXTENDED|REG_NOSUB|REG_ICASE) ){
  123. LM_CRIT("bad re \"%s\"\n", (char*) exp->right.v.data);
  124. pkg_free(re);
  125. return E_BAD_RE;
  126. }
  127. /* replace the string with the re */
  128. pkg_free(exp->right.v.data);
  129. exp->right.v.data=re;
  130. exp->right.type=RE_ST;
  131. }else if (exp->right.type!=RE_ST
  132. && exp->right.type!=SCRIPTVAR_ST){
  133. LM_CRIT("invalid type for match\n");
  134. return E_BUG;
  135. }
  136. }
  137. if (exp->left.type==ACTION_O){
  138. ret=fix_actions((struct action*)exp->right.v.data);
  139. if (ret!=0){
  140. LM_CRIT("fix_actions error\n");
  141. return ret;
  142. }
  143. }
  144. if (exp->left.type==EXPR_O){
  145. ret=fix_expr(exp->left.v.expr);
  146. if (ret!=0){
  147. LM_CRIT("fix left exp error\n");
  148. return ret;
  149. }
  150. }
  151. if (exp->right.type==EXPR_ST){
  152. ret=fix_expr(exp->right.v.expr);
  153. if (ret!=0){
  154. LM_CRIT("fix rigth exp error\n");
  155. return ret;
  156. }
  157. }
  158. ret=0;
  159. }
  160. return ret;
  161. }
  162. /* adds the proxies in the proxy list & resolves the hostnames */
  163. /* returns 0 if ok, <0 on error */
  164. static int fix_actions(struct action* a)
  165. {
  166. struct action *t;
  167. int ret;
  168. cmd_export_t* cmd;
  169. struct hostent* he;
  170. struct ip_addr ip;
  171. struct socket_info* si;
  172. str host;
  173. int proto=PROTO_NONE, port;
  174. struct proxy_l *p;
  175. struct bl_head *blh;
  176. if (a==0){
  177. LM_CRIT("null pointer\n");
  178. return E_BUG;
  179. }
  180. for(t=a; t!=0; t=t->next){
  181. switch(t->type){
  182. case FORWARD_T:
  183. if (t->elem[0].type==NOSUBTYPE)
  184. break;
  185. case SEND_T:
  186. if (t->elem[0].type!=STRING_ST) {
  187. LM_CRIT("invalid type %d (should be string)\n", t->type);
  188. return E_BUG;
  189. }
  190. ret = parse_phostport( t->elem[0].u.string,
  191. strlen(t->elem[0].u.string),
  192. &host.s, &host.len, &port, &proto);
  193. if (ret!=0) {
  194. LM_ERR("ERROR:fix_actions: FORWARD/SEND bad "
  195. "argument\n");
  196. return E_CFG;
  197. }
  198. p = add_proxy( &host,(unsigned short)port, proto);
  199. if (p==0) {
  200. LM_ERR("forward/send failed to add proxy");
  201. return E_CFG;
  202. }
  203. t->elem[0].type = PROXY_ST;
  204. t->elem[0].u.data = (void*)p;
  205. break;
  206. case IF_T:
  207. if (t->elem[0].type!=EXPR_ST){
  208. LM_CRIT("invalid subtype %d for if (should be expr)\n",
  209. t->elem[0].type);
  210. return E_BUG;
  211. }else if( (t->elem[1].type!=ACTIONS_ST)
  212. &&(t->elem[1].type!=NOSUBTYPE) ){
  213. LM_CRIT("invalid subtype %d for if() {...} (should be"
  214. "action)\n", t->elem[1].type);
  215. return E_BUG;
  216. }else if( (t->elem[2].type!=ACTIONS_ST)
  217. &&(t->elem[2].type!=NOSUBTYPE) ){
  218. LM_CRIT("invalid subtype %d for if() {} else{...}(should"
  219. "be action)\n", t->elem[2].type);
  220. return E_BUG;
  221. }
  222. if (t->elem[0].u.data){
  223. if ((ret=fix_expr((struct expr*)t->elem[0].u.data))<0)
  224. return ret;
  225. }
  226. if ( (t->elem[1].type==ACTIONS_ST)&&(t->elem[1].u.data) ){
  227. if ((ret=fix_actions((struct action*)t->elem[1].u.data))<0)
  228. return ret;
  229. }
  230. if ( (t->elem[2].type==ACTIONS_ST)&&(t->elem[2].u.data) ){
  231. if((ret=fix_actions((struct action*)t->elem[2].u.data))<0)
  232. return ret;
  233. }
  234. break;
  235. case WHILE_T:
  236. if (t->elem[0].type!=EXPR_ST){
  237. LM_CRIT("invalid subtype %d for while (should be expr)\n",
  238. t->elem[0].type);
  239. return E_BUG;
  240. }else if( (t->elem[1].type!=ACTIONS_ST)
  241. &&(t->elem[1].type!=NOSUBTYPE) ){
  242. LM_CRIT("invalid subtype %d for while() {...} (should be"
  243. "action)\n", t->elem[1].type);
  244. return E_BUG;
  245. }
  246. if (t->elem[0].u.data){
  247. if ((ret=fix_expr((struct expr*)t->elem[0].u.data))<0)
  248. return ret;
  249. }
  250. if ( (t->elem[1].type==ACTIONS_ST)&&(t->elem[1].u.data) ){
  251. if ((ret=fix_actions((struct action*)t->elem[1].u.data))<0)
  252. return ret;
  253. }
  254. break;
  255. case SWITCH_T:
  256. if ( (t->elem[1].type==ACTIONS_ST)&&(t->elem[1].u.data) ){
  257. if ((ret=fix_actions((struct action*)t->elem[1].u.data))<0)
  258. return ret;
  259. }
  260. break;
  261. case CASE_T:
  262. if ( (t->elem[1].type==ACTIONS_ST)&&(t->elem[1].u.data) ){
  263. if ((ret=fix_actions((struct action*)t->elem[1].u.data))<0)
  264. return ret;
  265. }
  266. break;
  267. case DEFAULT_T:
  268. if ( (t->elem[0].type==ACTIONS_ST)&&(t->elem[0].u.data) ){
  269. if ((ret=fix_actions((struct action*)t->elem[0].u.data))<0)
  270. return ret;
  271. }
  272. break;
  273. case MODULE_T:
  274. cmd = (cmd_export_t*)t->elem[0].u.data;
  275. LM_DBG("fixing %s, line %d\n", cmd->name, t->line);
  276. if (cmd->fixup){
  277. if (cmd->param_no>0){
  278. ret=cmd->fixup(&t->elem[1].u.data, 1);
  279. t->elem[1].type=MODFIXUP_ST;
  280. if (ret<0) goto error;
  281. }
  282. if (cmd->param_no>1){
  283. ret=cmd->fixup(&t->elem[2].u.data, 2);
  284. t->elem[2].type=MODFIXUP_ST;
  285. if (ret<0) goto error;
  286. }
  287. if (cmd->param_no==0){
  288. ret=cmd->fixup( 0, 0);
  289. if (ret<0) goto error;
  290. }
  291. }
  292. break;
  293. case FORCE_SEND_SOCKET_T:
  294. if (t->elem[0].type!=SOCKID_ST){
  295. LM_CRIT("invalid subtype %d for force_send_socket\n",
  296. t->elem[0].type);
  297. return E_BUG;
  298. }
  299. he=resolvehost(((struct socket_id*)t->elem[0].u.data)->name,0);
  300. if (he==0){
  301. LM_ERR(" could not resolve %s\n",
  302. ((struct socket_id*)t->elem[0].u.data)->name);
  303. ret = E_BAD_ADDRESS;
  304. goto error;
  305. }
  306. hostent2ip_addr(&ip, he, 0);
  307. si=find_si(&ip, ((struct socket_id*)t->elem[0].u.data)->port,
  308. ((struct socket_id*)t->elem[0].u.data)->proto);
  309. if (si==0){
  310. LM_ERR("bad force_send_socket"
  311. " argument: %s:%d (ser doesn't listen on it)\n",
  312. ((struct socket_id*)t->elem[0].u.data)->name,
  313. ((struct socket_id*)t->elem[0].u.data)->port);
  314. ret = E_BAD_ADDRESS;
  315. goto error;
  316. }
  317. t->elem[0].u.data=si;
  318. t->elem[0].type=SOCKETINFO_ST;
  319. break;
  320. case SET_DEBUG_T:
  321. if (t->elem[0].type==NOSUBTYPE)
  322. break;
  323. if (t->elem[0].type!=NUMBER_ST) {
  324. LM_CRIT("fix_actions: BUG in setdebug() type %d\n",
  325. t->elem[0].type );
  326. ret=E_BUG;
  327. goto error;
  328. }
  329. /* normalize the value */
  330. if (t->elem[0].u.number>L_DBG)
  331. t->elem[0].u.number = L_DBG;
  332. else if (t->elem[0].u.number<L_ALERT)
  333. t->elem[0].u.number = L_ALERT;
  334. break;
  335. case SETFLAG_T:
  336. case RESETFLAG_T:
  337. case ISFLAGSET_T:
  338. if (t->elem[0].type!=NUMBER_ST) {
  339. LM_CRIT("bad xxxflag() type %d\n", t->elem[0].type );
  340. ret=E_BUG;
  341. goto error;
  342. }
  343. if (!flag_in_range( t->elem[0].u.number )) {
  344. ret=E_CFG;
  345. goto error;
  346. }
  347. break;
  348. case SETSFLAG_T:
  349. case RESETSFLAG_T:
  350. case ISSFLAGSET_T:
  351. if (t->elem[0].type!=NUMBER_ST) {
  352. LM_CRIT("bad xxxsflag() type %d\n", t->elem[0].type );
  353. ret=E_BUG;
  354. goto error;
  355. }
  356. t->elem[0].u.number = fixup_flag( t->elem[0].u.number );
  357. if (t->elem[0].u.data==0) {
  358. ret=E_CFG;
  359. goto error;
  360. }
  361. break;
  362. case SETBFLAG_T:
  363. case RESETBFLAG_T:
  364. case ISBFLAGSET_T:
  365. if (t->elem[0].type!=NUMBER_ST || t->elem[1].type!=NUMBER_ST) {
  366. LM_CRIT("bad xxxbflag() type "
  367. "%d,%d\n", t->elem[0].type, t->elem[0].type);
  368. ret=E_BUG;
  369. goto error;
  370. }
  371. t->elem[1].u.number = fixup_flag( t->elem[1].u.number );
  372. if (t->elem[1].u.data==0) {
  373. ret=E_CFG;
  374. goto error;
  375. }
  376. break;
  377. case EQ_T:
  378. case COLONEQ_T:
  379. case PLUSEQ_T:
  380. case MINUSEQ_T:
  381. case DIVEQ_T:
  382. case MULTEQ_T:
  383. case MODULOEQ_T:
  384. case BANDEQ_T:
  385. case BOREQ_T:
  386. case BXOREQ_T:
  387. if (t->elem[1].u.data){
  388. if ((ret=fix_expr((struct expr*)t->elem[1].u.data))<0)
  389. return ret;
  390. }
  391. break;
  392. case USE_BLACKLIST_T:
  393. if (t->elem[0].type!=STRING_ST) {
  394. LM_CRIT("bad USE_BLACKLIST type %d\n", t->elem[0].type);
  395. ret=E_BUG;
  396. goto error;
  397. }
  398. host.s = t->elem[0].u.string;
  399. host.len = strlen(host.s);
  400. blh = get_bl_head_by_name(&host);
  401. if (blh==NULL) {
  402. LM_ERR("USE_BLACKLIST - list "
  403. "%s not configured\n", t->elem[0].u.string);
  404. ret=E_CFG;
  405. goto error;
  406. }
  407. t->elem[0].type = BLACKLIST_ST;
  408. t->elem[0].u.data = blh;
  409. break;
  410. }
  411. }
  412. return 0;
  413. error:
  414. LM_ERR("fixing failed (code=%d) at cfg line %d\n", ret, t->line);
  415. return ret;
  416. }
  417. inline static int comp_no( int port, void *param, int op, int subtype )
  418. {
  419. if (subtype!=NUMBER_ST) {
  420. LM_CRIT("number expected: %d\n", subtype );
  421. return E_BUG;
  422. }
  423. switch (op){
  424. case EQUAL_OP:
  425. return port==(long)param;
  426. case DIFF_OP:
  427. return port!=(long)param;
  428. case GT_OP:
  429. return port>(long)param;
  430. case LT_OP:
  431. return port<(long)param;
  432. case GTE_OP:
  433. return port>=(long)param;
  434. case LTE_OP:
  435. return port<=(long)param;
  436. default:
  437. LM_CRIT("unknown operator: %d\n", op );
  438. return E_BUG;
  439. }
  440. }
  441. /* eval_elem helping function, returns str op param */
  442. inline static int comp_strval(struct sip_msg *msg, int op, str* ival,
  443. operand_t *opd)
  444. {
  445. int ret;
  446. regex_t* re;
  447. char backup;
  448. char backup2;
  449. str res;
  450. pv_value_t value;
  451. if(ival==NULL || ival->s==NULL || ival->len == 0)
  452. goto error;
  453. res.s = 0; res.len = 0;
  454. if(opd->type == SCRIPTVAR_ST)
  455. {
  456. if(pv_get_spec_value(msg, opd->v.spec, &value)!=0)
  457. {
  458. LM_CRIT("cannot get var value\n");
  459. goto error;
  460. }
  461. if(value.flags&PV_VAL_STR)
  462. {
  463. res = value.rs;
  464. } else {
  465. res.s = sint2str(value.ri, &res.len);
  466. }
  467. } else if(opd->type == NUMBER_ST) {
  468. res.s = sint2str(opd->v.n, &res.len);
  469. }else if(opd->type == STRING_ST) {
  470. res = opd->v.s;
  471. } else {
  472. if((op!=MATCH_OP && op!=NOTMATCH_OP) || opd->type != RE_ST)
  473. {
  474. LM_CRIT("invalid operation %d/%d\n", op, opd->type);
  475. goto error;
  476. }
  477. }
  478. ret=-1;
  479. switch(op){
  480. case EQUAL_OP:
  481. if(ival->len != res.len) return 0;
  482. ret=(strncasecmp(ival->s, res.s, ival->len)==0);
  483. break;
  484. case DIFF_OP:
  485. if(ival->len != res.len) return 1;
  486. ret=(strncasecmp(ival->s, res.s, ival->len)!=0);
  487. break;
  488. case MATCH_OP:
  489. case NOTMATCH_OP:
  490. backup=ival->s[ival->len];ival->s[ival->len]='\0';
  491. if(opd->type == SCRIPTVAR_ST) {
  492. re=(regex_t*)pkg_malloc(sizeof(regex_t));
  493. if (re==0){
  494. LM_CRIT("pkg memory allocation failure\n");
  495. ival->s[ival->len]=backup;
  496. goto error;
  497. }
  498. backup2 = res.s[res.len];res.s[res.len] = '\0';
  499. if (regcomp(re, res.s, REG_EXTENDED|REG_NOSUB|REG_ICASE)) {
  500. pkg_free(re);
  501. res.s[res.len] = backup2;
  502. ival->s[ival->len]=backup;
  503. goto error;
  504. }
  505. ret=(regexec(re, ival->s, 0, 0, 0)==0);
  506. regfree(re);
  507. pkg_free(re);
  508. res.s[res.len] = backup2;
  509. } else {
  510. ret=(regexec((regex_t*)opd->v.data, ival->s, 0, 0, 0)==0);
  511. }
  512. ival->s[ival->len]=backup;
  513. if(op==NOTMATCH_OP)
  514. ret = !ret;
  515. break;
  516. default:
  517. LM_CRIT("unknown op %d\n", op);
  518. goto error;
  519. }
  520. return ret;
  521. error:
  522. return -1;
  523. }
  524. /* eval_elem helping function, returns str op param */
  525. inline static int comp_str(char* str, void* param, int op, int subtype)
  526. {
  527. int ret;
  528. ret=-1;
  529. switch(op){
  530. case EQUAL_OP:
  531. if (subtype!=STRING_ST){
  532. LM_CRIT("bad type %d, string expected\n", subtype);
  533. goto error;
  534. }
  535. ret=(strcasecmp(str, (char*)param)==0);
  536. break;
  537. case DIFF_OP:
  538. if (subtype!=STRING_ST){
  539. LM_CRIT("bad type %d, string expected\n", subtype);
  540. goto error;
  541. }
  542. ret=(strcasecmp(str, (char*)param)!=0);
  543. break;
  544. case MATCH_OP:
  545. if (subtype!=RE_ST){
  546. LM_CRIT("bad type %d, RE expected\n", subtype);
  547. goto error;
  548. }
  549. ret=(regexec((regex_t*)param, str, 0, 0, 0)==0);
  550. break;
  551. case NOTMATCH_OP:
  552. if (subtype!=RE_ST){
  553. LM_CRIT("bad type %d, RE expected!\n", subtype);
  554. goto error;
  555. }
  556. ret=(regexec((regex_t*)param, str, 0, 0, 0)!=0);
  557. break;
  558. default:
  559. LM_CRIT("unknown op %d\n", op);
  560. goto error;
  561. }
  562. return ret;
  563. error:
  564. return -1;
  565. }
  566. /* check_self wrapper -- it checks also for the op */
  567. inline static int check_self_op(int op, str* s, unsigned short p)
  568. {
  569. int ret;
  570. ret=check_self(s, p, 0);
  571. switch(op){
  572. case EQUAL_OP:
  573. break;
  574. case DIFF_OP:
  575. if (ret>=0) ret=!ret;
  576. break;
  577. default:
  578. LM_CRIT("invalid operator %d\n", op);
  579. ret=-1;
  580. }
  581. return ret;
  582. }
  583. /* eval_elem helping function, returns an op param */
  584. inline static int comp_ip(struct sip_msg *msg, int op, struct ip_addr* ip,
  585. operand_t *opd)
  586. {
  587. struct hostent* he;
  588. char ** h;
  589. int ret;
  590. str tmp;
  591. ret=-1;
  592. switch(opd->type){
  593. case NET_ST:
  594. switch(op){
  595. case EQUAL_OP:
  596. ret=(matchnet(ip, (struct net*)opd->v.data)==1);
  597. break;
  598. case DIFF_OP:
  599. ret=(matchnet(ip, (struct net*)opd->v.data)!=1);
  600. break;
  601. default:
  602. goto error_op;
  603. }
  604. break;
  605. case STRING_ST:
  606. case RE_ST:
  607. switch(op){
  608. case EQUAL_OP:
  609. case MATCH_OP:
  610. /* 1: compare with ip2str*/
  611. ret=comp_str(ip_addr2a(ip), opd->v.data, op, opd->type);
  612. if (ret==1) break;
  613. /* 2: resolve (name) & compare w/ all the ips */
  614. if (opd->type==STRING_ST){
  615. he=resolvehost((char*)opd->v.data,0);
  616. if (he==0){
  617. LM_DBG("could not resolve %s\n",(char*)opd->v.data);
  618. }else if (he->h_addrtype==(int)ip->af){
  619. for(h=he->h_addr_list;(ret!=1)&& (*h); h++){
  620. ret=(memcmp(ip->u.addr, *h, ip->len)==0);
  621. }
  622. if (ret==1) break;
  623. }
  624. }
  625. /* 3: (slow) rev dns the address
  626. * and compare with all the aliases
  627. * !!??!! review: remove this? */
  628. if(received_dns & DO_REV_DNS)
  629. {
  630. he=rev_resolvehost(ip);
  631. if (he==0){
  632. print_ip( "comp_ip: could not rev_resolve ip "
  633. " address: ", ip, "\n");
  634. ret=0;
  635. }else{
  636. /* compare with primary host name */
  637. ret=comp_str(he->h_name, opd->v.data, op,
  638. opd->type);
  639. /* compare with all the aliases */
  640. for(h=he->h_aliases; (ret!=1) && (*h); h++){
  641. ret=comp_str(*h, opd->v.data, op, opd->type);
  642. }
  643. }
  644. } else {
  645. ret = 0;
  646. }
  647. break;
  648. case DIFF_OP:
  649. ret=comp_ip(msg, op, ip, opd);
  650. if (ret>=0) ret=!ret;
  651. break;
  652. default:
  653. goto error_op;
  654. }
  655. break;
  656. case MYSELF_ST: /* check if it's one of our addresses*/
  657. tmp.s=ip_addr2a(ip);
  658. tmp.len=strlen(tmp.s);
  659. ret=check_self_op(op, &tmp, 0);
  660. break;
  661. default:
  662. LM_CRIT("invalid type for src_ip or dst_ip (%d)\n", opd->type);
  663. ret=-1;
  664. }
  665. return ret;
  666. error_op:
  667. LM_CRIT("invalid operator %d\n", op);
  668. return -1;
  669. }
  670. /*! \brief compare str to regexp */
  671. inline static int comp_s2r(int op, str *s1, regex_t *re)
  672. {
  673. char backup;
  674. int ret;
  675. ret = -1;
  676. /* if string is NULL return FALSE */
  677. if(s1->len == 0 || s1->s==NULL || re==NULL)
  678. return 0;
  679. switch(op)
  680. {
  681. case MATCH_OP:
  682. backup = s1->s[s1->len]; s1->s[s1->len] = '\0';
  683. ret=(regexec(re, s1->s, 0, 0, 0)==0);
  684. s1->s[s1->len] = backup;
  685. break;
  686. case NOTMATCH_OP:
  687. backup = s1->s[s1->len]; s1->s[s1->len] = '\0';
  688. ret=(regexec(re, s1->s, 0, 0, 0)!=0);
  689. s1->s[s1->len] = backup;
  690. break;
  691. default:
  692. LM_CRIT("unknown op %d\n", op);
  693. }
  694. return ret;
  695. }
  696. /* compare str to str */
  697. inline static int comp_s2s(int op, str *s1, str *s2)
  698. {
  699. char backup;
  700. char backup2;
  701. int n;
  702. int rt;
  703. int ret;
  704. regex_t* re;
  705. ret = -1;
  706. /* if any of values is NULL return FALSE */
  707. if(s1->s==NULL || s2->s==NULL)
  708. return 0;
  709. switch(op) {
  710. case EQUAL_OP:
  711. if(s1->len != s2->len) return 0;
  712. ret=(strncasecmp(s1->s, s2->s, s2->len)==0);
  713. break;
  714. case DIFF_OP:
  715. if(s1->len != s2->len) return 1;
  716. ret=(strncasecmp(s1->s, s2->s, s2->len)!=0);
  717. break;
  718. case GT_OP:
  719. n = (s1->len>=s2->len)?s1->len:s2->len;
  720. rt = strncasecmp(s1->s,s2->s, n);
  721. if (rt>0)
  722. ret = 1;
  723. else if(rt==0 && s1->len>s1->len)
  724. ret = 1;
  725. else ret = 0;
  726. break;
  727. case GTE_OP:
  728. n = (s1->len>=s2->len)?s1->len:s2->len;
  729. rt = strncasecmp(s1->s,s2->s, n);
  730. if (rt>0)
  731. ret = 1;
  732. else if(rt==0 && s1->len>=s1->len)
  733. ret = 1;
  734. else ret = 0;
  735. break;
  736. case LT_OP:
  737. n = (s1->len>=s2->len)?s1->len:s2->len;
  738. rt = strncasecmp(s1->s,s2->s, n);
  739. if (rt<0)
  740. ret = 1;
  741. else if(rt==0 && s1->len<s1->len)
  742. ret = 1;
  743. else ret = 0;
  744. break;
  745. case LTE_OP:
  746. n = (s1->len>=s2->len)?s1->len:s2->len;
  747. rt = strncasecmp(s1->s,s2->s, n);
  748. if (rt<0)
  749. ret = 1;
  750. else if(rt==0 && s1->len<=s1->len)
  751. ret = 1;
  752. else ret = 0;
  753. break;
  754. case MATCHD_OP:
  755. case NOTMATCHD_OP:
  756. if(s1->len == 0 || s2->len == 0) return 0;
  757. re=(regex_t*)pkg_malloc(sizeof(regex_t));
  758. if (re==0) {
  759. LM_CRIT("pkg memory allocation failure\n");
  760. return -1;
  761. }
  762. backup = s1->s[s1->len]; s1->s[s1->len] = '\0';
  763. backup2 = s2->s[s2->len]; s2->s[s2->len] = '\0';
  764. if (regcomp(re, s2->s, REG_EXTENDED|REG_NOSUB|REG_ICASE)) {
  765. pkg_free(re);
  766. s2->s[s2->len] = backup2;
  767. s1->s[s1->len] = backup;
  768. return -1;
  769. }
  770. if(op==MATCHD_OP)
  771. ret=(regexec(re, s1->s, 0, 0, 0)==0);
  772. else
  773. ret=(regexec(re, s1->s, 0, 0, 0)!=0);
  774. regfree(re);
  775. pkg_free(re);
  776. s2->s[s2->len] = backup2;
  777. s1->s[s1->len] = backup;
  778. break;
  779. default:
  780. LM_CRIT("unknown op %d\n", op);
  781. }
  782. return ret;
  783. }
  784. /* compare nr to nr */
  785. inline static int comp_n2n(int op, int n1, int n2)
  786. {
  787. switch(op) {
  788. case EQUAL_OP:
  789. case MATCH_OP:
  790. case MATCHD_OP:
  791. if(n1 == n2)
  792. return 1;
  793. return 0;
  794. case NOTMATCH_OP:
  795. case NOTMATCHD_OP:
  796. case DIFF_OP:
  797. if(n1 != n2)
  798. return 1;
  799. return 0;
  800. case GT_OP:
  801. if(n1 > n2)
  802. return 1;
  803. return 0;
  804. case GTE_OP:
  805. if(n1 >= n2)
  806. return 1;
  807. return 0;
  808. case LT_OP:
  809. if(n1 < n2)
  810. return 1;
  811. return 0;
  812. case LTE_OP:
  813. if(n1 <= n2)
  814. return 1;
  815. return 0;
  816. default:
  817. LM_CRIT("unknown op %d\n", op);
  818. }
  819. return -1;
  820. }
  821. inline static int comp_scriptvar(struct sip_msg *msg, int op, operand_t *left,
  822. operand_t *right)
  823. {
  824. str lstr;
  825. str rstr;
  826. int ln;
  827. int rn;
  828. pv_value_t lvalue;
  829. pv_value_t rvalue;
  830. int type;
  831. lstr.s = 0; lstr.len = 0;
  832. rstr.s = 0; rstr.len = 0;
  833. ln = 0; rn =0;
  834. if(pv_get_spec_value(msg, left->v.spec, &lvalue)!=0)
  835. {
  836. LM_CRIT("cannot get left var value\n");
  837. goto error;
  838. }
  839. if(right->type==NULLV_ST)
  840. {
  841. if(op==EQUAL_OP)
  842. {
  843. if(lvalue.flags&PV_VAL_NULL)
  844. return 1;
  845. return 0;
  846. } else {
  847. if(lvalue.flags&PV_VAL_NULL)
  848. return 0;
  849. return 1;
  850. }
  851. }
  852. lstr = lvalue.rs;
  853. ln = lvalue.ri;
  854. type = 0;
  855. if(right->type == SCRIPTVAR_ST)
  856. {
  857. if(pv_get_spec_value(msg, right->v.spec, &rvalue)!=0)
  858. {
  859. LM_CRIT("cannot get right var value\n");
  860. goto error;
  861. }
  862. if(rvalue.flags&PV_VAL_NULL || lvalue.flags&PV_VAL_NULL ) {
  863. if (rvalue.flags&PV_VAL_NULL && lvalue.flags&PV_VAL_NULL )
  864. return (op==EQUAL_OP)?1:0;
  865. return (op==DIFF_OP)?1:0;
  866. }
  867. if(op==MATCH_OP||op==NOTMATCH_OP)
  868. {
  869. if(!((rvalue.flags&PV_VAL_STR) && (lvalue.flags&PV_VAL_STR)))
  870. {
  871. LM_CRIT("invalid operation %d/%d\n", op, right->type);
  872. goto error;
  873. }
  874. if(op==MATCH_OP)
  875. return comp_s2s(MATCHD_OP, &lstr, &rvalue.rs);
  876. else
  877. return comp_s2s(NOTMATCHD_OP, &lstr, &rvalue.rs);
  878. }
  879. if((rvalue.flags&PV_VAL_INT) && (lvalue.flags&PV_VAL_INT)) {
  880. /* comparing int */
  881. rn = rvalue.ri;
  882. type =2;
  883. } else if((rvalue.flags&PV_VAL_STR) && (lvalue.flags&PV_VAL_STR)) {
  884. /* comparing string */
  885. rstr = rvalue.rs;
  886. type =1;
  887. } else {
  888. LM_CRIT("invalid operation %d/%d!\n", op,
  889. right->type);
  890. goto error;
  891. }
  892. } else {
  893. /* null against a not-null constant */
  894. if(lvalue.flags&PV_VAL_NULL)
  895. return (op==DIFF_OP || op==NOTMATCH_OP || op==NOTMATCHD_OP)?1:0;
  896. if(right->type == NUMBER_ST) {
  897. if(!(lvalue.flags&PV_VAL_INT))
  898. {
  899. LM_CRIT("invalid operation %d/%d/%d!!\n", op,
  900. right->type, lvalue.flags);
  901. goto error;
  902. }
  903. /* comparing int */
  904. type =2;
  905. rn = right->v.n;
  906. } else if(right->type == STRING_ST) {
  907. if(!(lvalue.flags&PV_VAL_STR))
  908. {
  909. LM_CRIT("invalid operation %d/%d!!!\n", op, right->type);
  910. goto error;
  911. }
  912. /* comparing string */
  913. type =1;
  914. rstr = right->v.s;
  915. } else {
  916. /* comparing others */
  917. type = 0;
  918. }
  919. if(op==MATCH_OP || op==NOTMATCH_OP)
  920. {
  921. if(!(lvalue.flags&PV_VAL_STR) || right->type != RE_ST)
  922. {
  923. LM_CRIT("invalid operation %d/%d\n", op, right->type);
  924. goto error;
  925. }
  926. return comp_s2r(op, &lstr, (regex_t*)right->v.expr);
  927. }
  928. }
  929. if(type==1) { /* compare str */
  930. LM_DBG("str %d : %.*s\n", op, lstr.len, ZSW(lstr.s));
  931. return comp_s2s(op, &lstr, &rstr);
  932. } else if(type==2) {
  933. LM_DBG("int %d : %d / %d\n", op, ln, rn);
  934. return comp_n2n(op, ln, rn);
  935. } else {
  936. LM_CRIT("invalid operation %d/%d\n", op, right->type);
  937. }
  938. error:
  939. return -1;
  940. }
  941. /* returns: 0/1 (false/true) or -1 on error, -127 EXPR_DROP */
  942. static int eval_elem(struct expr* e, struct sip_msg* msg, pv_value_t *val)
  943. {
  944. struct sip_uri uri;
  945. int ret;
  946. int retl;
  947. int retr;
  948. int ival;
  949. pv_value_t lval;
  950. pv_value_t rval;
  951. char *p;
  952. ret=E_BUG;
  953. if (e->type!=ELEM_T){
  954. LM_CRIT("invalid type\n");
  955. goto error;
  956. }
  957. if(val) memset(val, 0, sizeof(pv_value_t));
  958. switch(e->left.type){
  959. case METHOD_O:
  960. ret=comp_strval(msg, e->op, &msg->first_line.u.request.method,
  961. &e->right);
  962. break;
  963. case URI_O:
  964. if(msg->new_uri.s){
  965. if (e->right.type==MYSELF_ST){
  966. if (parse_sip_msg_uri(msg)<0) ret=-1;
  967. else ret=check_self_op(e->op, &msg->parsed_uri.host,
  968. msg->parsed_uri.port_no?
  969. msg->parsed_uri.port_no:SIP_PORT);
  970. }else{
  971. ret=comp_strval(msg, e->op, &msg->new_uri, &e->right);
  972. }
  973. }else{
  974. if (e->right.type==MYSELF_ST){
  975. if (parse_sip_msg_uri(msg)<0) ret=-1;
  976. else ret=check_self_op(e->op, &msg->parsed_uri.host,
  977. msg->parsed_uri.port_no?
  978. msg->parsed_uri.port_no:SIP_PORT);
  979. }else{
  980. ret=comp_strval(msg, e->op,
  981. &msg->first_line.u.request.uri,
  982. &e->right);
  983. }
  984. }
  985. break;
  986. case FROM_URI_O:
  987. if (parse_from_header(msg)<0){
  988. LM_ERR("bad or missing From: header\n");
  989. goto error;
  990. }
  991. if (e->right.type==MYSELF_ST){
  992. if (parse_uri(get_from(msg)->uri.s, get_from(msg)->uri.len,
  993. &uri) < 0){
  994. LM_ERR("bad uri in From:\n");
  995. goto error;
  996. }
  997. ret=check_self_op(e->op, &uri.host,
  998. uri.port_no?uri.port_no:SIP_PORT);
  999. }else{
  1000. ret=comp_strval(msg, e->op, &get_from(msg)->uri,
  1001. &e->right);
  1002. }
  1003. break;
  1004. case TO_URI_O:
  1005. if ((msg->to==0) && ((parse_headers(msg, HDR_TO_F, 0)==-1) ||
  1006. (msg->to==0))){
  1007. LM_ERR("bad or missing To: header\n");
  1008. goto error;
  1009. }
  1010. /* to content is parsed automatically */
  1011. if (e->right.type==MYSELF_ST){
  1012. if (parse_uri(get_to(msg)->uri.s, get_to(msg)->uri.len,
  1013. &uri) < 0){
  1014. LM_ERR("bad uri in To:\n");
  1015. goto error;
  1016. }
  1017. ret=check_self_op(e->op, &uri.host,
  1018. uri.port_no?uri.port_no:SIP_PORT);
  1019. }else{
  1020. ret=comp_strval(msg, e->op, &get_to(msg)->uri,
  1021. &e->right);
  1022. }
  1023. break;
  1024. case SRCIP_O:
  1025. ret=comp_ip(msg, e->op, &msg->rcv.src_ip, &e->right);
  1026. break;
  1027. case DSTIP_O:
  1028. ret=comp_ip(msg, e->op, &msg->rcv.dst_ip, &e->right);
  1029. break;
  1030. case NUMBER_O:
  1031. ret=!(!e->right.v.n); /* !! to transform it in {0,1} */
  1032. break;
  1033. case ACTION_O:
  1034. ret=run_action_list( (struct action*)e->right.v.data, msg);
  1035. if(val)
  1036. {
  1037. val->flags = PV_TYPE_INT|PV_VAL_INT;
  1038. val->ri = ret;
  1039. }
  1040. if (ret<=0) ret=(ret==0)?EXPR_DROP:0;
  1041. else ret=1;
  1042. return ret;
  1043. case EXPR_O:
  1044. retl = retr = 0;
  1045. memset(&lval, 0, sizeof(pv_value_t));
  1046. memset(&rval, 0, sizeof(pv_value_t));
  1047. if(e->left.v.data)
  1048. retl=eval_expr((struct expr*)e->left.v.data,msg,&lval);
  1049. if(lval.flags == PV_VAL_NONE)
  1050. {
  1051. pv_value_destroy(&lval);
  1052. pv_value_destroy(&rval);
  1053. return 0;
  1054. }
  1055. if(e->op == BNOT_OP)
  1056. {
  1057. if(lval.flags&PV_VAL_INT)
  1058. {
  1059. if(val!=NULL)
  1060. {
  1061. val->flags = PV_TYPE_INT|PV_VAL_INT;
  1062. val->ri = ~lval.ri;
  1063. }
  1064. pv_value_destroy(&lval);
  1065. pv_value_destroy(&rval);
  1066. return (val->ri)?1:0;
  1067. }
  1068. LM_ERR("binary NOT on non-numeric value\n");
  1069. pv_value_destroy(&lval);
  1070. pv_value_destroy(&rval);
  1071. return 0;
  1072. }
  1073. if(e->right.v.data)
  1074. retr=eval_expr((struct expr*)e->right.v.data,msg,&rval);
  1075. if(lval.flags&PV_TYPE_INT)
  1076. {
  1077. if(!(rval.flags&PV_VAL_INT))
  1078. {
  1079. LM_ERR("invalid numeric operands\n");
  1080. pv_value_destroy(&lval);
  1081. pv_value_destroy(&rval);
  1082. return 0;
  1083. }
  1084. if(val!=NULL)
  1085. val->flags = PV_TYPE_INT|PV_VAL_INT;
  1086. ival = 0;
  1087. switch(e->op) {
  1088. case PLUS_OP:
  1089. ival = lval.ri + rval.ri;
  1090. break;
  1091. case MINUS_OP:
  1092. ival = lval.ri - rval.ri;
  1093. break;
  1094. case DIV_OP:
  1095. if(rval.ri==0)
  1096. {
  1097. LM_ERR("divide by 0\n");
  1098. pv_value_destroy(&lval);
  1099. pv_value_destroy(&rval);
  1100. return 0;
  1101. } else
  1102. ival = lval.ri / rval.ri;
  1103. break;
  1104. case MULT_OP:
  1105. ival = lval.ri * rval.ri;
  1106. break;
  1107. case MODULO_OP:
  1108. if(rval.ri==0)
  1109. {
  1110. LM_ERR("divide by 0\n");
  1111. pv_value_destroy(&lval);
  1112. pv_value_destroy(&rval);
  1113. return 0;
  1114. } else
  1115. ival = lval.ri % rval.ri;
  1116. break;
  1117. case BAND_OP:
  1118. ival = lval.ri & rval.ri;
  1119. break;
  1120. case BOR_OP:
  1121. ival = lval.ri | rval.ri;
  1122. break;
  1123. case BXOR_OP:
  1124. ival = lval.ri ^ rval.ri;
  1125. break;
  1126. default:
  1127. LM_ERR("invalid int op %d\n", e->op);
  1128. val->ri = 0;
  1129. pv_value_destroy(&lval);
  1130. pv_value_destroy(&rval);
  1131. return 0;
  1132. }
  1133. pv_value_destroy(&lval);
  1134. pv_value_destroy(&rval);
  1135. if(val!=NULL) val->ri = ival;
  1136. return (ival)?1:0;
  1137. } else {
  1138. if(!(rval.flags&PV_VAL_STR))
  1139. {
  1140. LM_ERR("invalid string operands\n");
  1141. pv_value_destroy(&lval);
  1142. pv_value_destroy(&rval);
  1143. return 0;
  1144. }
  1145. if(e->op != PLUS_OP)
  1146. {
  1147. LM_ERR("invalid string operator %d\n", e->op);
  1148. pv_value_destroy(&lval);
  1149. pv_value_destroy(&rval);
  1150. return 0;
  1151. }
  1152. if(val==NULL)
  1153. {
  1154. ret = (lval.rs.len>0 || rval.rs.len>0);
  1155. pv_value_destroy(&lval);
  1156. pv_value_destroy(&rval);
  1157. return ret;
  1158. }
  1159. val->rs.s=(char*)pkg_malloc((lval.rs.len+rval.rs.len+1)
  1160. *sizeof(char));
  1161. if(val->rs.s==0)
  1162. {
  1163. LM_ERR("no more memory\n");
  1164. pv_value_destroy(&lval);
  1165. pv_value_destroy(&rval);
  1166. return 0;
  1167. }
  1168. val->flags = PV_VAL_PKG|PV_VAL_STR;
  1169. memcpy(val->rs.s, lval.rs.s, lval.rs.len);
  1170. memcpy(val->rs.s+lval.rs.len, rval.rs.s, rval.rs.len);
  1171. val->rs.len = lval.rs.len + rval.rs.len;
  1172. val->rs.s[val->rs.len] = '\0';
  1173. pv_value_destroy(&lval);
  1174. pv_value_destroy(&rval);
  1175. return 1;
  1176. }
  1177. break;
  1178. case SRCPORT_O:
  1179. ret=comp_no(msg->rcv.src_port,
  1180. e->right.v.data, /* e.g., 5060 */
  1181. e->op, /* e.g. == */
  1182. e->right.type /* 5060 is number */);
  1183. break;
  1184. case DSTPORT_O:
  1185. ret=comp_no(msg->rcv.dst_port, e->right.v.data, e->op,
  1186. e->right.type);
  1187. break;
  1188. case PROTO_O:
  1189. ret=comp_no(msg->rcv.proto, e->right.v.data, e->op,
  1190. e->right.type);
  1191. break;
  1192. case AF_O:
  1193. ret=comp_no(msg->rcv.src_ip.af, e->right.v.data, e->op,
  1194. e->right.type);
  1195. break;
  1196. case RETCODE_O:
  1197. ret=comp_no(return_code, e->right.v.data, e->op,
  1198. e->right.type);
  1199. break;
  1200. case MSGLEN_O:
  1201. ret=comp_no(msg->len, e->right.v.data, e->op,
  1202. e->right.type);
  1203. break;
  1204. case STRINGV_O:
  1205. if(val) {
  1206. val->flags = PV_VAL_STR;
  1207. val->rs = e->left.v.s;
  1208. }
  1209. /* optimization for no dup ?!?! */
  1210. return (e->left.v.s.len>0)?1:0;
  1211. case NUMBERV_O:
  1212. if(val) {
  1213. val->flags = PV_TYPE_INT|PV_VAL_INT;
  1214. val->ri = e->left.v.n;
  1215. }
  1216. ret=!(!e->left.v.n); /* !! to transform it in {0,1} */
  1217. return ret;
  1218. case SCRIPTVAR_O:
  1219. if(e->op==NO_OP)
  1220. {
  1221. memset(&rval, 0, sizeof(pv_value_t));
  1222. if(pv_get_spec_value(msg, e->right.v.spec, &rval)==0)
  1223. {
  1224. if(rval.flags==PV_VAL_NONE || (rval.flags&PV_VAL_NULL)
  1225. || (rval.flags&PV_VAL_EMPTY)
  1226. || ((rval.flags&PV_TYPE_INT)&&rval.ri==0))
  1227. {
  1228. pv_value_destroy(&rval);
  1229. return 0;
  1230. }
  1231. if(rval.flags&PV_TYPE_INT)
  1232. {
  1233. pv_value_destroy(&rval);
  1234. return 1;
  1235. }
  1236. if(rval.rs.len!=0)
  1237. {
  1238. pv_value_destroy(&rval);
  1239. return 1;
  1240. }
  1241. pv_value_destroy(&rval);
  1242. }
  1243. return 0;
  1244. }
  1245. if(e->op==VALUE_OP)
  1246. {
  1247. if(pv_get_spec_value(msg, e->left.v.spec, &lval)==0)
  1248. {
  1249. if(val!=NULL)
  1250. memcpy(val, &lval, sizeof(pv_value_t));
  1251. if(lval.flags&PV_VAL_STR)
  1252. {
  1253. if(!((lval.flags&PV_VAL_PKG)
  1254. || (lval.flags&PV_VAL_SHM)))
  1255. {
  1256. if(val!=NULL)
  1257. {
  1258. /* do pkg duplicate */
  1259. p = (char*)pkg_malloc((val->rs.len+1)
  1260. *sizeof(char));
  1261. if(p==0)
  1262. {
  1263. LM_ERR("no more pkg memory\n");
  1264. memset(val, 0, sizeof(pv_value_t));
  1265. return 0;
  1266. }
  1267. memcpy(p, val->rs.s, val->rs.len);
  1268. p[val->rs.len] = 0;
  1269. val->rs.s = p;
  1270. val->flags|= PV_VAL_PKG;
  1271. }
  1272. }
  1273. return 1;
  1274. }
  1275. if(lval.flags==PV_VAL_NONE
  1276. || (lval.flags & PV_VAL_NULL)
  1277. || (lval.flags & PV_VAL_EMPTY))
  1278. return 0;
  1279. if(lval.flags&PV_TYPE_INT)
  1280. return (lval.ri!=0);
  1281. else
  1282. return (lval.rs.len>0);
  1283. }
  1284. return 0;
  1285. }
  1286. ret=comp_scriptvar(msg, e->op, &e->left, &e->right);
  1287. break;
  1288. default:
  1289. LM_CRIT("invalid operand %d\n", e->left.type);
  1290. }
  1291. if(val)
  1292. {
  1293. val->flags = PV_TYPE_INT|PV_VAL_INT;
  1294. val->ri = ret;
  1295. }
  1296. return ret;
  1297. error:
  1298. if(val)
  1299. {
  1300. val->flags = PV_TYPE_INT|PV_VAL_INT;
  1301. val->ri = -1;
  1302. }
  1303. return -1;
  1304. }
  1305. /* ret= 0/1 (true/false) , -1 on error or EXPR_DROP (-127) */
  1306. int eval_expr(struct expr* e, struct sip_msg* msg, pv_value_t *val)
  1307. {
  1308. static int rec_lev=0;
  1309. int ret;
  1310. rec_lev++;
  1311. if (rec_lev>MAX_REC_LEV){
  1312. LM_CRIT("too many expressions (%d)\n", rec_lev);
  1313. ret=-1;
  1314. goto skip;
  1315. }
  1316. if (e->type==ELEM_T){
  1317. ret=eval_elem(e, msg, val);
  1318. }else if (e->type==EXP_T){
  1319. switch(e->op){
  1320. case AND_OP:
  1321. ret=eval_expr(e->left.v.expr, msg, val);
  1322. /* if error or false stop evaluating the rest */
  1323. if (ret!=1) break;
  1324. ret=eval_expr(e->right.v.expr, msg, val); /*ret1 is 1*/
  1325. break;
  1326. case OR_OP:
  1327. ret=eval_expr(e->left.v.expr, msg, val);
  1328. /* if true or error stop evaluating the rest */
  1329. if (ret!=0) break;
  1330. ret=eval_expr(e->right.v.expr, msg, val); /* ret1 is 0 */
  1331. break;
  1332. case NOT_OP:
  1333. ret=eval_expr(e->left.v.expr, msg, val);
  1334. if (ret<0) break;
  1335. ret= ! ret;
  1336. break;
  1337. case EVAL_OP:
  1338. ret=eval_expr(e->left.v.expr, msg, val);
  1339. break;
  1340. default:
  1341. LM_CRIT("unknown op %d\n", e->op);
  1342. ret=-1;
  1343. }
  1344. }else{
  1345. LM_CRIT("unknown type %d\n", e->type);
  1346. ret=-1;
  1347. }
  1348. skip:
  1349. rec_lev--;
  1350. return ret;
  1351. }
  1352. /* adds an action list to head; a must be null terminated (last a->next=0))*/
  1353. void push(struct action* a, struct action** head)
  1354. {
  1355. struct action *t;
  1356. if (*head==0){
  1357. *head=a;
  1358. return;
  1359. }
  1360. for (t=*head; t->next;t=t->next);
  1361. t->next=a;
  1362. }
  1363. int add_actions(struct action* a, struct action** head)
  1364. {
  1365. int ret;
  1366. LM_DBG("fixing actions...\n");
  1367. if ((ret=fix_actions(a))!=0) goto error;
  1368. push(a,head);
  1369. return 0;
  1370. error:
  1371. return ret;
  1372. }
  1373. /* fixes all action tables */
  1374. /* returns 0 if ok , <0 on error */
  1375. int fix_rls(void)
  1376. {
  1377. int i,ret;
  1378. for(i=0;i<RT_NO;i++){
  1379. if(rlist[i]){
  1380. if ((ret=fix_actions(rlist[i]))!=0){
  1381. return ret;
  1382. }
  1383. }
  1384. }
  1385. for(i=0;i<ONREPLY_RT_NO;i++){
  1386. if(onreply_rlist[i]){
  1387. if ((ret=fix_actions(onreply_rlist[i]))!=0){
  1388. return ret;
  1389. }
  1390. }
  1391. }
  1392. for(i=0;i<FAILURE_RT_NO;i++){
  1393. if(failure_rlist[i]){
  1394. if ((ret=fix_actions(failure_rlist[i]))!=0){
  1395. return ret;
  1396. }
  1397. }
  1398. }
  1399. for(i=0;i<BRANCH_RT_NO;i++){
  1400. if(branch_rlist[i]){
  1401. if ((ret=fix_actions(branch_rlist[i]))!=0){
  1402. return ret;
  1403. }
  1404. }
  1405. }
  1406. if(error_rlist){
  1407. if ((ret=fix_actions(error_rlist))!=0){
  1408. return ret;
  1409. }
  1410. }
  1411. return 0;
  1412. }
  1413. static int rcheck_stack[RT_NO];
  1414. static int rcheck_stack_p = 0;
  1415. static int rcheck_status = 0;
  1416. static int check_actions(struct action *a, int r_type)
  1417. {
  1418. struct action *aitem;
  1419. cmd_export_t *fct;
  1420. int n;
  1421. for( ; a ; a=a->next ) {
  1422. switch (a->type) {
  1423. case ROUTE_T:
  1424. /* this route is already on the current path ? */
  1425. for( n=0 ; n<rcheck_stack_p ; n++ ) {
  1426. if (rcheck_stack[n]==(int)a->elem[0].u.number)
  1427. break;
  1428. }
  1429. if (n!=rcheck_stack_p)
  1430. break;
  1431. if (++rcheck_stack_p==RT_NO) {
  1432. LM_CRIT("stack overflow (%d)\n", rcheck_stack_p);
  1433. goto error;
  1434. }
  1435. rcheck_stack[rcheck_stack_p] = a->elem[0].u.number;
  1436. if (check_actions( rlist[a->elem[0].u.number], r_type)!=0)
  1437. goto error;
  1438. rcheck_stack_p--;
  1439. break;
  1440. case IF_T:
  1441. if (check_actions((struct action*)a->elem[1].u.data, r_type)!=0)
  1442. goto error;
  1443. if (check_actions((struct action*)a->elem[2].u.data, r_type)!=0)
  1444. goto error;
  1445. break;
  1446. case WHILE_T:
  1447. if (check_actions((struct action*)a->elem[1].u.data, r_type)!=0)
  1448. goto error;
  1449. break;
  1450. case SWITCH_T:
  1451. aitem = (struct action*)a->elem[1].u.data;
  1452. for( ; aitem ; aitem=aitem->next ) {
  1453. n = check_actions((struct action*)aitem->elem[1].u.data,
  1454. r_type);
  1455. if (n!=0) goto error;
  1456. }
  1457. break;
  1458. case MODULE_T:
  1459. /* do check :D */
  1460. fct = (cmd_export_t*)(a->elem[0].u.data);
  1461. if ( (fct->flags&r_type)!=r_type ) {
  1462. rcheck_status = -1;
  1463. LM_ERR("script function "
  1464. "\"%s\" (types=%d) does not support route type "
  1465. "(%d)\n",fct->name, fct->flags, r_type);
  1466. for( n=rcheck_stack_p-1; n>=0 ; n-- ) {
  1467. LM_ERR("route stack[%d]=%d\n",n,rcheck_stack[n]);
  1468. }
  1469. }
  1470. break;
  1471. default:
  1472. break;
  1473. }
  1474. }
  1475. return 0;
  1476. error:
  1477. return -1;
  1478. }
  1479. /* check all routing tables for compatiblity between
  1480. * route types and called module functions;
  1481. * returns 0 if ok , <0 on error */
  1482. int check_rls(void)
  1483. {
  1484. int i,ret;
  1485. rcheck_status = 0;
  1486. if(rlist[0]){
  1487. if ((ret=check_actions(rlist[0],REQUEST_ROUTE))!=0){
  1488. LM_ERR("check failed for main request route\n");
  1489. return ret;
  1490. }
  1491. }
  1492. for(i=0;i<ONREPLY_RT_NO;i++){
  1493. if(onreply_rlist[i]){
  1494. if ((ret=check_actions(onreply_rlist[i],ONREPLY_ROUTE))!=0){
  1495. LM_ERR("check failed for onreply_route[%d]\n",i);
  1496. return ret;
  1497. }
  1498. }
  1499. }
  1500. for(i=0;i<FAILURE_RT_NO;i++){
  1501. if(failure_rlist[i]){
  1502. if ((ret=check_actions(failure_rlist[i],FAILURE_ROUTE))!=0){
  1503. LM_ERR("check failed for failure_route[%d]\n",i);
  1504. return ret;
  1505. }
  1506. }
  1507. }
  1508. for(i=0;i<BRANCH_RT_NO;i++){
  1509. if(branch_rlist[i]){
  1510. if ((ret=check_actions(branch_rlist[i],BRANCH_ROUTE))!=0){
  1511. LM_ERR("check failed for branch_route[%d]\n",i);
  1512. return ret;
  1513. }
  1514. }
  1515. }
  1516. if(error_rlist){
  1517. if ((ret=check_actions(error_rlist,ERROR_ROUTE))!=0){
  1518. LM_ERR("check failed for error_route\n");
  1519. return ret;
  1520. }
  1521. }
  1522. return rcheck_status;
  1523. }
  1524. /* debug function, prints main routing table */
  1525. void print_rl(void)
  1526. {
  1527. int j;
  1528. for(j=0; j<RT_NO; j++){
  1529. if (rlist[j]==0){
  1530. if (j==0) LM_DBG("WARNING: the main routing table is empty\n");
  1531. continue;
  1532. }
  1533. LM_DBG("routing table %d:\n",j);
  1534. print_actions(rlist[j]);
  1535. LM_DBG("\n");
  1536. }
  1537. for(j=0; j<ONREPLY_RT_NO; j++){
  1538. if (onreply_rlist[j]==0){
  1539. continue;
  1540. }
  1541. LM_DBG("onreply routing table %d:\n",j);
  1542. print_actions(onreply_rlist[j]);
  1543. LM_DBG("\n");
  1544. }
  1545. for(j=0; j<FAILURE_RT_NO; j++){
  1546. if (failure_rlist[j]==0){
  1547. continue;
  1548. }
  1549. LM_DBG("failure routing table %d:\n",j);
  1550. print_actions(failure_rlist[j]);
  1551. LM_DBG("\n");
  1552. }
  1553. for(j=0; j<BRANCH_RT_NO; j++){
  1554. if (branch_rlist[j]==0){
  1555. continue;
  1556. }
  1557. LM_DBG("T-branch routing table %d:\n",j);
  1558. print_actions(branch_rlist[j]);
  1559. LM_DBG("\n");
  1560. }
  1561. }