eval.c 51 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086
  1. /*
  2. * $Id$
  3. *
  4. * Copyright (C) 2006 iptelorg GmbH
  5. *
  6. * This file is part of ser, a free SIP server.
  7. *
  8. * ser 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. * For a license to use the ser software under conditions
  14. * other than those described here, or to purchase support for this
  15. * software, please contact iptel.org by e-mail at the following addresses:
  16. * [email protected]
  17. *
  18. * ser is distributed in the hope that it will be useful,
  19. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  21. * GNU General Public License for more details.
  22. *
  23. * You should have received a copy of the GNU General Public License
  24. * along with this program; if not, write to the Free Software
  25. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  26. */
  27. #include <string.h>
  28. #include <stdlib.h>
  29. #include <stdio.h>
  30. #include <ctype.h>
  31. #include "../../route.h"
  32. #include "../../sr_module.h"
  33. #include "../../mem/mem.h"
  34. #include "../../str.h"
  35. #include "../../error.h"
  36. #include "../../config.h"
  37. #include "../../trim.h"
  38. #include "../../select.h"
  39. #include "../../ut.h"
  40. #include "../../modules/xprint/xp_lib.h"
  41. #include "../../select_buf.h"
  42. #include "../../globals.h"
  43. #include "../../route.h"
  44. #include "../../parser/msg_parser.h"
  45. #include "../../action.h"
  46. #include "../../script_cb.h"
  47. #include "../../dset.h"
  48. #include "../../usr_avp.h"
  49. MODULE_VERSION
  50. #define MODULE_NAME "eval"
  51. enum {evtVoid=0, evtInt, evtStr};
  52. struct eval_str {
  53. str s;
  54. int cnt;
  55. };
  56. struct eval_value {
  57. union {
  58. long n;
  59. struct eval_str *s;
  60. } u;
  61. int type;
  62. };
  63. struct register_item {
  64. char *name;
  65. struct eval_value value;
  66. struct register_item *next;
  67. };
  68. struct stack_item {
  69. struct eval_value value;
  70. struct stack_item *prev;
  71. struct stack_item *next;
  72. };
  73. static int stack_no = 0;
  74. static struct stack_item *stack_head = 0;
  75. static struct stack_item *stack_tail = 0;
  76. static struct register_item* registers = 0;
  77. #define destroy_value(val) { \
  78. if ((val).type == evtStr && (val).u.s && (val).u.s->cnt > 0) { \
  79. (val).u.s->cnt--; \
  80. if ((val).u.s->cnt == 0) \
  81. pkg_free((val).u.s); \
  82. } \
  83. (val).type = evtVoid; \
  84. }
  85. #define assign_value(dest, src) { \
  86. if (&(dest) != &(src)) { \
  87. destroy_value(dest); \
  88. dest = src; \
  89. if ((dest).type == evtStr && (dest).u.s && (dest).u.s->cnt > 0) \
  90. (dest).u.s->cnt++; \
  91. } \
  92. }
  93. static int get_as_int(struct eval_value *value, long* val) {
  94. switch (value->type) {
  95. case evtInt:
  96. *val = value->u.n;
  97. return 1;
  98. case evtStr:
  99. if (value->u.s->s.s && value->u.s->s.len && value->u.s->s.len <= 25) {
  100. char *err;
  101. char buf[25+1];
  102. memcpy(buf, value->u.s->s.s, value->u.s->s.len);
  103. buf[value->u.s->s.len] = '\0';
  104. *val = strtol(buf, &err, 10);
  105. if (*err == 0)
  106. return 1;
  107. }
  108. ERR(MODULE_NAME": cannot convert '%.*s' as int\n", value->u.s->s.len, value->u.s->s.s);
  109. return -1;
  110. default:
  111. BUG("Bad value type %d\n", value->type);
  112. return -1;
  113. }
  114. }
  115. static void get_as_str(struct eval_value *value, str *s) {
  116. static char buf[25];
  117. switch (value->type) {
  118. case evtInt:
  119. s->len = snprintf(buf, sizeof(buf)-1, "%ld", value->u.n);
  120. s->s = buf;
  121. break;
  122. case evtStr:
  123. *s = value->u.s->s;
  124. break;
  125. default:
  126. s->s = 0;
  127. s->len = 0;
  128. break;
  129. }
  130. }
  131. static int get_as_bool(struct eval_value *value) {
  132. switch (value->type) {
  133. case evtVoid:
  134. return 0;
  135. case evtInt:
  136. return value->u.n != 0;
  137. case evtStr:
  138. return (value->u.s->s.s && value->u.s->s.len > 0);
  139. default:
  140. BUG("Bad value type %d\n", value->type);
  141. return -1;
  142. }
  143. }
  144. static struct eval_str* eval_str_malloc(str* s) {
  145. struct eval_str* p;
  146. p = pkg_malloc(sizeof(*p)+s->len);
  147. if (p) {
  148. p->s.s = (char*)p+sizeof(*p);
  149. if (s->len && s->s != 0)
  150. memcpy(p->s.s, s->s, s->len);
  151. if (s->s == 0 && s->len)
  152. s->s = p->s.s;
  153. p->s.len = s->len;
  154. p->cnt = 1;
  155. }
  156. return p;
  157. }
  158. /* taken from modules/textops */
  159. #define is_space(_p) ((_p) == '\t' || (_p) == '\n' || (_p) == '\r' || (_p) == ' ')
  160. static void get_uri_and_skip_until_params(str *param_area, str *uri) {
  161. int i, quoted, uri_pos, uri_done;
  162. uri->len = 0;
  163. uri->s = 0;
  164. uri_done = 0;
  165. for (i=0; i<param_area->len && param_area->s[i]!=';'; ) { /* [ *(token LSW)/quoted-string ] "<" addr-spec ">" | addr-spec */
  166. /* skip name */
  167. for (quoted=0, uri_pos=i; i<param_area->len; i++) {
  168. if (!quoted) {
  169. if (param_area->s[i] == '\"') {
  170. quoted = 1;
  171. uri_pos = -1;
  172. }
  173. else if (param_area->s[i] == '<' || param_area->s[i] == ';' || is_space(param_area->s[i])) break;
  174. }
  175. else if (param_area->s[i] == '\"' && param_area->s[i-1] != '\\') quoted = 0;
  176. }
  177. if (uri_pos >= 0 && !uri_done) {
  178. uri->s = param_area->s+uri_pos;
  179. uri->len = param_area->s+i-uri->s;
  180. }
  181. /* skip uri */
  182. while (i<param_area->len && is_space(param_area->s[i])) i++;
  183. if (i<param_area->len && param_area->s[i]=='<') {
  184. uri->s = param_area->s+i;
  185. uri->len = 0;
  186. for (quoted=0; i<param_area->len; i++) {
  187. if (!quoted) {
  188. if (param_area->s[i] == '\"') quoted = 1;
  189. else if (param_area->s[i] == '>') {
  190. uri->len = param_area->s+i-uri->s+1;
  191. uri_done = 1;
  192. break;
  193. }
  194. }
  195. else if (param_area->s[i] == '\"' && param_area->s[i-1] != '\\') quoted = 0;
  196. }
  197. }
  198. }
  199. param_area->s+= i;
  200. param_area->len-= i;
  201. }
  202. static int find_next_value(char** start, char* end, str* val, str* lump_val) {
  203. int quoted = 0;
  204. lump_val->s = *start;
  205. while (*start < end && is_space(**start) ) (*start)++;
  206. val->s = *start;
  207. while ( *start < end && (**start != ',' || quoted) ) {
  208. if (**start == '\"' && (!quoted || (*start)[-1]!='\\') )
  209. quoted = ~quoted;
  210. (*start)++;
  211. }
  212. val->len = *start - val->s;
  213. while (val->len > 0 && is_space(val->s[val->len-1])) val->len--;
  214. /* we cannot automatically strip quotes!!! an example why: "name" <sip:ssss>;param="bar"
  215. if (val->len >= 2 && val->s[0] == '\"' && val->s[val->len-1] == '\"') {
  216. val->s++;
  217. val->len -= 2;
  218. }
  219. */
  220. while (*start < end && **start != ',') (*start)++;
  221. if (*start < end) {
  222. (*start)++;
  223. }
  224. lump_val->len = *start - lump_val->s;
  225. return (*start < end);
  226. }
  227. #define MAX_HF_VALUES 30
  228. static int parse_hf_values(str s, int* n, str** vals) {
  229. static str values[MAX_HF_VALUES];
  230. char *start, *end;
  231. str lump_val;
  232. *n = 0;
  233. *vals = values;
  234. if (!s.s) return 1;
  235. start = s.s;
  236. end = start+s.len;
  237. while (start < end) {
  238. find_next_value(&start, end, &values[*n], &lump_val);
  239. if (*n >= MAX_HF_VALUES) {
  240. ERR(MODULE_NAME": too many values\n");
  241. return -1;
  242. }
  243. (*n)++;
  244. }
  245. return 1;
  246. }
  247. static void destroy_stack() {
  248. struct stack_item *p;
  249. while (stack_head) {
  250. destroy_value(stack_head->value);
  251. p = stack_head;
  252. stack_head = stack_head->next;
  253. pkg_free(p);
  254. }
  255. stack_tail = stack_head;
  256. stack_no = 0;
  257. }
  258. static void destroy_register_values() {
  259. struct register_item *p;
  260. for (p=registers; p; p=p->next) {
  261. destroy_value(p->value);
  262. }
  263. }
  264. static void remove_stack_item(struct stack_item *s) {
  265. if (s->prev)
  266. s->prev->next = s->next;
  267. else
  268. stack_head = s->next;
  269. if (s->next)
  270. s->next->prev = s->prev;
  271. else
  272. stack_tail = s->prev;
  273. destroy_value(s->value);
  274. pkg_free(s);
  275. stack_no--;
  276. }
  277. static void insert_stack_item(struct stack_item *s, struct stack_item *pivot, int behind) {
  278. if (stack_head == NULL) {
  279. s->prev = s->next = 0;
  280. }
  281. else if (behind) {
  282. if (pivot) {
  283. s->next = pivot->next;
  284. s->prev = pivot;
  285. }
  286. else {
  287. s->next = 0;
  288. s->prev = stack_tail; /* bottom (tail) */
  289. }
  290. }
  291. else {
  292. if (pivot) {
  293. s->prev = pivot->prev;
  294. s->next = pivot;
  295. }
  296. else {
  297. s->next = stack_head; /* top (head) */
  298. s->prev = 0;
  299. }
  300. }
  301. if (!s->prev)
  302. stack_head = s;
  303. else
  304. s->prev->next = s;
  305. if (!s->next)
  306. stack_tail = s;
  307. else
  308. s->next->prev = s;
  309. stack_no++;
  310. }
  311. static int declare_register(modparam_t type, char* param) {
  312. struct register_item **p;
  313. char *c;
  314. for (c=param; *c; c++) {
  315. if ( (*c >= 'a' && *c <= 'z') ||
  316. (*c >= 'A' && *c <= 'Z') ||
  317. (*c >= '0' && *c <= '9') ||
  318. (*c == '_') ) {
  319. ;
  320. } else {
  321. ERR(MODULE_NAME": illegal register name\n");
  322. return E_CFG;
  323. }
  324. }
  325. for (p = &registers; *p!= 0; p = &(*p)->next);
  326. *p = pkg_malloc(sizeof(**p));
  327. if (!*p) return E_OUT_OF_MEM;
  328. memset(*p, 0, sizeof(**p));
  329. (*p)->name = param;
  330. return 0;
  331. }
  332. static int mod_pre_script_cb(struct sip_msg *msg, unsigned int flags, void *param) {
  333. destroy_stack();
  334. destroy_register_values();
  335. return 1;
  336. }
  337. static struct register_item* find_register(char* s, int len) {
  338. struct register_item *p;
  339. for (p=registers; p; p=p->next) {
  340. if (strlen(p->name) == len && strncasecmp(p->name, s, len) == 0)
  341. break;
  342. }
  343. return p;
  344. }
  345. static struct stack_item* find_stack_item(int n) {
  346. struct stack_item *p;
  347. if ((n >= 0 && n >= stack_no) || (n<0 && -n > stack_no)) {
  348. return NULL;
  349. }
  350. p = NULL;
  351. if (n >= 0) {
  352. for (p = stack_head; p && n>0; p=p->next, n--);
  353. }
  354. else {
  355. for (p = stack_tail, n=-n-1; p && n>0; p=p->prev, n--);
  356. }
  357. return p;
  358. }
  359. /* module exported functions */
  360. static void print_eval_value(struct eval_value* v) {
  361. switch (v->type) {
  362. case evtStr:
  363. if (v->u.s)
  364. fprintf(stderr, "s:'%.*s', cnt:%d\n", v->u.s->s.len, v->u.s->s.s, v->u.s->cnt);
  365. else
  366. fprintf(stderr, "s:<null>\n");
  367. break;
  368. case evtInt:
  369. fprintf(stderr, "i:%ld\n", v->u.n);
  370. break;
  371. default:;
  372. fprintf(stderr, "type:%d\n", v->type);
  373. break;
  374. }
  375. }
  376. static int eval_dump_func(struct sip_msg *msg, char *param1, char *param2) {
  377. struct stack_item *si;
  378. struct register_item *ri;
  379. int i;
  380. fprintf(stderr, "Stack (no=%d):\n", stack_no);
  381. for (si=stack_head, i=0; si; si=si->next, i++) {
  382. fprintf(stderr, "# %.2d ", i);
  383. print_eval_value(&si->value);
  384. }
  385. for (si=stack_tail, i=-1; si; si=si->prev, i--) {
  386. fprintf(stderr, "#%.2d ", i);
  387. print_eval_value(&si->value);
  388. }
  389. fprintf(stderr, "Registers:\n");
  390. for (ri=registers; ri; ri=ri->next) {
  391. fprintf(stderr, "%s: ", ri->name);
  392. print_eval_value(&ri->value);
  393. }
  394. return 1;
  395. }
  396. static int xlbuf_size = 4096;
  397. static xl_print_log_f* xl_print = NULL;
  398. static xl_parse_format_f* xl_parse = NULL;
  399. #define NO_SCRIPT -1
  400. enum {esotAdd, esotInsert, esotXchg, esotPut, esotGet, esotPop, esotAddValue, esotInsertValue};
  401. enum {esovtInt, esovtStr, esovtAvp, esovtXStr, esovtRegister, esovtFunc, esovtSelect};
  402. enum {esofNone=0, esofTime, esofUuid, esofStackNo};
  403. struct eval_location_func {
  404. int type;
  405. char *name;
  406. };
  407. static struct eval_location_func loc_functions[] = {
  408. {esofTime, "time"},
  409. {esofUuid, "uuid"},
  410. {esofStackNo, "stackno"},
  411. {esofNone, NULL}
  412. };
  413. struct eval_location {
  414. int value_type;
  415. union {
  416. int n;
  417. struct eval_str s;
  418. xl_elog_t* xl;
  419. struct register_item *reg;
  420. avp_ident_t avp;
  421. select_t* select;
  422. struct eval_location_func *func;
  423. } u;
  424. };
  425. struct eval_stack_oper {
  426. int oper_type;
  427. struct eval_location loc;
  428. };
  429. static int parse_location(str s, struct eval_location *p) {
  430. if (s.len >= 2 && s.s[1] == ':') {
  431. switch (s.s[0]) {
  432. case 'r':
  433. p->u.reg = find_register(s.s+2, s.len-2);
  434. if (!p->u.reg) {
  435. ERR(MODULE_NAME": register '%.*s' not found\n", s.len-2, s.s+2);
  436. return E_CFG;
  437. }
  438. p->value_type = esovtRegister;
  439. break;
  440. case 'x':
  441. if (!xl_print) {
  442. xl_print=(xl_print_log_f*)find_export("xprint", NO_SCRIPT, 0);
  443. if (!xl_print) {
  444. ERR(MODULE_NAME": cannot find \"xprint\", is module xprint loaded?\n");
  445. return E_UNSPEC;
  446. }
  447. }
  448. if (!xl_parse) {
  449. xl_parse=(xl_parse_format_f*)find_export("xparse", NO_SCRIPT, 0);
  450. if (!xl_parse) {
  451. ERR(MODULE_NAME": cannot find \"xparse\", is module xprint loaded?\n");
  452. return E_UNSPEC;
  453. }
  454. }
  455. if(xl_parse(s.s+2, &p->u.xl) < 0) {
  456. ERR(MODULE_NAME": wrong xl_lib format '%s'\n", s.s+2);
  457. return E_UNSPEC;
  458. }
  459. p->value_type = esovtXStr;
  460. break;
  461. case 'f': {
  462. struct eval_location_func* f;
  463. s.s += 2;
  464. s.len -= 2;
  465. for (f=loc_functions; f->type != esofNone; f++) {
  466. if (strlen(f->name)==s.len && strncasecmp(s.s, f->name, s.len) == 0) {
  467. p->value_type = esovtFunc;
  468. p->u.func = f;
  469. break;
  470. }
  471. }
  472. if (!f) {
  473. ERR(MODULE_NAME": unknown function '%.*s'\n", s.len, s.s);
  474. return E_CFG;
  475. }
  476. break;
  477. }
  478. case 's':
  479. s.s += 2;
  480. s.len -= 2;
  481. /* no break */
  482. default:
  483. p->u.s.s = s;
  484. p->u.s.cnt = 0;
  485. p->value_type = esovtStr;
  486. break;
  487. }
  488. }
  489. else {
  490. char *err;
  491. if (s.len > 1 && s.s[0]=='$') {
  492. s.s++;
  493. s.len--;
  494. if (parse_avp_ident(&s, &p->u.avp) == 0) {
  495. if (p->u.avp.flags & AVP_NAME_RE) {
  496. ERR(MODULE_NAME": avp regex not allowed\n");
  497. return E_CFG;
  498. }
  499. p->value_type = esovtAvp;
  500. return 1;
  501. }
  502. s.s--;
  503. s.len++;
  504. }
  505. else if (s.len > 1 && s.s[0]=='@') {
  506. if (parse_select(&s.s, &p->u.select) >= 0) {
  507. p->value_type = esovtSelect;
  508. return 1;
  509. }
  510. }
  511. p->u.n = strtol(s.s, &err, 10);
  512. if (*err) {
  513. p->u.s.s = s;
  514. p->u.s.cnt = 0;
  515. p->value_type = esovtStr;
  516. }
  517. else {
  518. p->value_type = esovtInt;
  519. }
  520. }
  521. return 1;
  522. }
  523. static int eval_xl(struct sip_msg *msg, xl_elog_t* xl, str* s) {
  524. static char *xlbuf=NULL;
  525. int xllen = 0;
  526. if (!xlbuf) {
  527. xlbuf = (char*) pkg_malloc((xlbuf_size+1)*sizeof(char));
  528. if (!xlbuf) {
  529. ERR(MODULE_NAME": eval_xl: No memory left for format buffer\n");
  530. return E_OUT_OF_MEM;
  531. }
  532. }
  533. xllen = xlbuf_size;
  534. if (xl_print(msg, xl, xlbuf, &xllen) < 0) {
  535. ERR(MODULE_NAME": eval_xl: Error while formatting result\n");
  536. return E_UNSPEC;
  537. }
  538. s->s = xlbuf;
  539. s->len = xllen;
  540. return 1;
  541. }
  542. SELECT_F(select_sys_unique)
  543. static int eval_location(struct sip_msg *msg, struct eval_location* so, struct eval_value* v, int get_static_str) {
  544. static struct eval_str ss;
  545. v->type = evtVoid;
  546. switch (so->value_type) {
  547. case esovtInt:
  548. v->type = evtInt;
  549. v->u.n = so->u.n;
  550. break;
  551. case esovtStr:
  552. v->type = evtStr;
  553. v->u.s = &so->u.s;
  554. break;
  555. case esovtXStr: {
  556. str s;
  557. int ret;
  558. ret = eval_xl(msg, so->u.xl, &s);
  559. if (ret < 0) return ret;
  560. if (get_static_str) {
  561. ss.s = s;
  562. ss.cnt = 0;
  563. v->u.s = &ss;
  564. }
  565. else {
  566. v->u.s = eval_str_malloc(&s);
  567. if (!v->u.s) {
  568. ERR(MODULE_NAME": out of memory to allocate xl string\n");
  569. return E_OUT_OF_MEM;
  570. }
  571. }
  572. v->type = evtStr;
  573. break;
  574. }
  575. case esovtRegister:
  576. if (get_static_str)
  577. *v = so->u.reg->value; /* do not incement cnt */
  578. else
  579. assign_value(*v, so->u.reg->value);
  580. break;
  581. case esovtAvp: {
  582. avp_t* avp;
  583. avp_value_t val;
  584. if (so->u.avp.flags & AVP_INDEX_ALL)
  585. avp = search_first_avp(so->u.avp.flags & ~AVP_INDEX_ALL, so->u.avp.name, &val, NULL);
  586. else
  587. avp = search_avp_by_index(so->u.avp.flags, so->u.avp.name, &val, so->u.avp.index);
  588. if (!avp) {
  589. ERR(MODULE_NAME": avp '%.*s'[%d] not found\n", so->u.avp.name.s.len, so->u.avp.name.s.s, so->u.avp.index);
  590. return -1;
  591. }
  592. if (avp->flags & AVP_VAL_STR) {
  593. if (get_static_str) {
  594. ss.s = val.s;
  595. ss.cnt = 0;
  596. v->u.s = &ss;
  597. }
  598. else {
  599. v->u.s = eval_str_malloc(&val.s);
  600. if (!v->u.s) {
  601. ERR(MODULE_NAME": out of memory to allocate avp string\n");
  602. return E_OUT_OF_MEM;
  603. }
  604. }
  605. v->type = evtStr;
  606. }
  607. else {
  608. v->type = evtInt;
  609. v->u.n = val.n;
  610. }
  611. break;
  612. }
  613. case esovtSelect: {
  614. str s;
  615. int ret = run_select(&s, so->u.select, msg);
  616. if (ret < 0 || ret > 0) return -1;
  617. if (get_static_str) {
  618. ss.s = s;
  619. ss.cnt = 0;
  620. v->u.s = &ss;
  621. }
  622. else {
  623. v->u.s = eval_str_malloc(&s);
  624. if (!v->u.s) {
  625. ERR(MODULE_NAME": out of memory to allocate select string\n");
  626. return E_OUT_OF_MEM;
  627. }
  628. }
  629. v->type = evtStr;
  630. break;
  631. }
  632. case esovtFunc: {
  633. switch (so->u.func->type) {
  634. case esofTime: {
  635. time_t stamp;
  636. stamp = time(NULL);
  637. v->type = evtInt;
  638. v->u.n = stamp;
  639. break;
  640. }
  641. case esofUuid: {
  642. str s;
  643. select_sys_unique(&s, 0, msg);
  644. if (get_static_str) {
  645. ss.s = s;
  646. ss.cnt = 0;
  647. v->u.s = &ss;
  648. }
  649. else {
  650. v->u.s = eval_str_malloc(&s);
  651. if (!v->u.s) {
  652. ERR(MODULE_NAME": out of memory to allocate uuid string\n");
  653. return E_OUT_OF_MEM;
  654. }
  655. }
  656. v->type = evtStr;
  657. break;
  658. }
  659. case esofStackNo:
  660. v->type = evtInt;
  661. v->u.n = stack_no;
  662. break;
  663. default:
  664. BUG("bad func type (%d)\n", so->u.func->type);
  665. return -1;
  666. }
  667. break;
  668. }
  669. default:
  670. BUG("Bad value type (%d)\n", so->value_type);
  671. return -1;
  672. }
  673. return 1;
  674. }
  675. static int fixup_location_12( void** param, int param_no) {
  676. struct eval_location *so;
  677. str s;
  678. s.s = *param;
  679. s.len = strlen(s.s);
  680. so = pkg_malloc(sizeof(*so));
  681. if (!so) return E_OUT_OF_MEM;
  682. if (parse_location(s, so) < 0) {
  683. ERR(MODULE_NAME": parse location error '%s'\n", s.s);
  684. return E_CFG;
  685. }
  686. *param = so;
  687. return 0;
  688. }
  689. static int fixup_stack_oper(void **param, int param_no, int oper_type) {
  690. str s;
  691. struct eval_stack_oper *p;
  692. int ret;
  693. if (param_no == 2) {
  694. return fixup_location_12(param, param_no);
  695. }
  696. p = pkg_malloc(sizeof(*p));
  697. if (!p) return E_OUT_OF_MEM;
  698. p->oper_type = oper_type;
  699. s.s = *param;
  700. s.len = strlen(s.s);
  701. *param = p;
  702. ret = parse_location(s, &p->loc);
  703. if (ret < 0) return ret;
  704. switch (p->oper_type) {
  705. case esotXchg:
  706. if (p->loc.value_type == esovtAvp || p->loc.value_type == esovtSelect) {
  707. ERR(MODULE_NAME": avp non supported for xchg\n");
  708. return E_CFG;
  709. }
  710. /* no break */
  711. case esotPop:
  712. case esotGet:
  713. if (p->loc.value_type != esovtRegister && p->loc.value_type != esovtAvp) {
  714. ERR(MODULE_NAME": non supported read only location\n");
  715. return E_CFG;
  716. }
  717. break;
  718. default:;
  719. }
  720. return 0;
  721. }
  722. static int eval_stack_oper_func(struct sip_msg *msg, char *param1, char *param2) {
  723. int ret, idx;
  724. struct stack_item *pivot;
  725. struct eval_stack_oper *so;
  726. struct run_act_ctx ra_ctx;
  727. so = (struct eval_stack_oper *)param1;
  728. if (param2) {
  729. long l;
  730. struct eval_value v;
  731. eval_location(msg, (struct eval_location*) param2, &v, 1);
  732. ret = get_as_int(&v, &l);
  733. if (ret < 0) return ret;
  734. idx = l;
  735. }
  736. else {
  737. switch (so->oper_type) { /* default values */
  738. case esotAdd:
  739. case esotAddValue:
  740. idx = -1;
  741. break;
  742. default:
  743. idx = 0;
  744. break;
  745. }
  746. }
  747. pivot = find_stack_item(idx);
  748. if ( !(pivot!=NULL || ((so->oper_type == esotAdd || so->oper_type == esotAddValue) && idx == -1) || ((so->oper_type == esotInsert || so->oper_type == esotInsertValue) && idx == 0)) )
  749. return -1;
  750. switch (so->oper_type) {
  751. case esotGet:
  752. case esotPop:
  753. switch (so->loc.value_type) {
  754. case esovtRegister:
  755. assign_value(so->loc.u.reg->value, pivot->value);
  756. if (so->oper_type == esotPop)
  757. remove_stack_item(pivot);
  758. return 1;
  759. case esovtAvp: {
  760. struct action a;
  761. avp_spec_t attr;
  762. a.type = ASSIGN_T;
  763. a.count = 2;
  764. a.val[0].type = AVP_ST;
  765. attr.type = so->loc.u.avp.flags;
  766. attr.name = so->loc.u.avp.name;
  767. attr.index = so->loc.u.avp.index;
  768. a.val[0].u.attr = &attr;
  769. switch (pivot->value.type) {
  770. case evtInt:
  771. a.val[1].type = NUMBER_ST;
  772. a.val[1].u.number = pivot->value.u.n;
  773. break;
  774. case evtStr:
  775. if (pivot->value.u.s)
  776. a.val[1].u.str = pivot->value.u.s->s;
  777. else
  778. a.val[1].u.str.len = 0;
  779. a.val[1].type = STRING_ST;
  780. break;
  781. default:
  782. return -1;
  783. }
  784. a.next = 0;
  785. init_run_actions_ctx(&ra_ctx);
  786. ret = do_action(&ra_ctx, &a, msg);
  787. if (so->oper_type == esotPop)
  788. remove_stack_item(pivot);
  789. return ret<0?-1:1;
  790. }
  791. default:
  792. BUG("Bad value type (%d) for get/pop\n", so->loc.value_type);
  793. return -1;
  794. }
  795. break;
  796. case esotXchg:
  797. switch (so->loc.value_type) {
  798. case esovtRegister: {
  799. struct eval_value v;
  800. v = so->loc.u.reg->value;
  801. so->loc.u.reg->value = pivot->value;
  802. pivot->value = v;
  803. return 1;
  804. }
  805. default:
  806. BUG("Bad value type (%d) for xchg\n", so->loc.value_type);
  807. return -1;
  808. }
  809. break;
  810. case esotInsert:
  811. case esotAdd:
  812. case esotPut: {
  813. struct eval_value v;
  814. eval_location(msg, &so->loc, &v, 0);
  815. if (so->oper_type == esotInsert || so->oper_type == esotAdd) {
  816. struct stack_item *si;
  817. si = pkg_malloc(sizeof(*si));
  818. if (!si) {
  819. ERR(MODULE_NAME": out of memory\n");
  820. destroy_value(v);
  821. return -1;
  822. }
  823. si->value = v;
  824. insert_stack_item(si, pivot, so->oper_type == esotAdd);
  825. return 1;
  826. }
  827. else {
  828. destroy_value(pivot->value);
  829. pivot->value = v;
  830. return 1;
  831. }
  832. break;
  833. }
  834. case esotInsertValue:
  835. case esotAddValue: {
  836. struct eval_value v;
  837. str s, *vals;
  838. int i, n;
  839. struct eval_str* es;
  840. struct stack_item *si;
  841. eval_location(msg, &so->loc, &v, 0);
  842. get_as_str(&v, &s);
  843. if ((parse_hf_values(s, &n, &vals) < 0) || n == 0) {
  844. destroy_value(v);
  845. return -1;
  846. }
  847. si = pkg_malloc(sizeof(*si));
  848. if (!si) {
  849. ERR(MODULE_NAME": out of memory\n");
  850. destroy_value(v);
  851. return -1;
  852. }
  853. si->value.type = evtInt;
  854. si->value.u.n = n;
  855. insert_stack_item(si, pivot, so->oper_type == esotAddValue);
  856. pivot = si;
  857. for (i=0; i<n; i++) {
  858. si = pkg_malloc(sizeof(*si));
  859. if (!si) {
  860. ERR(MODULE_NAME": out of memory\n");
  861. destroy_value(v);
  862. return -1;
  863. }
  864. es = eval_str_malloc(vals+i);
  865. if (!es) {
  866. ERR(MODULE_NAME": out of memory\n");
  867. destroy_value(v);
  868. return -1;
  869. }
  870. si->value.type = evtStr;
  871. si->value.u.s = es;
  872. insert_stack_item(si, pivot, 1);
  873. pivot = si;
  874. }
  875. destroy_value(v);
  876. return 1;
  877. }
  878. default:
  879. BUG("Unexpected operation (%d)\n", so->oper_type);
  880. return -1;
  881. }
  882. }
  883. static int eval_add_fixup( void** param, int param_no) {
  884. return fixup_stack_oper(param, param_no, esotAdd);
  885. }
  886. static int eval_insert_fixup( void** param, int param_no) {
  887. return fixup_stack_oper(param, param_no, esotInsert);
  888. }
  889. static int eval_put_fixup( void** param, int param_no) {
  890. return fixup_stack_oper(param, param_no, esotPut);
  891. }
  892. static int eval_get_fixup( void** param, int param_no) {
  893. return fixup_stack_oper(param, param_no, esotGet);
  894. }
  895. static int eval_pop_fixup( void** param, int param_no) {
  896. return fixup_stack_oper(param, param_no, esotPop);
  897. }
  898. static int eval_xchg_fixup( void** param, int param_no) {
  899. return fixup_stack_oper(param, param_no, esotXchg);
  900. }
  901. static int eval_add_value_fixup( void** param, int param_no) {
  902. return fixup_stack_oper(param, param_no, esotAddValue);
  903. }
  904. static int eval_insert_value_fixup( void** param, int param_no) {
  905. return fixup_stack_oper(param, param_no, esotInsertValue);
  906. }
  907. static int eval_remove_func(struct sip_msg *msg, char *param1, char *param2) {
  908. struct stack_item *p, *p2;
  909. int ret, len, start;
  910. struct eval_value v;
  911. if (param1) {
  912. long l;
  913. eval_location(msg, (struct eval_location*) param1, &v, 1);
  914. ret = get_as_int(&v, &l);
  915. if (ret < 0) return ret;
  916. start = l;
  917. }
  918. else
  919. start = 0;
  920. p = find_stack_item(start);
  921. if (p) {
  922. if (param2) {
  923. long l;
  924. eval_location(msg, (struct eval_location*) param2, &v, 1);
  925. ret = get_as_int(&v, &l);
  926. if (ret < 0) return ret;
  927. len = l;
  928. }
  929. else
  930. len = 1;
  931. if (start < 0) {
  932. start = stack_no + start;
  933. if (start < 0) start = 0;
  934. }
  935. else {
  936. if (start > stack_no) start = stack_no;
  937. }
  938. if (len < 0) {
  939. len = stack_no - start + len;
  940. if (len < 0)
  941. len = 0;
  942. }
  943. else {
  944. if (start + len > stack_no)
  945. len = stack_no - start;
  946. }
  947. for (; len > 0 && p; len--) {
  948. p2 = p;
  949. p = p->next;
  950. remove_stack_item(p2);
  951. }
  952. return 1;
  953. }
  954. else
  955. return -1;
  956. }
  957. static int eval_clear_func(struct sip_msg *msg, char *param1, char *param2) {
  958. int n;
  959. if (get_int_fparam(&n, msg, (fparam_t*)param1)<0) {
  960. ERR(MODULE_NAME": eval_clear: Invalid number specified\n");
  961. return -1;
  962. }
  963. if (n & 1)
  964. destroy_stack();
  965. if (n & 2)
  966. destroy_register_values();
  967. return 1;
  968. }
  969. enum {esftNone=0, esftAdd, esftSub, esftMultiplication, esftDivision, esftModulo, esftNeg, esftAbs, esftSgn, esftDec, esftInc,
  970. esftConcat, esftSubstr, esftStrLen, esftStrStr, esftStrDel, esftStrUpper, esftStrLower,
  971. esftCastAsInt, esftCastAsStr,
  972. esftValueAt, esftValueUris, esftValueRev, esftSubValue, esftValueCount, esftValueConcat, esftStrValueAt,
  973. esftGetUri,
  974. esftAnd, esftOr, esftNot, esftBitAnd, esftBitOr, esftBitNot, esftBitXor, esftEQ, esftNE, esftGT, esftGE, esftLW, esftLE};
  975. struct eval_function_def {
  976. int type;
  977. char *name;
  978. int arg_no;
  979. };
  980. static struct eval_function_def eval_functions[] = {
  981. {esftAdd, "+", 2},
  982. {esftSub, "-", 2},
  983. {esftMultiplication, "*", 2},
  984. {esftDivision, "/", 2},
  985. {esftModulo, "%", 2},
  986. {esftNeg, "neg", 1},
  987. {esftAbs, "abs", 1},
  988. {esftDec, "dec", 1},
  989. {esftInc, "inc", 1},
  990. {esftSgn, "sgn", 1},
  991. {esftConcat, "concat", 2},
  992. {esftSubstr, "substr", 3},
  993. {esftStrLen, "strlen", 1},
  994. {esftStrStr, "strstr", 2},
  995. {esftStrDel, "strdel", 3},
  996. {esftStrUpper, "strupper", 1},
  997. {esftStrLower, "strlower", 1},
  998. {esftCastAsInt, "(int)", 1},
  999. {esftCastAsStr, "(str)", 1},
  1000. {esftValueAt, "valat", 2},
  1001. {esftValueUris, "valuris", 1},
  1002. {esftValueRev, "valrev", 1},
  1003. {esftSubValue, "subval", 3},
  1004. {esftValueCount, "valcount", 1},
  1005. {esftValueConcat, "valconcat", 1},
  1006. {esftStrValueAt, "strvalat", 2},
  1007. {esftGetUri, "geturi", 1},
  1008. {esftAnd, "&&", 2},
  1009. {esftOr, "||", 2},
  1010. {esftNot, "!", 1},
  1011. {esftBitAnd, "&", 2},
  1012. {esftBitOr, "|", 2},
  1013. {esftBitNot, "~", 1},
  1014. {esftBitXor, "^", 2},
  1015. {esftEQ, "==", 2},
  1016. {esftNE, "!=", 2},
  1017. {esftGT, ">", 2},
  1018. {esftGE, ">=", 2},
  1019. {esftLW, "<", 2},
  1020. {esftLE, "<=", 2},
  1021. {esftNone, NULL}
  1022. };
  1023. struct eval_function {
  1024. int resolved; /* is oper.d valid ? */
  1025. union {
  1026. struct eval_function_def *d;
  1027. struct eval_location loc;
  1028. } oper;
  1029. struct eval_function* next;
  1030. };
  1031. static int eval_stack_func_fixup( void** param, int param_no) {
  1032. char *c, *c2;
  1033. struct eval_function_def* d;
  1034. struct eval_function **p, *head;
  1035. if (param_no == 2) {
  1036. return fixup_location_12(param, param_no);
  1037. }
  1038. head = 0;
  1039. p = &head;
  1040. c = *param;
  1041. while (*c) {
  1042. str s;
  1043. struct eval_location so;
  1044. while( (*c<=' ' || *c == ',') && *c ) c++;
  1045. if (*c == '\0')
  1046. break;
  1047. c2 = c;
  1048. while (*c && *c!=',') c++;
  1049. while (c > c2 && *(c-1) <= ' ') c--;
  1050. s.s = c2;
  1051. s.len = c-c2;
  1052. if (parse_location(s, &so) < 0) {
  1053. ERR(MODULE_NAME": parse operation error near '%s'\n", c2);
  1054. return E_CFG;
  1055. }
  1056. *p = pkg_malloc(sizeof(**p));
  1057. if (!*p) return E_OUT_OF_MEM;
  1058. (*p)->next = 0;
  1059. switch (so.value_type) {
  1060. case esovtStr:
  1061. for (d=eval_functions; d->type; d++) {
  1062. if (strlen(d->name) == so.u.s.s.len && strncasecmp(d->name, so.u.s.s.s, so.u.s.s.len)==0) {
  1063. (*p)->oper.d = d;
  1064. break;
  1065. }
  1066. }
  1067. if (!d->type) {
  1068. ERR(MODULE_NAME": unknown eval function near '%s'\n", so.u.s.s.s);
  1069. return E_CFG;
  1070. }
  1071. (*p)->resolved = 1;
  1072. break;
  1073. case esovtAvp:
  1074. case esovtXStr:
  1075. case esovtRegister:
  1076. case esovtSelect:
  1077. case esovtFunc:
  1078. (*p)->oper.loc = so;
  1079. (*p)->resolved = 0;
  1080. break;
  1081. default:
  1082. ERR(MODULE_NAME": location %d not allowed\n", so.value_type);
  1083. return E_CFG;
  1084. }
  1085. p = &(*p)->next;
  1086. }
  1087. *param = head;
  1088. return 0;
  1089. }
  1090. #ifndef _GNU_SOURCE
  1091. void *memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen);
  1092. #endif
  1093. static int eval_stack_func_func(struct sip_msg *msg, char *param1, char *param2) {
  1094. struct eval_function *f;
  1095. struct stack_item *pivot;
  1096. struct eval_function_def *d;
  1097. int stack_idx = 0;
  1098. int ret = -1;
  1099. if (param2) {
  1100. long l;
  1101. int ret;
  1102. struct eval_value v;
  1103. eval_location(msg, (struct eval_location*) param2, &v, 1);
  1104. ret = get_as_int(&v, &l);
  1105. if (ret < 0) return ret;
  1106. stack_idx = l;
  1107. }
  1108. for (f = (struct eval_function*) param1; f; f=f->next, ret = 1) {
  1109. if (f->resolved) {
  1110. d = f->oper.d;
  1111. }
  1112. else {
  1113. str fn;
  1114. struct eval_value v;
  1115. eval_location(msg, &f->oper.loc, &v, 1);
  1116. get_as_str(&v, &fn);
  1117. for (d=eval_functions; d->type; d++) {
  1118. if (strlen(d->name) == fn.len && strncasecmp(d->name, fn.s, fn.len)==0) {
  1119. break;
  1120. }
  1121. }
  1122. if (!d->type) {
  1123. ERR(MODULE_NAME": unknown eval function '%.*s'\n", fn.len, fn.s);
  1124. return -1;
  1125. }
  1126. }
  1127. DEBUG(MODULE_NAME": eval_oper: %s, stack_idx: %d, stack_no: %d\n", d->name, stack_idx, stack_no);
  1128. if ( ((stack_idx >= 0) && (stack_idx+d->arg_no > stack_no)) ||
  1129. ((stack_idx < 0) && (stack_no+stack_idx < 0 || stack_no+stack_idx+d->arg_no > stack_no)) ) {
  1130. ERR(MODULE_NAME": operation out of stack range\n");
  1131. return -1;
  1132. }
  1133. pivot = find_stack_item(stack_idx);
  1134. if (!pivot) {
  1135. BUG("stack test error\n");
  1136. return -1;
  1137. }
  1138. switch (d->type) {
  1139. case esftAdd:
  1140. case esftSub:
  1141. case esftMultiplication:
  1142. case esftDivision:
  1143. case esftModulo:
  1144. case esftAnd:
  1145. case esftOr:
  1146. case esftBitAnd:
  1147. case esftBitOr:
  1148. case esftBitXor: {
  1149. long a, b;
  1150. if (get_as_int(&pivot->value, &a) < 0) return -1;
  1151. if (get_as_int(&pivot->next->value, &b) < 0) return -1;
  1152. switch (d->type) {
  1153. case esftAdd:
  1154. a = a + b;
  1155. break;
  1156. case esftSub:
  1157. a = a - b;
  1158. break;
  1159. case esftMultiplication:
  1160. a = a * b;
  1161. break;
  1162. case esftDivision:
  1163. if (b == 0) {
  1164. ERR(MODULE_NAME": division by zero\n");
  1165. return -1;
  1166. }
  1167. a = a / b;
  1168. break;
  1169. case esftModulo:
  1170. if (b == 0) {
  1171. ERR(MODULE_NAME": division by zero\n");
  1172. return -1;
  1173. }
  1174. a = a % b;
  1175. break;
  1176. case esftAnd:
  1177. a = a && b;
  1178. break;
  1179. case esftOr:
  1180. a = a || b;
  1181. break;
  1182. case esftBitAnd:
  1183. a = a & b;
  1184. break;
  1185. case esftBitOr:
  1186. a = a | b;
  1187. break;
  1188. case esftBitXor:
  1189. a = a ^ b;
  1190. break;
  1191. }
  1192. destroy_value(pivot->value);
  1193. pivot->value.type = evtInt;
  1194. pivot->value.u.n = a;
  1195. remove_stack_item(pivot->next);
  1196. break;
  1197. }
  1198. case esftNeg:
  1199. case esftAbs:
  1200. case esftSgn:
  1201. case esftDec:
  1202. case esftInc:
  1203. case esftNot:
  1204. case esftBitNot:
  1205. case esftCastAsInt: {
  1206. long a;
  1207. if (get_as_int(&pivot->value, &a) < 0) return -1;
  1208. switch (d->type) {
  1209. case esftNeg:
  1210. a = -a;
  1211. break;
  1212. case esftAbs:
  1213. a = abs(a);
  1214. break;
  1215. case esftSgn:
  1216. if (a < 0)
  1217. a = -1;
  1218. else if (a > 0)
  1219. a = 1;
  1220. else
  1221. a = 0;
  1222. break;
  1223. case esftDec:
  1224. a--;
  1225. break;
  1226. case esftInc:
  1227. a++;
  1228. break;
  1229. case esftNot:
  1230. a = !a;
  1231. break;
  1232. case esftBitNot:
  1233. a = ~a;
  1234. break;
  1235. case esftCastAsInt:
  1236. break;
  1237. }
  1238. destroy_value(pivot->value);
  1239. pivot->value.type = evtInt;
  1240. pivot->value.u.n = a;
  1241. break;
  1242. }
  1243. case esftCastAsStr:
  1244. if (pivot->value.type != evtStr) {
  1245. str s;
  1246. get_as_str(&pivot->value, &s);
  1247. destroy_value(pivot->value);
  1248. pivot->value.u.s = eval_str_malloc(&s);
  1249. if (!pivot->value.u.s) {
  1250. ERR(MODULE_NAME": out of memory\n");
  1251. return -1;
  1252. }
  1253. pivot->value.type = evtStr;
  1254. }
  1255. break;
  1256. case esftEQ:
  1257. case esftNE:
  1258. case esftGT:
  1259. case esftGE:
  1260. case esftLW:
  1261. case esftLE: {
  1262. long a;
  1263. if (pivot->value.type == evtStr || pivot->next->value.type == evtStr) {
  1264. str s1, s2;
  1265. int l;
  1266. get_as_str(&pivot->value, &s1);
  1267. get_as_str(&pivot->next->value, &s2);
  1268. l = (s1.len < s2.len)?s1.len:s2.len;
  1269. if (l > 0)
  1270. a = strncasecmp(s1.s, s2.s, l);
  1271. else
  1272. a = 0;
  1273. switch (d->type) {
  1274. case esftEQ:
  1275. a = a == 0 && s1.len == s2.len;
  1276. break;
  1277. case esftNE:
  1278. a = a != 0 || s1.len != s2.len;
  1279. break;
  1280. case esftGT:
  1281. a = a > 0 || (a == 0 && s1.len > s2.len);
  1282. break;
  1283. case esftGE:
  1284. a = a > 0 || (a == 0 && s1.len >= s2.len);
  1285. break;
  1286. case esftLW:
  1287. a = a < 0 || (a == 0 && s1.len < s2.len);
  1288. break;
  1289. case esftLE:
  1290. a = a < 0 || (a == 0 && s1.len <= s2.len);
  1291. break;
  1292. }
  1293. }
  1294. else {
  1295. long b;
  1296. if (get_as_int(&pivot->value, &a) < 0) return -1;
  1297. if (get_as_int(&pivot->next->value, &b) < 0) return -1;
  1298. switch (d->type) {
  1299. case esftEQ:
  1300. a = a == b;
  1301. break;
  1302. case esftNE:
  1303. a = a != b;
  1304. break;
  1305. case esftGT:
  1306. a = a > b;
  1307. break;
  1308. case esftGE:
  1309. a = a >= b;
  1310. break;
  1311. case esftLW:
  1312. a = a < b;
  1313. break;
  1314. case esftLE:
  1315. a = a <= b;
  1316. break;
  1317. }
  1318. }
  1319. destroy_value(pivot->value);
  1320. pivot->value.type = evtInt;
  1321. pivot->value.u.n = a;
  1322. remove_stack_item(pivot->next);
  1323. break;
  1324. }
  1325. case esftConcat: {
  1326. char buf[25];
  1327. str s, s1, s2;
  1328. struct eval_str* es;
  1329. get_as_str(&pivot->value, &s1);
  1330. if (pivot->value.type == evtInt && pivot->next->value.type == evtInt) {
  1331. memcpy(buf, s1.s, s1.len); /* result in static buffer */
  1332. s1.s = buf;
  1333. }
  1334. get_as_str(&pivot->next->value, &s2);
  1335. s.len = s1.len + s2.len;
  1336. s.s = 0;
  1337. es = eval_str_malloc(&s);
  1338. if (!es) {
  1339. ERR(MODULE_NAME": out of memory\n");
  1340. return -1;
  1341. }
  1342. memcpy(s.s, s1.s, s1.len);
  1343. memcpy(s.s+s1.len, s2.s, s2.len);
  1344. destroy_value(pivot->value);
  1345. pivot->value.type = evtStr;
  1346. pivot->value.u.s = es;
  1347. remove_stack_item(pivot->next);
  1348. break;
  1349. }
  1350. case esftSubstr: {
  1351. long start, len;
  1352. str s1;
  1353. struct eval_str* es;
  1354. get_as_str(&pivot->value, &s1);
  1355. if (get_as_int(&pivot->next->value, &start) < 0) return -1;
  1356. if (get_as_int(&pivot->next->next->value, &len) < 0) return -1;
  1357. if (start < 0) {
  1358. start = s1.len + start;
  1359. if (start < 0) start = 0;
  1360. }
  1361. else {
  1362. if (start > s1.len) start = s1.len;
  1363. }
  1364. if (len < 0) {
  1365. len = s1.len - start + len;
  1366. if (len < 0)
  1367. len = 0;
  1368. }
  1369. else {
  1370. if (start + len > s1.len)
  1371. len = s1.len - start;
  1372. }
  1373. s1.s += start;
  1374. s1.len = len;
  1375. es = eval_str_malloc(&s1);
  1376. if (!es) {
  1377. ERR(MODULE_NAME": out of memory\n");
  1378. return -1;
  1379. }
  1380. destroy_value(pivot->value);
  1381. pivot->value.type = evtStr;
  1382. pivot->value.u.s = es;
  1383. remove_stack_item(pivot->next);
  1384. remove_stack_item(pivot->next);
  1385. break;
  1386. }
  1387. case esftStrLen: {
  1388. long len;
  1389. str s1;
  1390. get_as_str(&pivot->value, &s1);
  1391. len = s1.len;
  1392. destroy_value(pivot->value);
  1393. pivot->value.type = evtInt;
  1394. pivot->value.u.n = len;
  1395. break;
  1396. }
  1397. case esftStrStr: {
  1398. char buf[25], *p;
  1399. str s1, s2;
  1400. get_as_str(&pivot->value, &s1);
  1401. if (pivot->value.type == evtInt && pivot->next->value.type == evtInt) {
  1402. memcpy(buf, s1.s, s1.len); /* result in static buffer */
  1403. s1.s = buf;
  1404. }
  1405. get_as_str(&pivot->next->value, &s2);
  1406. p = (char *) memmem(s1.s, s1.len, s2.s, s2.len);
  1407. destroy_value(pivot->value);
  1408. pivot->value.type = evtInt;
  1409. pivot->value.u.n = p?p-s1.s:-1;
  1410. remove_stack_item(pivot->next);
  1411. break;
  1412. }
  1413. case esftStrDel: {
  1414. long start, len;
  1415. str s1, s;
  1416. struct eval_str* es;
  1417. get_as_str(&pivot->value, &s1);
  1418. if (get_as_int(&pivot->next->value, &start) < 0) return -1;
  1419. if (get_as_int(&pivot->next->next->value, &len) < 0) return -1;
  1420. if (start < 0) {
  1421. start = s1.len + start;
  1422. if (start < 0) start = 0;
  1423. }
  1424. else {
  1425. if (start > s1.len) start = s1.len;
  1426. }
  1427. if (len < 0) {
  1428. len = s1.len - start + len;
  1429. if (len < 0)
  1430. len = 0;
  1431. }
  1432. else {
  1433. if (start + len > s1.len)
  1434. len = s1.len - start;
  1435. }
  1436. s.s = 0;
  1437. s.len = s1.len - len;
  1438. es = eval_str_malloc(&s);
  1439. if (!es) {
  1440. ERR(MODULE_NAME": out of memory\n");
  1441. return -1;
  1442. }
  1443. if (start > 0)
  1444. memcpy(s.s, s1.s, start);
  1445. memcpy(s.s+start, s1.s+start+len, s1.len-(start+len));
  1446. destroy_value(pivot->value);
  1447. pivot->value.type = evtStr;
  1448. pivot->value.u.s = es;
  1449. remove_stack_item(pivot->next);
  1450. remove_stack_item(pivot->next);
  1451. break;
  1452. }
  1453. case esftStrUpper:
  1454. case esftStrLower: {
  1455. str s1;
  1456. int i;
  1457. struct eval_str* es;
  1458. get_as_str(&pivot->value, &s1);
  1459. es = eval_str_malloc(&s1);
  1460. if (!es) {
  1461. ERR(MODULE_NAME": out of memory\n");
  1462. return -1;
  1463. }
  1464. for (i=0; i<es->s.len; i++)
  1465. es->s.s[i] = (d->type == esftStrUpper) ? toupper(es->s.s[i]) : tolower(es->s.s[i]);
  1466. destroy_value(pivot->value);
  1467. pivot->value.type = evtStr;
  1468. pivot->value.u.s = es;
  1469. break;
  1470. }
  1471. case esftValueAt: {
  1472. str s1, *vals;
  1473. long idx;
  1474. int n;
  1475. struct eval_str* es;
  1476. get_as_str(&pivot->value, &s1);
  1477. if (get_as_int(&pivot->next->value, &idx) < 0) return -1;
  1478. if (parse_hf_values(s1, &n, &vals) < 0) return -1;
  1479. if (idx < 0|| idx >= n) {
  1480. ERR(MODULE_NAME": index (%ld) of of range (%d)\n", idx, n);
  1481. return -1;
  1482. }
  1483. es = eval_str_malloc(vals+idx);
  1484. if (!es) {
  1485. ERR(MODULE_NAME": out of memory\n");
  1486. return -1;
  1487. }
  1488. destroy_value(pivot->value);
  1489. pivot->value.type = evtStr;
  1490. pivot->value.u.s = es;
  1491. remove_stack_item(pivot->next);
  1492. break;
  1493. }
  1494. case esftStrValueAt: {
  1495. char buf[25];
  1496. str s1, s2, *vals;
  1497. int i, n;
  1498. get_as_str(&pivot->value, &s1);
  1499. if (pivot->value.type == evtInt && pivot->next->value.type == evtInt) {
  1500. memcpy(buf, s1.s, s1.len); /* result in static buffer */
  1501. s1.s = buf;
  1502. }
  1503. get_as_str(&pivot->next->value, &s2);
  1504. if (parse_hf_values(s1, &n, &vals) < 0) return -1;
  1505. for (i=0; i<n; i++) {
  1506. if (s2.len == vals[i].len && strncmp(s2.s, vals[i].s, s2.len) == 0)
  1507. break;
  1508. }
  1509. destroy_value(pivot->value);
  1510. pivot->value.type = evtInt;
  1511. pivot->value.u.n = (i>=n)?-1:i;
  1512. remove_stack_item(pivot->next);
  1513. break;
  1514. }
  1515. case esftValueCount: {
  1516. str s1, *vals;
  1517. int n;
  1518. get_as_str(&pivot->value, &s1);
  1519. if (parse_hf_values(s1, &n, &vals) < 0) return -1;
  1520. destroy_value(pivot->value);
  1521. pivot->value.type = evtInt;
  1522. pivot->value.u.n = n;
  1523. break;
  1524. }
  1525. case esftSubValue: {
  1526. long start, len;
  1527. int i, n, pos;
  1528. str s1, s, *vals;
  1529. struct eval_str* es;
  1530. get_as_str(&pivot->value, &s1);
  1531. if (get_as_int(&pivot->next->value, &start) < 0) return -1;
  1532. if (get_as_int(&pivot->next->next->value, &len) < 0) return -1;
  1533. if (parse_hf_values(s1, &n, &vals) < 0) return -1;
  1534. if (start < 0) {
  1535. start = n + start;
  1536. if (start < 0) start = 0;
  1537. }
  1538. else {
  1539. if (start > n) start = n;
  1540. }
  1541. if (len < 0) {
  1542. len = n - start + len;
  1543. if (len < 0)
  1544. len = 0;
  1545. }
  1546. else {
  1547. if (start + len > n)
  1548. len = n - start;
  1549. }
  1550. s.len = 0;
  1551. for (i=0; i<len; i++) {
  1552. s.len += vals[start+i].len+1/*delim*/;
  1553. }
  1554. if (s.len)
  1555. s.len--;
  1556. s.s = 0;
  1557. es = eval_str_malloc(&s);
  1558. if (!es) {
  1559. ERR(MODULE_NAME": out of memory\n");
  1560. return -1;
  1561. }
  1562. for (i=0, pos=0; i<len; i++) {
  1563. if (pos > 0)
  1564. s.s[pos++] = ',';
  1565. memcpy(s.s+pos, vals[start+i].s, vals[start+i].len);
  1566. pos += vals[start+i].len;
  1567. }
  1568. destroy_value(pivot->value);
  1569. pivot->value.type = evtStr;
  1570. pivot->value.u.s = es;
  1571. remove_stack_item(pivot->next);
  1572. remove_stack_item(pivot->next);
  1573. break;
  1574. }
  1575. case esftValueConcat: {
  1576. long n;
  1577. int i, pos;
  1578. str s1, s;
  1579. struct eval_str* es;
  1580. struct stack_item *si;
  1581. if (get_as_int(&pivot->value, &n) < 0) return -1;
  1582. for (si=pivot->next, s.len=0, i=0; i<n && si; i++, si=si->next) {
  1583. get_as_str(&si->value, &s1);
  1584. s.len += s1.len+1;
  1585. }
  1586. if (s.len)
  1587. s.len--;
  1588. s.s = 0;
  1589. es = eval_str_malloc(&s);
  1590. if (!es) {
  1591. ERR(MODULE_NAME": out of memory\n");
  1592. return -1;
  1593. }
  1594. for (si=pivot->next, i=0, pos=0; i<n && si; i++, si=si->next) {
  1595. if (pos > 0)
  1596. s.s[pos++] = ',';
  1597. get_as_str(&si->value, &s1);
  1598. memcpy(s.s+pos, s1.s, s1.len);
  1599. pos += s1.len;
  1600. }
  1601. destroy_value(pivot->value);
  1602. pivot->value.type = evtStr;
  1603. pivot->value.u.s = es;
  1604. for (si=pivot->next, i=0; i<n && si; i++) {
  1605. struct stack_item *si2;
  1606. si2 = si;
  1607. si=si->next;
  1608. remove_stack_item(si2);
  1609. }
  1610. break;
  1611. }
  1612. case esftValueRev: {
  1613. int i, n, pos;
  1614. str s1, s, *vals;
  1615. struct eval_str* es;
  1616. get_as_str(&pivot->value, &s1);
  1617. if (parse_hf_values(s1, &n, &vals) < 0) return -1;
  1618. s.len = 0;
  1619. for (i=0; i<n; i++) {
  1620. s.len += vals[i].len+1/*delim*/;
  1621. }
  1622. if (s.len)
  1623. s.len--;
  1624. s.s = 0;
  1625. es = eval_str_malloc(&s);
  1626. if (!es) {
  1627. ERR(MODULE_NAME": out of memory\n");
  1628. return -1;
  1629. }
  1630. for (i=n-1, pos=0; i>=0; i--) {
  1631. if (pos > 0)
  1632. s.s[pos++] = ',';
  1633. memcpy(s.s+pos, vals[i].s, vals[i].len);
  1634. pos += vals[i].len;
  1635. }
  1636. destroy_value(pivot->value);
  1637. pivot->value.type = evtStr;
  1638. pivot->value.u.s = es;
  1639. break;
  1640. }
  1641. case esftValueUris: {
  1642. int i, n, pos;
  1643. str s1, s, *vals;
  1644. struct eval_str* es;
  1645. get_as_str(&pivot->value, &s1);
  1646. if (parse_hf_values(s1, &n, &vals) < 0) return -1;
  1647. s.len = 0;
  1648. for (i=0; i<n; i++) {
  1649. s.len += vals[i].len+1/*delim*/;
  1650. }
  1651. if (s.len)
  1652. s.len--;
  1653. s.s = 0;
  1654. es = eval_str_malloc(&s);
  1655. if (!es) {
  1656. ERR(MODULE_NAME": out of memory\n");
  1657. return -1;
  1658. }
  1659. for (i=0, pos=0; i<n; i++) {
  1660. str hval1, huri;
  1661. if (pos > 0)
  1662. s.s[pos++] = ',';
  1663. hval1 = *(vals+i);
  1664. get_uri_and_skip_until_params(&hval1, &huri);
  1665. if (huri.len) {
  1666. /* TODO: normalize uri, lowercase except quoted params */
  1667. memcpy(s.s+pos, huri.s, huri.len);
  1668. pos += huri.len;
  1669. }
  1670. }
  1671. es->s.len = pos;
  1672. destroy_value(pivot->value);
  1673. pivot->value.type = evtStr;
  1674. pivot->value.u.s = es;
  1675. break;
  1676. }
  1677. case esftGetUri: {
  1678. str s1, huri;
  1679. struct eval_str* es;
  1680. get_as_str(&pivot->value, &s1);
  1681. get_uri_and_skip_until_params(&s1, &huri);
  1682. if (huri.len && *(huri.s) == '<') {
  1683. huri.s++; /* strip < & > */
  1684. huri.len-=2;
  1685. }
  1686. es = eval_str_malloc(&huri);
  1687. if (!es) {
  1688. ERR(MODULE_NAME": out of memory\n");
  1689. return -1;
  1690. }
  1691. destroy_value(pivot->value);
  1692. pivot->value.type = evtStr;
  1693. pivot->value.u.s = es;
  1694. break;
  1695. }
  1696. default:
  1697. BUG("Bad operation %d\n", d->type);
  1698. return -1;
  1699. }
  1700. }
  1701. return ret;
  1702. }
  1703. static int eval_while_fixup(void **param, int param_no) {
  1704. if (param_no == 2) {
  1705. return fixup_location_12(param, param_no);
  1706. }
  1707. else if (param_no == 1) {
  1708. int n;
  1709. n = route_get(&main_rt, (char*) *param);
  1710. if (n == -1) {
  1711. ERR(MODULE_NAME": eval_while: bad route\n");
  1712. return E_CFG;
  1713. }
  1714. pkg_free(*param);
  1715. *param=(void*) (intptr_t) n;
  1716. }
  1717. return 0;
  1718. }
  1719. static int eval_while_func(struct sip_msg *msg, char *route_no, char *param2) {
  1720. int ret, idx;
  1721. struct stack_item *pivot;
  1722. struct run_act_ctx ra_ctx;
  1723. if (param2) {
  1724. long l;
  1725. struct eval_value v;
  1726. eval_location(msg, (struct eval_location*) param2, &v, 1);
  1727. ret = get_as_int(&v, &l);
  1728. if (ret < 0) return ret;
  1729. idx = l;
  1730. }
  1731. else {
  1732. idx = 0; /* default values */
  1733. }
  1734. ret = -1;
  1735. while (1) {
  1736. pivot = find_stack_item(idx);
  1737. if (!pivot) break;
  1738. if (get_as_bool(&pivot->value) <= 0) break;
  1739. if ((intptr_t)route_no >= main_rt.idx) {
  1740. BUG("invalid routing table number #%d of %d\n", (int)(intptr_t) route_no, main_rt.idx);
  1741. return -1;
  1742. }
  1743. if (!main_rt.rlist[(intptr_t) route_no]) {
  1744. WARN(MODULE_NAME": route not declared (hash:%d)\n", (int)(intptr_t) route_no);
  1745. return -1;
  1746. }
  1747. /* exec the routing script */
  1748. init_run_actions_ctx(&ra_ctx);
  1749. ret = run_actions(&ra_ctx, main_rt.rlist[(intptr_t) route_no], msg);
  1750. if (ret <= 0) break;
  1751. }
  1752. return ret;
  1753. }
  1754. static int eval_while_stack_func(struct sip_msg *msg, char *route_no, char *param2) {
  1755. int ret, count;
  1756. struct run_act_ctx ra_ctx;
  1757. if (param2) {
  1758. long l;
  1759. struct eval_value v;
  1760. eval_location(msg, (struct eval_location*) param2, &v, 1);
  1761. ret = get_as_int(&v, &l);
  1762. if (ret < 0) return ret;
  1763. count = l;
  1764. }
  1765. else {
  1766. count = 0; /* default values */
  1767. }
  1768. ret = -1;
  1769. while ((count >= 0 && stack_no > count) || (count < 0 && stack_no < -count)) {
  1770. if ((intptr_t)route_no >= main_rt.idx) {
  1771. BUG("invalid routing table number #%d of %d\n", (int)(intptr_t) route_no, main_rt.idx);
  1772. return -1;
  1773. }
  1774. if (!main_rt.rlist[(intptr_t) route_no]) {
  1775. WARN(MODULE_NAME": route not declared (hash:%d)\n", (int)(intptr_t) route_no);
  1776. return -1;
  1777. }
  1778. /* exec the routing script */
  1779. init_run_actions_ctx(&ra_ctx);
  1780. ret = run_actions(&ra_ctx, main_rt.rlist[(intptr_t) route_no], msg);
  1781. if (ret <= 0) break;
  1782. }
  1783. return ret;
  1784. }
  1785. /* select functions */
  1786. static int sel_value2str(str* res, struct eval_value *v, int force_copy) {
  1787. res->len = 0;
  1788. switch (v->type) {
  1789. case evtInt: {
  1790. char buf[30];
  1791. res->len = snprintf(buf, sizeof(buf)-1, "%ld", v->u.n);
  1792. res->s = get_static_buffer(res->len);
  1793. if (res->s)
  1794. memcpy(res->s, buf, res->len);
  1795. else
  1796. res->len = 0;
  1797. break;
  1798. }
  1799. case evtStr:
  1800. if (v->u.s) {
  1801. *res = v->u.s->s;
  1802. if (force_copy && res->len) {
  1803. res->s = get_static_buffer(res->len);
  1804. if (res->s)
  1805. memcpy(res->s, v->u.s->s.s, res->len);
  1806. else
  1807. res->len = 0;
  1808. }
  1809. }
  1810. break;
  1811. }
  1812. return 0;
  1813. }
  1814. static int sel_eval(str* res, select_t* s, struct sip_msg* msg) { /* dummy */
  1815. return 0;
  1816. }
  1817. static int sel_register(str* res, select_t* s, struct sip_msg* msg) {
  1818. if (msg == 0) {
  1819. struct register_item *p = find_register(s->params[2].v.s.s, s->params[2].v.s.len);
  1820. if (p == 0) {
  1821. ERR(MODULE_NAME": select: register '%.*s' not found\n", s->params[2].v.s.len, s->params[2].v.s.s);
  1822. return E_CFG;
  1823. }
  1824. s->params[2].v.p = p;
  1825. s->params[2].type = SEL_PARAM_PTR;
  1826. }
  1827. else {
  1828. return sel_value2str(res, &((struct register_item *)s->params[2].v.p)->value, 0);
  1829. }
  1830. return 0;
  1831. }
  1832. static int sel_get_and_remove(str* res, select_t* s, struct sip_msg* msg) {
  1833. struct stack_item* p;
  1834. res->len = 0;
  1835. p = find_stack_item(s->params[2].v.i);
  1836. if (p) {
  1837. sel_value2str(res, &p->value, 1);
  1838. remove_stack_item(p);
  1839. }
  1840. return 0;
  1841. }
  1842. static int sel_get(str* res, select_t* s, struct sip_msg* msg) {
  1843. struct stack_item* p;
  1844. res->len = 0;
  1845. p = find_stack_item(s->params[2].v.i);
  1846. if (p) {
  1847. sel_value2str(res, &p->value, 0);
  1848. }
  1849. return 0;
  1850. }
  1851. SELECT_F(select_any_nameaddr)
  1852. SELECT_F(select_any_uri)
  1853. SELECT_F(select_anyheader_params)
  1854. select_row_t sel_declaration[] = {
  1855. { NULL, SEL_PARAM_STR, STR_STATIC_INIT(MODULE_NAME), sel_eval, SEL_PARAM_EXPECTED},
  1856. { sel_eval, SEL_PARAM_STR, STR_STATIC_INIT("pop"), sel_get_and_remove, CONSUME_NEXT_INT },
  1857. { sel_eval, SEL_PARAM_STR, STR_STATIC_INIT("get"), sel_get, CONSUME_NEXT_INT },
  1858. { sel_eval, SEL_PARAM_STR, STR_STATIC_INIT("reg"), sel_register, CONSUME_NEXT_STR|FIXUP_CALL },
  1859. { sel_get, SEL_PARAM_STR, STR_STATIC_INIT("nameaddr"), select_any_nameaddr, NESTED | CONSUME_NEXT_STR},
  1860. { sel_get, SEL_PARAM_STR, STR_STATIC_INIT("uri"), select_any_uri, NESTED | CONSUME_NEXT_STR},
  1861. { sel_get, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_anyheader_params, NESTED},
  1862. { sel_register, SEL_PARAM_STR, STR_STATIC_INIT("nameaddr"), select_any_nameaddr, NESTED | CONSUME_NEXT_STR},
  1863. { sel_register, SEL_PARAM_STR, STR_STATIC_INIT("uri"), select_any_uri, NESTED | CONSUME_NEXT_STR},
  1864. { sel_register, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_anyheader_params, NESTED},
  1865. /* for backward compatability only, use @sys.unique */
  1866. { sel_eval, SEL_PARAM_STR, STR_STATIC_INIT("uuid"), select_sys_unique, 0},
  1867. { NULL, SEL_PARAM_INT, STR_NULL, NULL, 0}
  1868. };
  1869. static int mod_init() {
  1870. register_script_cb(mod_pre_script_cb, REQUEST_CB | ONREPLY_CB | PRE_SCRIPT_CB, 0);
  1871. register_select_table(sel_declaration);
  1872. return 0;
  1873. }
  1874. static int child_init(int rank) {
  1875. return 0;
  1876. }
  1877. static void destroy_mod(void) {
  1878. struct register_item *p;
  1879. destroy_stack();
  1880. destroy_register_values();
  1881. while (registers) {
  1882. p = registers;
  1883. registers = registers->next;
  1884. pkg_free(p);
  1885. }
  1886. }
  1887. /*
  1888. * Exported functions
  1889. */
  1890. static cmd_export_t cmds[] = {
  1891. {MODULE_NAME"_add", eval_stack_oper_func, 2, eval_add_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1892. {MODULE_NAME"_add", eval_stack_oper_func, 1, eval_add_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1893. {MODULE_NAME"_push", eval_stack_oper_func, 2, eval_add_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1894. {MODULE_NAME"_push", eval_stack_oper_func, 1, eval_add_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1895. {MODULE_NAME"_insert", eval_stack_oper_func, 2, eval_insert_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1896. {MODULE_NAME"_insert", eval_stack_oper_func, 1, eval_insert_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1897. {MODULE_NAME"_xchg", eval_stack_oper_func, 2, eval_xchg_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1898. {MODULE_NAME"_xchg", eval_stack_oper_func, 1, eval_xchg_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1899. {MODULE_NAME"_get", eval_stack_oper_func, 2, eval_get_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1900. {MODULE_NAME"_get", eval_stack_oper_func, 1, eval_get_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1901. {MODULE_NAME"_put", eval_stack_oper_func, 2, eval_put_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1902. {MODULE_NAME"_put", eval_stack_oper_func, 1, eval_put_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1903. {MODULE_NAME"_pop", eval_stack_oper_func, 2, eval_pop_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1904. {MODULE_NAME"_pop", eval_stack_oper_func, 1, eval_pop_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1905. {MODULE_NAME"_add_value", eval_stack_oper_func, 2, eval_add_value_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1906. {MODULE_NAME"_add_value", eval_stack_oper_func, 1, eval_add_value_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1907. {MODULE_NAME"_insert_value", eval_stack_oper_func, 2, eval_insert_value_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1908. {MODULE_NAME"_insert_value", eval_stack_oper_func, 1, eval_insert_value_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1909. {MODULE_NAME"_remove", eval_remove_func, 0, fixup_location_12, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1910. {MODULE_NAME"_remove", eval_remove_func, 1, fixup_location_12, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1911. {MODULE_NAME"_remove", eval_remove_func, 2, fixup_location_12, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1912. {MODULE_NAME"_clear", eval_clear_func, 1, fixup_int_12, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1913. {MODULE_NAME"_oper", eval_stack_func_func, 2, eval_stack_func_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1914. {MODULE_NAME"_oper", eval_stack_func_func, 1, eval_stack_func_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1915. {MODULE_NAME"_while", eval_while_func, 1, eval_while_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1916. {MODULE_NAME"_while", eval_while_func, 2, eval_while_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1917. {MODULE_NAME"_while_stack", eval_while_stack_func, 1, eval_while_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1918. {MODULE_NAME"_while_stack", eval_while_stack_func, 2, eval_while_fixup, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1919. {MODULE_NAME"_dump", eval_dump_func, 0, 0, REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE | ONSEND_ROUTE},
  1920. {0, 0, 0, 0, 0}
  1921. };
  1922. /*
  1923. * Exported parameters
  1924. */
  1925. static param_export_t params[] = {
  1926. {"declare_register", PARAM_STRING|PARAM_USE_FUNC, (void*) declare_register},
  1927. {"xlbuf_size", PARAM_INT, &xlbuf_size},
  1928. {0, 0, 0}
  1929. };
  1930. struct module_exports exports = {
  1931. MODULE_NAME,
  1932. cmds, /* Exported commands */
  1933. 0, /* RPC */
  1934. params, /* Exported parameters */
  1935. mod_init, /* module initialization function */
  1936. 0, /* response function*/
  1937. destroy_mod, /* destroy function */
  1938. 0, /* oncancel function */
  1939. child_init /* per-child init function */
  1940. };