Module: kamailio Branch: master Commit: b40a2a42a3f4f3a21f2d0a2f9ec3c18668a05b4d URL: https://github.com/kamailio/kamailio/commit/b40a2a42a3f4f3a21f2d0a2f9ec3c186...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: 2020-11-19T16:16:35+01:00
core: new preprocessor directive $!defenv ID=ENVVAR
- define an ID to the value of an environment variable with the name ENVVAR - it can also be just $!defenv ENVVAR and the ID is set to ENVVAR name - example: #!defenv SHELL * if environment variable $SHELL is '/bin/bash', then it is like #!define SHELL /bin/bash * variant: #!defenv ENVSHELL=SHELL * then it is like #!define ENVSHELL /bin/bash - it is a simplified alternative of using #!substdef with $env(NAME) in replacement part
---
Modified: src/core/cfg.lex Modified: src/core/ppcfg.h
---
Diff: https://github.com/kamailio/kamailio/commit/b40a2a42a3f4f3a21f2d0a2f9ec3c186... Patch: https://github.com/kamailio/kamailio/commit/b40a2a42a3f4f3a21f2d0a2f9ec3c186...
---
diff --git a/src/core/cfg.lex b/src/core/cfg.lex index 0d18031692..e6afb549d1 100644 --- a/src/core/cfg.lex +++ b/src/core/cfg.lex @@ -125,7 +125,7 @@
/* start conditions */ %x STRING1 STRING2 STR_BETWEEN COMMENT COMMENT_LN ATTR SELECT AVP_PVAR PVAR_P -%x PVARID INCLF IMPTF EVRTNAME CFGPRINTMODE CFGPRINTLOADMOD +%x PVARID INCLF IMPTF EVRTNAME CFGPRINTMODE CFGPRINTLOADMOD DEFENV_ID %x LINECOMMENT DEFINE_ID DEFINE_EOL DEFINE_DATA IFDEF_ID IFDEF_EOL IFDEF_SKIP
/* config script types : #!SER or #!KAMAILIO or #!MAX_COMPAT */ @@ -551,6 +551,7 @@ IFNDEF ifndef ENDIF endif TRYDEF "trydefine"|"trydef" REDEF "redefine"|"redef" +DEFENV defenv
/* else is already defined */
@@ -1413,6 +1414,27 @@ IMPORTFILE "import_file" ksr_cfg_print_initial_state(); }
+<INITIAL,CFGPRINTMODE>{PREP_START}{DEFENV} { count(); + ksr_cfg_print_part(yytext); + state = DEFINE_S; + BEGIN(DEFENV_ID); +} + +<DEFENV_ID>[ \t]* { /* eat the whitespace */ + count(); + ksr_cfg_print_part(yytext); + } +<DEFENV_ID>[^ \t\r\n]+ { /* get the define id of environment variable */ + count(); + ksr_cfg_print_part(yytext); + if(pp_define_env(yytext, yyleng) < 0) { + LM_CRIT("error at %s line %d\n", (finame)?finame:"cfg", line); + exit(-1); + } + state = INITIAL; + ksr_cfg_print_initial_state(); +} + <CFGPRINTMODE>{LOADMODULE} { count(); printf("%s", yytext); BEGIN(CFGPRINTLOADMOD); } @@ -2000,6 +2022,47 @@ int pp_define_set(int len, char *text) return 0; }
+int pp_define_env(const char * text, int len) +{ + char *r; + str defname; + str defvalue; + + r = strchr(text, '='); + + defname.s = (char*)text; + if(r == NULL) { + defname.len = len; + r = (char*)text; + } else { + defname.len = r - text; + r++; + if(strlen(r) == 0) { + LM_ERR("invalid defenv id [%s]\n", (char*)text); + return -1; + } + } + defvalue.s = getenv(r); + + if(defvalue.s == NULL) { + LM_ERR("env variable not defined [%s]\n", (char*)text); + return -1; + } + defvalue.len = strlen(defvalue.s); + + pp_define_set_type(0); + if(pp_define(defname.len, defname.s)<0) { + LM_ERR("cannot set define name [%s]\n", (char*)text); + return -1; + } + if(pp_define_set(defvalue.len, defvalue.s)<0) { + LM_ERR("cannot set define value [%s]\n", (char*)text); + return -1; + } + + return 0; +} + str *pp_define_get(int len, const char * text) { str var = {(char *)text, len}; diff --git a/src/core/ppcfg.h b/src/core/ppcfg.h index 0573b0165d..70627268b6 100644 --- a/src/core/ppcfg.h +++ b/src/core/ppcfg.h @@ -42,6 +42,7 @@ int pp_define(int len, const char *text); int pp_define_set(int len, char *text); int pp_define_set_type(int type); str *pp_define_get(int len, const char * text); +int pp_define_env(const char * text, int len);
void pp_ifdef_level_update(int val); int pp_ifdef_level_check(void);