浏览代码

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
Daniel-Constantin Mierla 4 年之前
父节点
当前提交
b40a2a42a3
共有 2 个文件被更改,包括 65 次插入1 次删除
  1. 64 1
      src/core/cfg.lex
  2. 1 0
      src/core/ppcfg.h

+ 64 - 1
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};

+ 1 - 0
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);