Module: sip-router
Branch: master
Commit: 1cdad56cd88cad2b0732818880ae326e6da5735c
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=1cdad56…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Tue Jul 5 09:15:34 2011 +0200
core: added import_file
- import_file is similar to include_file but does not throws error if
the file is not found:
- example: import_file "myfile.cfg"
---
cfg.lex | 115 ++++++++++++++++++++++++++++++++++++++++++--------------------
1 files changed, 78 insertions(+), 37 deletions(-)
diff --git a/cfg.lex b/cfg.lex
index d7a3190..0518fea 100644
--- a/cfg.lex
+++ b/cfg.lex
@@ -158,7 +158,7 @@
} include_stack[MAX_INCLUDE_DEPTH];
static int include_stack_ptr = 0;
- static int sr_push_yy_state(char *fin);
+ static int sr_push_yy_state(char *fin, int mode);
static int sr_pop_yy_state();
static struct sr_yy_fname {
@@ -177,7 +177,7 @@
/* start conditions */
%x STRING1 STRING2 STR_BETWEEN COMMENT COMMENT_LN ATTR SELECT AVP_PVAR PVAR_P
-%x PVARID INCLF
+%x PVARID INCLF IMPTF
%x LINECOMMENT DEFINE_ID DEFINE_EOL DEFINE_DATA IFDEF_ID IFDEF_EOL IFDEF_SKIP
/* config script types : #!SER or #!KAMAILIO or #!MAX_COMPAT */
@@ -251,8 +251,6 @@ CASE "case"
DEFAULT "default"
WHILE "while"
-INCLUDEFILE "include_file"
-
CFG_SELECT "cfg_select"
CFG_RESET "cfg_reset"
@@ -563,6 +561,10 @@ EAT_ABLE [\ \t\b\r]
SUBST subst
SUBSTDEF substdef
+/* include files */
+INCLUDEFILE "include_file"
+IMPORTFILE "import_file"
+
%%
@@ -650,6 +652,7 @@ SUBSTDEF substdef
<INITIAL>{WHILE} { count(); yylval.strval=yytext; return WHILE; }
<INITIAL>{INCLUDEFILE} { count(); BEGIN(INCLF); }
+<INITIAL>{IMPORTFILE} { count(); BEGIN(IMPTF); }
<INITIAL>{CFG_SELECT} { count(); yylval.strval=yytext; return CFG_SELECT; }
<INITIAL>{CFG_RESET} { count(); yylval.strval=yytext; return CFG_RESET; }
@@ -1277,7 +1280,17 @@ SUBSTDEF substdef
<INCLF>[ \t]* /* eat the whitespace */
<INCLF>[^ \t\n]+ { /* get the include file name */
- if(sr_push_yy_state(yytext)<0)
+ if(sr_push_yy_state(yytext, 0)<0)
+ {
+ LOG(L_CRIT, "error at %s line %d\n", (finame)?finame:"cfg",
line);
+ exit(-1);
+ }
+ BEGIN(INITIAL);
+}
+
+<IMPTF>[ \t]* /* eat the whitespace */
+<IMPTF>[^ \t\n]+ { /* get the import file name */
+ if(sr_push_yy_state(yytext, 1)<0)
{
LOG(L_CRIT, "error at %s line %d\n", (finame)?finame:"cfg",
line);
exit(-1);
@@ -1444,14 +1457,16 @@ int yywrap()
return 1;
}
-static int sr_push_yy_state(char *fin)
+static int sr_push_yy_state(char *fin, int mode)
{
struct sr_yy_fname *fn = NULL;
+ FILE *fp = NULL;
char *x = NULL;
char *newf = NULL;
#define MAX_INCLUDE_FNAME 128
char fbuf[MAX_INCLUDE_FNAME];
int i, j, l;
+ char *tmpfiname = 0;
if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
{
@@ -1505,54 +1520,80 @@ static int sr_push_yy_state(char *fin)
}
fbuf[j] = '\0';
- include_stack[include_stack_ptr].state = YY_CURRENT_BUFFER;
- include_stack[include_stack_ptr].line = line;
- include_stack[include_stack_ptr].column = column;
- include_stack[include_stack_ptr].startline = startline;
- include_stack[include_stack_ptr].startcolumn = startcolumn;
- include_stack[include_stack_ptr].finame = finame;
- include_stack_ptr++;
-
- line=1;
- column=1;
- startline=1;
- startcolumn=1;
-
- yyin = fopen(fbuf, "r" );
+ fp = fopen(fbuf, "r" );
- if ( ! yyin )
+ if ( ! fp )
{
- finame = (finame==0)?cfg_file:finame;
- if(finame==0 || fbuf[0]=='/')
+ tmpfiname = (finame==0)?cfg_file:finame;
+ if(tmpfiname==0 || fbuf[0]=='/')
{
- LOG(L_CRIT, "cannot open included file: %s\n", fin);
- return -1;
+ if(mode==0)
+ {
+ LOG(L_CRIT, "cannot open included file: %s\n", fin);
+ return -1;
+ } else {
+ LOG(L_DBG, "importing file ignored: %s\n", fin);
+ return 0;
+ }
}
- x = strrchr(finame, '/');
- if(x)
+ x = strrchr(tmpfiname, '/');
+ if(x==NULL)
{
- newf = (char*)pkg_malloc(x-finame+strlen(fbuf)+2);
- if(newf==0)
+ /* nothing else to try */
+ if(mode==0)
{
- LOG(L_CRIT, "no more pkg\n");
+ LOG(L_CRIT, "cannot open included file: %s\n", fin);
return -1;
+ } else {
+ LOG(L_DBG, "importing file ignored: %s\n", fin);
+ return 0;
}
- newf[0] = '\0';
- strncat(newf, finame, x-finame);
- strcat(newf, "/");
- strcat(newf, fbuf);
}
- yyin = fopen(newf, "r" );
- if ( ! yyin )
+
+ newf = (char*)pkg_malloc(x-tmpfiname+strlen(fbuf)+2);
+ if(newf==0)
{
- LOG(L_CRIT, "cannot open included file: %s (%s)\n", fbuf, newf);
+ LOG(L_CRIT, "no more pkg\n");
return -1;
}
+ newf[0] = '\0';
+ strncat(newf, tmpfiname, x-tmpfiname);
+ strcat(newf, "/");
+ strcat(newf, fbuf);
+
+ fp = fopen(newf, "r" );
+ if ( fp==NULL )
+ {
+ pkg_free(newf);
+ if(mode==0)
+ {
+ LOG(L_CRIT, "cannot open included file: %s (%s)\n", fbuf, newf);
+ return -1;
+ } else {
+ LOG(L_DBG, "importing file ignored: %s (%s)\n", fbuf, newf);
+ return 0;
+ }
+ }
LOG(L_DBG, "including file: %s (%s)\n", fbuf, newf);
} else {
newf = fbuf;
}
+ include_stack[include_stack_ptr].state = YY_CURRENT_BUFFER;
+ include_stack[include_stack_ptr].line = line;
+ include_stack[include_stack_ptr].column = column;
+ include_stack[include_stack_ptr].startline = startline;
+ include_stack[include_stack_ptr].startcolumn = startcolumn;
+ include_stack[include_stack_ptr].finame = finame;
+ include_stack_ptr++;
+
+ line=1;
+ column=1;
+ startline=1;
+ startcolumn=1;
+
+ yyin = fp;
+
/* make a copy in PKG if does not exist */
fn = sr_yy_fname_list;
while(fn!=0)