Kaynağa Gözat

core: cfg.lex support for undefned env vars

Feature Request GH #2967 for undefined defenv

Add new keywords for preprocessing:

- #!trydefenv - The same as #!defenv, except if the variable is
  undefined, the def value will be undefined as well.

- #!trydefenvs - The same as #!defenvs, except if the variable is
  undefined, the def value will be undefined as well.
Ben Kaufman 3 yıl önce
ebeveyn
işleme
03cd22b41b
2 değiştirilmiş dosya ile 57 ekleme ve 7 silme
  1. 52 4
      src/core/cfg.lex
  2. 5 3
      src/core/ppcfg.h

+ 52 - 4
src/core/cfg.lex

@@ -130,7 +130,8 @@
 /* start conditions */
 %x STRING1 STRING2 STR_BETWEEN COMMENT COMMENT_LN ATTR SELECT AVP_PVAR PVAR_P
 %x PVARID INCLF IMPTF EVRTNAME CFGPRINTMODE CFGPRINTLOADMOD DEFENV_ID DEFENVS_ID
-%x LINECOMMENT DEFINE_ID DEFINE_EOL DEFINE_DATA IFDEF_ID IFDEF_EOL IFDEF_SKIP
+%x TRYDEFENV_ID TRYDEFENVS_ID LINECOMMENT DEFINE_ID DEFINE_EOL DEFINE_DATA 
+%x IFDEF_ID IFDEF_EOL IFDEF_SKIP
 
 /* config script types : #!SER  or #!KAMAILIO or #!MAX_COMPAT */
 SER_CFG			SER
@@ -566,6 +567,8 @@ TRYDEF       "trydefine"|"trydef"
 REDEF        "redefine"|"redef"
 DEFENV       defenv
 DEFENVS      defenvs
+TRYDEFENV    trydefenv
+TRYDEFENVS   trydefenvs
 
 /* else is already defined */
 
@@ -1450,7 +1453,7 @@ IMPORTFILE      "import_file"
 <DEFENV_ID>[^ \t\r\n]+   { /* get the define id of environment variable */
 				count();
 				ksr_cfg_print_part(yytext);
-				if(pp_define_env(yytext, yyleng, KSR_PPDEF_NORMAL) < 0) {
+				if(pp_define_env(yytext, yyleng, KSR_PPDEF_NORMAL, KSR_PPDEF_NONULL) < 0) {
 					LM_CRIT("error at %s line %d\n", (finame)?finame:"cfg", line);
 					ksr_exit(-1);
 				}
@@ -1471,7 +1474,49 @@ IMPORTFILE      "import_file"
 <DEFENVS_ID>[^ \t\r\n]+   { /* get the define id of environment variable */
 				count();
 				ksr_cfg_print_part(yytext);
-				if(pp_define_env(yytext, yyleng, KSR_PPDEF_QUOTED) < 0) {
+				if(pp_define_env(yytext, yyleng, KSR_PPDEF_QUOTED, KSR_PPDEF_NONULL) < 0) {
+					LM_CRIT("error at %s line %d\n", (finame)?finame:"cfg", line);
+					ksr_exit(-1);
+				}
+				state = INITIAL;
+				ksr_cfg_print_initial_state();
+}
+
+<INITIAL,CFGPRINTMODE>{PREP_START}{TRYDEFENV}  { count(); 
+			ksr_cfg_print_part(yytext);
+			state = DEFINE_S;
+			BEGIN(TRYDEFENV_ID);
+}
+
+<TRYDEFENV_ID>[ \t]*      { /* eat the whitespace */
+				count();
+				ksr_cfg_print_part(yytext);
+			}
+<TRYDEFENV_ID>[^ \t\r\n]+   { /* get the define id of environment variable */
+				count();
+				ksr_cfg_print_part(yytext);
+				if(pp_define_env(yytext, yyleng, KSR_PPDEF_NORMAL, KSR_PPDEF_NULLABLE) < 0) {
+					LM_CRIT("error at %s line %d\n", (finame)?finame:"cfg", line);
+					ksr_exit(-1);
+				}
+				state = INITIAL;
+				ksr_cfg_print_initial_state();
+}
+
+<INITIAL,CFGPRINTMODE>{PREP_START}{TRYDEFENVS}  { count(); 
+			ksr_cfg_print_part(yytext);
+			state = DEFINE_S;
+			BEGIN(TRYDEFENVS_ID);
+}
+
+<TRYDEFENVS_ID>[ \t]*      { /* eat the whitespace */
+				count();
+				ksr_cfg_print_part(yytext);
+			}
+<TRYDEFENVS_ID>[^ \t\r\n]+   { /* get the define id of environment variable */
+				count();
+				ksr_cfg_print_part(yytext);
+				if(pp_define_env(yytext, yyleng, KSR_PPDEF_QUOTED, KSR_PPDEF_NULLABLE) < 0) {
 					LM_CRIT("error at %s line %d\n", (finame)?finame:"cfg", line);
 					ksr_exit(-1);
 				}
@@ -2082,7 +2127,7 @@ int pp_define_set(int len, char *text, int mode)
 	return 0;
 }
 
-int pp_define_env(const char *text, int len, int qmode)
+int pp_define_env(const char *text, int len, int qmode, int nullable )
 {
 	char *r;
 	str defname;
@@ -2106,6 +2151,9 @@ int pp_define_env(const char *text, int len, int qmode)
 	defvalue.s = getenv(r);
 
 	if(defvalue.s == NULL) {
+        if( nullable == KSR_PPDEF_NULLABLE ) {
+            return 0;
+        }
 		LM_ERR("env variable not defined [%s]\n", (char*)text);
 		return -1;
 	}

+ 5 - 3
src/core/ppcfg.h

@@ -25,8 +25,10 @@
 
 #include "str.h"
 
-#define KSR_PPDEF_NORMAL (0)     /* define normal value */
-#define KSR_PPDEF_QUOTED (1<<0)  /* define quoted value */
+#define KSR_PPDEF_NORMAL (0)       /* define normal value */
+#define KSR_PPDEF_QUOTED (1<<0)    /* define quoted value */
+#define KSR_PPDEF_NONULL (0)       /* disallow undef values for envdefn* */
+#define KSR_PPDEF_NULLABLE (1<<0)  /* allow undef values for envdefn* */ 
 
 typedef struct ksr_ppdefine {
 	str name;
@@ -47,7 +49,7 @@ int  pp_define(int len, const char *text);
 int  pp_define_set(int len, char *text, int mode);
 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, int qmode);
+int  pp_define_env(const char * text, int len, int qmode, int nullable);
 
 void pp_ifdef_level_update(int val);
 int pp_ifdef_level_check(void);