app_lua_sr.c 20 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090
  1. /**
  2. * $Id$
  3. *
  4. * Copyright (C) 2010 Daniel-Constantin Mierla (asipto.com)
  5. *
  6. * This file is part of Kamailio, a free SIP server.
  7. *
  8. * Kamailio is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version
  12. *
  13. * Kamailio is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  21. *
  22. */
  23. #include <stdio.h>
  24. #include <unistd.h>
  25. #include <stdlib.h>
  26. #include <sys/stat.h>
  27. #include "../../sr_module.h"
  28. #include "../../dprint.h"
  29. #include "../../route_struct.h"
  30. #include "../../action.h"
  31. #include "../../ut.h"
  32. #include "../../mem/mem.h"
  33. #include "../../data_lump.h"
  34. #include "../../data_lump_rpl.h"
  35. #include "../../forward.h"
  36. #include "../../flags.h"
  37. #include "../../dset.h"
  38. #include "../../parser/parse_uri.h"
  39. #include "../../lib/kcore/cmpapi.h"
  40. #include "app_lua_api.h"
  41. #include "app_lua_sr.h"
  42. /**
  43. *
  44. */
  45. static int lua_sr_probe (lua_State *L)
  46. {
  47. LM_DBG("someone probing from lua\n");
  48. return 0;
  49. }
  50. /**
  51. *
  52. */
  53. static int lua_sr_dbg (lua_State *L)
  54. {
  55. char *txt;
  56. txt = (char*)lua_tostring(L, -1);
  57. if(txt!=NULL)
  58. LM_DBG("%s", txt);
  59. return 0;
  60. }
  61. /**
  62. *
  63. */
  64. static int lua_sr_err (lua_State *L)
  65. {
  66. char *txt;
  67. txt = (char*)lua_tostring(L, -1);
  68. if(txt!=NULL)
  69. LM_ERR("%s", txt);
  70. return 0;
  71. }
  72. /**
  73. *
  74. */
  75. static int lua_sr_log (lua_State *L)
  76. {
  77. char *txt;
  78. char *level;
  79. level = (char*)lua_tostring(L, -2);
  80. txt = (char*)lua_tostring(L, -1);
  81. if(txt!=NULL)
  82. {
  83. if(level==NULL)
  84. {
  85. LM_ERR("%s", txt);
  86. } else {
  87. if(strcasecmp(level, "warn")==0) {
  88. LM_WARN("%s", txt);
  89. } else if(strcasecmp(level, "crit")==0) {
  90. LM_CRIT("%s", txt);
  91. } else {
  92. LM_ERR("%s", txt);
  93. }
  94. }
  95. }
  96. return 0;
  97. }
  98. /**
  99. *
  100. */
  101. static int lua_sr_modf (lua_State *L)
  102. {
  103. int ret;
  104. char *luav[MAX_ACTIONS];
  105. char *argv[MAX_ACTIONS];
  106. int argc;
  107. int i;
  108. int mod_type;
  109. struct run_act_ctx ra_ctx;
  110. unsigned modver;
  111. struct action *act;
  112. sr31_cmd_export_t* expf;
  113. sr_lua_env_t *env_L;
  114. ret = 1;
  115. act = NULL;
  116. argc = 0;
  117. memset(luav, 0, MAX_ACTIONS*sizeof(char*));
  118. memset(argv, 0, MAX_ACTIONS*sizeof(char*));
  119. env_L = sr_lua_env_get();
  120. if(env_L->msg==NULL)
  121. goto error;
  122. #if 0
  123. app_lua_dump_stack(L);
  124. #endif
  125. argc = lua_gettop(L);
  126. if(argc==0)
  127. {
  128. LM_ERR("name of module function not provided\n");
  129. goto error;
  130. }
  131. if(argc>=MAX_ACTIONS)
  132. {
  133. LM_ERR("too many parameters\n");
  134. goto error;
  135. }
  136. /* first is function name, then parameters */
  137. for(i=1; i<=argc; i++)
  138. {
  139. if (!lua_isstring(L, i))
  140. {
  141. LM_ERR("invalid parameter type (%d)\n", i);
  142. goto error;
  143. }
  144. luav[i-1] = (char*)lua_tostring(L, i);
  145. }
  146. /* pkg copy only parameters */
  147. for(i=1; i<MAX_ACTIONS; i++)
  148. {
  149. if(luav[i]!=NULL)
  150. {
  151. argv[i] = (char*)pkg_malloc(strlen(luav[i])+1);
  152. if(argv[i]==NULL)
  153. {
  154. LM_ERR("no more pkg\n");
  155. goto error;
  156. }
  157. strcpy(argv[i], luav[i]);
  158. }
  159. }
  160. expf = find_export_record(luav[0], argc-1, 0, &modver);
  161. if (expf==NULL) {
  162. LM_ERR("function '%s' is not available\n", luav[0]);
  163. goto error;
  164. }
  165. /* check fixups */
  166. if (expf->fixup!=NULL && expf->free_fixup==NULL) {
  167. LM_ERR("function '%s' has fixup - cannot be used\n", luav[0]);
  168. goto error;
  169. }
  170. switch(expf->param_no) {
  171. case 0:
  172. mod_type = MODULE0_T;
  173. break;
  174. case 1:
  175. mod_type = MODULE1_T;
  176. break;
  177. case 2:
  178. mod_type = MODULE2_T;
  179. break;
  180. case 3:
  181. mod_type = MODULE3_T;
  182. break;
  183. case 4:
  184. mod_type = MODULE4_T;
  185. break;
  186. case 5:
  187. mod_type = MODULE5_T;
  188. break;
  189. case 6:
  190. mod_type = MODULE6_T;
  191. break;
  192. case VAR_PARAM_NO:
  193. mod_type = MODULEX_T;
  194. break;
  195. default:
  196. LM_ERR("unknown/bad definition for function '%s' (%d params)\n",
  197. luav[0], expf->param_no);
  198. goto error;
  199. }
  200. act = mk_action(mod_type, argc+1 /* number of (type, value) pairs */,
  201. MODEXP_ST, expf, /* function */
  202. NUMBER_ST, argc-1, /* parameter number */
  203. STRING_ST, argv[1], /* param. 1 */
  204. STRING_ST, argv[2], /* param. 2 */
  205. STRING_ST, argv[3], /* param. 3 */
  206. STRING_ST, argv[4], /* param. 4 */
  207. STRING_ST, argv[5], /* param. 5 */
  208. STRING_ST, argv[6] /* param. 6 */
  209. );
  210. if (act==NULL) {
  211. LM_ERR("action structure could not be created for '%s'\n", luav[0]);
  212. goto error;
  213. }
  214. /* handle fixups */
  215. if (expf->fixup) {
  216. if(argc==1)
  217. { /* no parameters */
  218. if(expf->fixup(0, 0)<0)
  219. {
  220. LM_ERR("Error in fixup (0) for '%s'\n", luav[0]);
  221. goto error;
  222. }
  223. } else {
  224. for(i=1; i<=argc; i++)
  225. {
  226. if(expf->fixup(&(act->val[i+1].u.data), i)<0)
  227. {
  228. LM_ERR("Error in fixup (%d) for '%s'\n", i, luav[0]);
  229. goto error;
  230. }
  231. act->val[i+1].type = MODFIXUP_ST;
  232. }
  233. }
  234. }
  235. init_run_actions_ctx(&ra_ctx);
  236. ret = do_action(&ra_ctx, act, env_L->msg);
  237. /* free fixups */
  238. if (expf->fixup) {
  239. for(i=1; i<=argc; i++)
  240. {
  241. if ((act->val[i+1].type == MODFIXUP_ST) && (act->val[i+1].u.data))
  242. {
  243. expf->free_fixup(&(act->val[i+1].u.data), i);
  244. }
  245. }
  246. }
  247. pkg_free(act);
  248. lua_pushinteger(L, ret);
  249. return 1;
  250. error:
  251. if(act!=NULL)
  252. pkg_free(act);
  253. for(i=0; i<MAX_ACTIONS; i++)
  254. {
  255. if(argv[i]!=NULL) pkg_free(argv[i]);
  256. argv[i] = 0;
  257. }
  258. lua_pushinteger(L, -1);
  259. return 1;
  260. }
  261. /**
  262. *
  263. */
  264. static int lua_sr_is_myself (lua_State *L)
  265. {
  266. str uri;
  267. struct sip_uri puri;
  268. int ret;
  269. uri.s = (char*)lua_tostring(L, -1);
  270. if(uri.s==NULL)
  271. {
  272. LM_ERR("invalid uri parameter\n");
  273. return app_lua_return_false(L);
  274. }
  275. uri.len = strlen(uri.s);
  276. if(uri.len>4 && (strncmp(uri.s, "sip:", 4)==0
  277. || strncmp(uri.s, "sips:", 5)==0))
  278. {
  279. if(parse_uri(uri.s, uri.len, &puri)!=0)
  280. {
  281. LM_ERR("failed to parse uri [%s]\n", uri.s);
  282. return app_lua_return_false(L);
  283. }
  284. ret = check_self(&puri.host, (puri.port.s)?puri.port_no:0,
  285. (puri.transport_val.s)?puri.proto:0);
  286. } else {
  287. ret = check_self(&uri, 0, 0);
  288. }
  289. if(ret==1)
  290. return app_lua_return_true(L);
  291. return app_lua_return_false(L);
  292. }
  293. /**
  294. *
  295. */
  296. static int lua_sr_setflag (lua_State *L)
  297. {
  298. int flag;
  299. sr_lua_env_t *env_L;
  300. env_L = sr_lua_env_get();
  301. flag = lua_tointeger(L, -1);
  302. if(env_L->msg==NULL)
  303. {
  304. LM_WARN("invalid parameters from Lua env\n");
  305. return app_lua_return_false(L);
  306. }
  307. if (!flag_in_range(flag))
  308. {
  309. LM_ERR("invalid flag parameter %d\n", flag);
  310. return app_lua_return_false(L);
  311. }
  312. setflag(env_L->msg, flag);
  313. return app_lua_return_true(L);
  314. }
  315. /**
  316. *
  317. */
  318. static int lua_sr_resetflag (lua_State *L)
  319. {
  320. int flag;
  321. sr_lua_env_t *env_L;
  322. env_L = sr_lua_env_get();
  323. flag = lua_tointeger(L, -1);
  324. if(env_L->msg==NULL)
  325. {
  326. LM_WARN("invalid parameters from Lua env\n");
  327. return app_lua_return_false(L);
  328. }
  329. if (!flag_in_range(flag))
  330. {
  331. LM_ERR("invalid flag parameter %d\n", flag);
  332. return app_lua_return_false(L);
  333. }
  334. resetflag(env_L->msg, flag);
  335. return app_lua_return_true(L);
  336. }
  337. /**
  338. *
  339. */
  340. static int lua_sr_isflagset (lua_State *L)
  341. {
  342. int flag;
  343. int ret;
  344. sr_lua_env_t *env_L;
  345. env_L = sr_lua_env_get();
  346. flag = lua_tointeger(L, -1);
  347. if(env_L->msg==NULL)
  348. {
  349. LM_WARN("invalid parameters from Lua env\n");
  350. return app_lua_return_false(L);
  351. }
  352. if (!flag_in_range(flag))
  353. {
  354. LM_ERR("invalid flag parameter %d\n", flag);
  355. return app_lua_return_false(L);
  356. }
  357. ret = isflagset(env_L->msg, flag);
  358. if(ret>0)
  359. return app_lua_return_true(L);
  360. return app_lua_return_false(L);
  361. }
  362. /**
  363. *
  364. */
  365. static int lua_sr_setbflag (lua_State *L)
  366. {
  367. int flag;
  368. int branch;
  369. sr_lua_env_t *env_L;
  370. env_L = sr_lua_env_get();
  371. if(lua_gettop(L)==1)
  372. {
  373. flag = lua_tointeger(L, -1);
  374. branch = 0;
  375. } else if(lua_gettop(L)==2) {
  376. flag = lua_tointeger(L, -2);
  377. branch = lua_tointeger(L, -1);
  378. } else {
  379. LM_WARN("invalid number of parameters from Lua\n");
  380. return app_lua_return_false(L);
  381. }
  382. if(env_L->msg==NULL)
  383. {
  384. LM_WARN("invalid parameters from Lua env\n");
  385. return app_lua_return_false(L);
  386. }
  387. if (!flag_in_range(flag))
  388. {
  389. LM_ERR("invalid flag parameter %d\n", flag);
  390. return app_lua_return_false(L);
  391. }
  392. setbflag(branch, flag);
  393. return app_lua_return_true(L);
  394. }
  395. /**
  396. *
  397. */
  398. static int lua_sr_resetbflag (lua_State *L)
  399. {
  400. int flag;
  401. int branch;
  402. sr_lua_env_t *env_L;
  403. env_L = sr_lua_env_get();
  404. if(lua_gettop(L)==1)
  405. {
  406. flag = lua_tointeger(L, -1);
  407. branch = 0;
  408. } else if(lua_gettop(L)==2) {
  409. flag = lua_tointeger(L, -2);
  410. branch = lua_tointeger(L, -1);
  411. } else {
  412. LM_WARN("invalid number of parameters from Lua\n");
  413. return app_lua_return_false(L);
  414. }
  415. if(env_L->msg==NULL)
  416. {
  417. LM_WARN("invalid parameters from Lua env\n");
  418. return app_lua_return_false(L);
  419. }
  420. if (!flag_in_range(flag))
  421. {
  422. LM_ERR("invalid flag parameter %d\n", flag);
  423. return app_lua_return_false(L);
  424. }
  425. resetbflag(branch, flag);
  426. return app_lua_return_true(L);
  427. }
  428. /**
  429. *
  430. */
  431. static int lua_sr_isbflagset (lua_State *L)
  432. {
  433. int flag;
  434. int branch;
  435. int ret;
  436. sr_lua_env_t *env_L;
  437. env_L = sr_lua_env_get();
  438. if(lua_gettop(L)==1)
  439. {
  440. flag = lua_tointeger(L, -1);
  441. branch = 0;
  442. } else if(lua_gettop(L)==2) {
  443. flag = lua_tointeger(L, -2);
  444. branch = lua_tointeger(L, -1);
  445. } else {
  446. LM_WARN("invalid number of parameters from Lua\n");
  447. return app_lua_return_false(L);
  448. }
  449. if(env_L->msg==NULL)
  450. {
  451. LM_WARN("invalid parameters from Lua env\n");
  452. return app_lua_return_false(L);
  453. }
  454. if (!flag_in_range(flag))
  455. {
  456. LM_ERR("invalid flag parameter %d\n", flag);
  457. return app_lua_return_false(L);
  458. }
  459. ret = isbflagset(branch, flag);
  460. if(ret>0)
  461. return app_lua_return_true(L);
  462. return app_lua_return_false(L);
  463. }
  464. /**
  465. *
  466. */
  467. static int lua_sr_seturi (lua_State *L)
  468. {
  469. struct action act;
  470. struct run_act_ctx h;
  471. str uri;
  472. sr_lua_env_t *env_L;
  473. env_L = sr_lua_env_get();
  474. uri.s = (char*)lua_tostring(L, -1);
  475. if(uri.s==NULL)
  476. {
  477. LM_ERR("invalid uri parameter\n");
  478. return app_lua_return_false(L);
  479. }
  480. uri.len = strlen(uri.s);
  481. if(env_L->msg==NULL)
  482. {
  483. LM_WARN("invalid parameters from Lua env\n");
  484. return app_lua_return_false(L);
  485. }
  486. memset(&act, 0, sizeof(act));
  487. act.val[0].type = STRING_ST;
  488. act.val[0].u.string = uri.s;
  489. act.type = SET_URI_T;
  490. init_run_actions_ctx(&h);
  491. if (do_action(&h, &act, env_L->msg)<0)
  492. {
  493. LM_ERR("do action failed\n");
  494. return app_lua_return_false(L);
  495. }
  496. return app_lua_return_true(L);
  497. }
  498. /**
  499. *
  500. */
  501. static int lua_sr_setuser (lua_State *L)
  502. {
  503. struct action act;
  504. struct run_act_ctx h;
  505. str uri;
  506. sr_lua_env_t *env_L;
  507. env_L = sr_lua_env_get();
  508. uri.s = (char*)lua_tostring(L, -1);
  509. if(uri.s==NULL)
  510. {
  511. LM_ERR("invalid uri parameter\n");
  512. return app_lua_return_false(L);
  513. }
  514. uri.len = strlen(uri.s);
  515. if(env_L->msg==NULL)
  516. {
  517. LM_WARN("invalid parameters from Lua env\n");
  518. return app_lua_return_false(L);
  519. }
  520. memset(&act, 0, sizeof(act));
  521. act.val[0].type = STRING_ST;
  522. act.val[0].u.string = uri.s;
  523. act.type = SET_USER_T;
  524. init_run_actions_ctx(&h);
  525. if (do_action(&h, &act, env_L->msg)<0)
  526. {
  527. LM_ERR("do action failed\n");
  528. return app_lua_return_false(L);
  529. }
  530. return app_lua_return_true(L);
  531. }
  532. /**
  533. *
  534. */
  535. static int lua_sr_sethost (lua_State *L)
  536. {
  537. struct action act;
  538. struct run_act_ctx h;
  539. str uri;
  540. sr_lua_env_t *env_L;
  541. env_L = sr_lua_env_get();
  542. uri.s = (char*)lua_tostring(L, -1);
  543. if(uri.s==NULL)
  544. {
  545. LM_ERR("invalid uri parameter\n");
  546. return app_lua_return_false(L);
  547. }
  548. uri.len = strlen(uri.s);
  549. if(env_L->msg==NULL)
  550. {
  551. LM_WARN("invalid parameters from Lua env\n");
  552. return app_lua_return_false(L);
  553. }
  554. memset(&act, 0, sizeof(act));
  555. act.val[0].type = STRING_ST;
  556. act.val[0].u.string = uri.s;
  557. act.type = SET_HOST_T;
  558. init_run_actions_ctx(&h);
  559. if (do_action(&h, &act, env_L->msg)<0)
  560. {
  561. LM_ERR("do action failed\n");
  562. return app_lua_return_false(L);
  563. }
  564. return app_lua_return_true(L);
  565. }
  566. /**
  567. *
  568. */
  569. static int lua_sr_setdsturi (lua_State *L)
  570. {
  571. str uri;
  572. sr_lua_env_t *env_L;
  573. env_L = sr_lua_env_get();
  574. uri.s = (char*)lua_tostring(L, -1);
  575. if(uri.s==NULL)
  576. {
  577. LM_ERR("invalid uri parameter\n");
  578. return app_lua_return_false(L);
  579. }
  580. uri.len = strlen(uri.s);
  581. if(env_L->msg==NULL)
  582. {
  583. LM_WARN("invalid parameters from Lua env\n");
  584. return app_lua_return_false(L);
  585. }
  586. if (set_dst_uri(env_L->msg, &uri)<0)
  587. {
  588. LM_ERR("setting dst uri failed\n");
  589. return app_lua_return_false(L);
  590. }
  591. return app_lua_return_true(L);
  592. }
  593. /**
  594. *
  595. */
  596. static int lua_sr_resetdsturi (lua_State *L)
  597. {
  598. sr_lua_env_t *env_L;
  599. env_L = sr_lua_env_get();
  600. if(env_L->msg==NULL)
  601. {
  602. LM_WARN("invalid parameters from Lua env\n");
  603. return app_lua_return_false(L);
  604. }
  605. reset_dst_uri(env_L->msg);
  606. return app_lua_return_true(L);
  607. }
  608. /**
  609. *
  610. */
  611. static const luaL_reg _sr_core_Map [] = {
  612. {"probe", lua_sr_probe},
  613. {"dbg", lua_sr_dbg},
  614. {"err", lua_sr_err},
  615. {"log", lua_sr_log},
  616. {"modf", lua_sr_modf},
  617. {"is_myself", lua_sr_is_myself},
  618. {"setflag", lua_sr_setflag},
  619. {"resetflag", lua_sr_resetflag},
  620. {"isflagset", lua_sr_isflagset},
  621. {"setbflag", lua_sr_setbflag},
  622. {"resetbflag", lua_sr_resetbflag},
  623. {"isbflagset", lua_sr_isbflagset},
  624. {"seturi", lua_sr_seturi},
  625. {"setuser", lua_sr_setuser},
  626. {"sethost", lua_sr_sethost},
  627. {"setdsturi", lua_sr_setdsturi},
  628. {"resetdsturi", lua_sr_resetdsturi},
  629. {NULL, NULL}
  630. };
  631. /**
  632. *
  633. */
  634. static int lua_sr_hdr_append (lua_State *L)
  635. {
  636. struct lump* anchor;
  637. struct hdr_field *hf;
  638. char *txt;
  639. int len;
  640. char *hdr;
  641. sr_lua_env_t *env_L;
  642. env_L = sr_lua_env_get();
  643. txt = (char*)lua_tostring(L, -1);
  644. if(txt==NULL || env_L->msg==NULL)
  645. return 0;
  646. LM_DBG("append hf: %s\n", txt);
  647. if (parse_headers(env_L->msg, HDR_EOH_F, 0) == -1)
  648. {
  649. LM_ERR("error while parsing message\n");
  650. return 0;
  651. }
  652. hf = env_L->msg->last_header;
  653. len = strlen(txt);
  654. hdr = (char*)pkg_malloc(len);
  655. if(hdr==NULL)
  656. {
  657. LM_ERR("no pkg memory left\n");
  658. return 0;
  659. }
  660. memcpy(hdr, txt, len);
  661. anchor = anchor_lump(env_L->msg,
  662. hf->name.s + hf->len - env_L->msg->buf, 0, 0);
  663. if(insert_new_lump_before(anchor, hdr, len, 0) == 0)
  664. {
  665. LM_ERR("can't insert lump\n");
  666. pkg_free(hdr);
  667. return 0;
  668. }
  669. return 0;
  670. }
  671. /**
  672. *
  673. */
  674. static int lua_sr_hdr_remove (lua_State *L)
  675. {
  676. struct lump* anchor;
  677. struct hdr_field *hf;
  678. char *txt;
  679. str hname;
  680. sr_lua_env_t *env_L;
  681. env_L = sr_lua_env_get();
  682. txt = (char*)lua_tostring(L, -1);
  683. if(txt==NULL || env_L->msg==NULL)
  684. return 0;
  685. LM_DBG("remove hf: %s\n", txt);
  686. if (parse_headers(env_L->msg, HDR_EOH_F, 0) == -1) {
  687. LM_ERR("error while parsing message\n");
  688. return 0;
  689. }
  690. hname.s = txt;
  691. hname.len = strlen(txt);
  692. for (hf=env_L->msg->headers; hf; hf=hf->next)
  693. {
  694. if (cmp_hdrname_str(&hf->name, &hname)==0)
  695. {
  696. anchor=del_lump(env_L->msg,
  697. hf->name.s - env_L->msg->buf, hf->len, 0);
  698. if (anchor==0)
  699. {
  700. LM_ERR("cannot remove hdr %s\n", txt);
  701. return 0;
  702. }
  703. }
  704. }
  705. return 0;
  706. }
  707. /**
  708. *
  709. */
  710. static int lua_sr_hdr_insert (lua_State *L)
  711. {
  712. struct lump* anchor;
  713. struct hdr_field *hf;
  714. char *txt;
  715. int len;
  716. char *hdr;
  717. sr_lua_env_t *env_L;
  718. env_L = sr_lua_env_get();
  719. txt = (char*)lua_tostring(L, -1);
  720. if(txt==NULL || env_L->msg==NULL)
  721. return 0;
  722. LM_DBG("insert hf: %s\n", txt);
  723. hf = env_L->msg->headers;
  724. len = strlen(txt);
  725. hdr = (char*)pkg_malloc(len);
  726. if(hdr==NULL)
  727. {
  728. LM_ERR("no pkg memory left\n");
  729. return 0;
  730. }
  731. memcpy(hdr, txt, len);
  732. anchor = anchor_lump(env_L->msg,
  733. hf->name.s + hf->len - env_L->msg->buf, 0, 0);
  734. if(insert_new_lump_before(anchor, hdr, len, 0) == 0)
  735. {
  736. LM_ERR("can't insert lump\n");
  737. pkg_free(hdr);
  738. return 0;
  739. }
  740. return 0;
  741. }
  742. /**
  743. *
  744. */
  745. static int lua_sr_hdr_append_to_reply (lua_State *L)
  746. {
  747. char *txt;
  748. int len;
  749. sr_lua_env_t *env_L;
  750. env_L = sr_lua_env_get();
  751. txt = (char*)lua_tostring(L, -1);
  752. if(txt==NULL || env_L->msg==NULL)
  753. return 0;
  754. LM_DBG("append to reply: %s\n", txt);
  755. len = strlen(txt);
  756. if(add_lump_rpl(env_L->msg, txt, len, LUMP_RPL_HDR)==0)
  757. {
  758. LM_ERR("unable to add reply lump\n");
  759. return 0;
  760. }
  761. return 0;
  762. }
  763. /**
  764. *
  765. */
  766. static const luaL_reg _sr_hdr_Map [] = {
  767. {"append", lua_sr_hdr_append},
  768. {"remove", lua_sr_hdr_remove},
  769. {"insert", lua_sr_hdr_insert},
  770. {"append_to_reply", lua_sr_hdr_append_to_reply},
  771. {NULL, NULL}
  772. };
  773. /**
  774. *
  775. */
  776. static int lua_sr_pv_get (lua_State *L)
  777. {
  778. str pvn;
  779. pv_spec_t pvs;
  780. pv_value_t val;
  781. sr_lua_env_t *env_L;
  782. env_L = sr_lua_env_get();
  783. pvn.s = (char*)lua_tostring(L, -1);
  784. if(pvn.s==NULL || env_L->msg==NULL)
  785. return 0;
  786. pvn.len = strlen(pvn.s);
  787. LM_DBG("pv get: %s\n", pvn.s);
  788. if(pv_parse_spec(&pvn, &pvs)<0)
  789. {
  790. LM_ERR("unable to parse pv [%s]\n", pvn.s);
  791. return 0;
  792. }
  793. memset(&val, 0, sizeof(pv_value_t));
  794. if(pv_get_spec_value(env_L->msg, &pvs, &val) != 0)
  795. {
  796. LM_ERR("unable to get pv value for [%s]\n", pvn.s);
  797. return 0;
  798. }
  799. if(val.flags&PV_VAL_NULL)
  800. {
  801. return 0;
  802. }
  803. if(val.flags&PV_TYPE_INT)
  804. {
  805. lua_pushinteger(L, val.ri);
  806. return 1;
  807. }
  808. lua_pushlstring(L, val.rs.s, val.rs.len);
  809. return 1;
  810. }
  811. /**
  812. *
  813. */
  814. static int lua_sr_pv_seti (lua_State *L)
  815. {
  816. str pvn;
  817. pv_spec_t pvs;
  818. pv_value_t val;
  819. sr_lua_env_t *env_L;
  820. env_L = sr_lua_env_get();
  821. if(lua_gettop(L)<2)
  822. {
  823. LM_ERR("to few parameters [%d]\n", lua_gettop(L));
  824. return 0;
  825. }
  826. if(!lua_isnumber(L, -1))
  827. {
  828. LM_ERR("invalid int parameter\n");
  829. return 0;
  830. }
  831. memset(&val, 0, sizeof(pv_value_t));
  832. val.ri = lua_tointeger(L, -1);
  833. val.flags |= PV_TYPE_INT|PV_VAL_INT;
  834. pvn.s = (char*)lua_tostring(L, -2);
  835. if(pvn.s==NULL || env_L->msg==NULL)
  836. return 0;
  837. pvn.len = strlen(pvn.s);
  838. LM_DBG("pv set: %s\n", pvn.s);
  839. if(pv_parse_spec(&pvn, &pvs)<0)
  840. {
  841. LM_ERR("unable to parse pv [%s]\n", pvn.s);
  842. return 0;
  843. }
  844. if(pv_set_spec_value(env_L->msg, &pvs, 0, &val)<0)
  845. {
  846. LM_ERR("unable to set pv [%s]\n", pvn.s);
  847. return 0;
  848. }
  849. return 0;
  850. }
  851. /**
  852. *
  853. */
  854. static int lua_sr_pv_sets (lua_State *L)
  855. {
  856. str pvn;
  857. pv_spec_t pvs;
  858. pv_value_t val;
  859. sr_lua_env_t *env_L;
  860. env_L = sr_lua_env_get();
  861. if(lua_gettop(L)<2)
  862. {
  863. LM_ERR("to few parameters [%d]\n",lua_gettop(L));
  864. return 0;
  865. }
  866. memset(&val, 0, sizeof(pv_value_t));
  867. val.rs.s = (char*)lua_tostring(L, -1);
  868. val.rs.len = strlen(val.rs.s);
  869. val.flags |= PV_VAL_STR;
  870. pvn.s = (char*)lua_tostring(L, -2);
  871. if(pvn.s==NULL || env_L->msg==NULL)
  872. return 0;
  873. pvn.len = strlen(pvn.s);
  874. LM_DBG("pv set: %s\n", pvn.s);
  875. if(pv_parse_spec(&pvn, &pvs)<0)
  876. {
  877. LM_ERR("unable to parse pv [%s]\n", pvn.s);
  878. return 0;
  879. }
  880. if(pv_set_spec_value(env_L->msg, &pvs, 0, &val)<0)
  881. {
  882. LM_ERR("unable to set pv [%s]\n", pvn.s);
  883. return 0;
  884. }
  885. return 0;
  886. }
  887. /**
  888. *
  889. */
  890. static int lua_sr_pv_unset (lua_State *L)
  891. {
  892. str pvn;
  893. pv_spec_t pvs;
  894. pv_value_t val;
  895. sr_lua_env_t *env_L;
  896. env_L = sr_lua_env_get();
  897. pvn.s = (char*)lua_tostring(L, -1);
  898. if(pvn.s==NULL || env_L->msg==NULL)
  899. return 0;
  900. pvn.len = strlen(pvn.s);
  901. LM_DBG("pv unset: %s\n", pvn.s);
  902. if(pv_parse_spec(&pvn, &pvs)<0)
  903. {
  904. LM_ERR("unable to parse pv [%s]\n", pvn.s);
  905. return 0;
  906. }
  907. memset(&val, 0, sizeof(pv_value_t));
  908. val.flags |= PV_VAL_NULL;
  909. if(pv_set_spec_value(env_L->msg, &pvs, 0, &val)<0)
  910. {
  911. LM_ERR("unable to unset pv [%s]\n", pvn.s);
  912. return 0;
  913. }
  914. return 0;
  915. }
  916. /**
  917. *
  918. */
  919. static int lua_sr_pv_is_null (lua_State *L)
  920. {
  921. str pvn;
  922. pv_spec_t pvs;
  923. pv_value_t val;
  924. sr_lua_env_t *env_L;
  925. env_L = sr_lua_env_get();
  926. pvn.s = (char*)lua_tostring(L, -1);
  927. if(pvn.s==NULL || env_L->msg==NULL)
  928. return 0;
  929. pvn.len = strlen(pvn.s);
  930. LM_DBG("pv is null test: %s\n", pvn.s);
  931. if(pv_parse_spec(&pvn, &pvs)<0)
  932. {
  933. LM_ERR("unable to parse pv [%s]\n", pvn.s);
  934. return 0;
  935. }
  936. memset(&val, 0, sizeof(pv_value_t));
  937. if(pv_get_spec_value(env_L->msg, &pvs, &val) != 0)
  938. {
  939. LM_ERR("unable to get pv value for [%s]\n", pvn.s);
  940. return 0;
  941. }
  942. if(val.flags&PV_VAL_NULL)
  943. {
  944. lua_pushboolean(L, 1);
  945. } else {
  946. lua_pushboolean(L, 0);
  947. }
  948. return 1;
  949. }
  950. /**
  951. *
  952. */
  953. static const luaL_reg _sr_pv_Map [] = {
  954. {"get", lua_sr_pv_get},
  955. {"seti", lua_sr_pv_seti},
  956. {"sets", lua_sr_pv_sets},
  957. {"unset", lua_sr_pv_unset},
  958. {"is_null", lua_sr_pv_is_null},
  959. {NULL, NULL}
  960. };
  961. /**
  962. *
  963. */
  964. void lua_sr_core_openlibs(lua_State *L)
  965. {
  966. luaL_openlib(L, "sr", _sr_core_Map, 0);
  967. luaL_openlib(L, "sr.hdr", _sr_hdr_Map, 0);
  968. luaL_openlib(L, "sr.pv", _sr_pv_Map, 0);
  969. }