]> git.ipfire.org Git - thirdparty/sarg.git/blobdiff - getconf.c
Include sub configuration files
[thirdparty/sarg.git] / getconf.c
index 188b4663725ca87b121e8e8c0cf2baf725a7c18a..99a8e1c75140e043a822bf9ff90b807ef82c3cfb 100644 (file)
--- a/getconf.c
+++ b/getconf.c
 
 #define SET_LIST(list) list,sizeof(list)/sizeof(list[0])
 
+//! The configuration file from which the graph option was loaded
+char GraphConfigFile[MAXLEN]="";
+
+//! How many include directives were followed.
+static int IncludeLevel=0;
+
 extern numlist hours, weekdays;
 extern FileListObject AccessLog;
 extern int PerUserLimitsNumber;
@@ -578,7 +584,7 @@ static void ccharset(char *CharSet)
        return;
 }
 
-static void parmtest(char *buf)
+static void parmtest(char *buf,const char *File)
 {
        char wbuf[2048];
        struct getwordstruct gwarea;
@@ -837,8 +843,6 @@ static void parmtest(char *buf)
        if (getparam_bool("user_authentication",buf,&UserAuthentication)>0) return;
 
        if (getparam_string("AuthUserTemplateFile",buf,wbuf,sizeof(wbuf))>0) {
-               char dir[MAXLEN];
-
                if (is_absolute(wbuf)) {
                        if (strlen(wbuf)>=sizeof(AuthUserTemplateFile)) {
                                debuga(__FILE__,__LINE__,_("Template file name is too long in parameter \"AuthUserTemplateFile\"\n"));
@@ -846,7 +850,9 @@ static void parmtest(char *buf)
                        }
                        safe_strcpy(AuthUserTemplateFile,wbuf,sizeof(AuthUserTemplateFile));
                } else {
-                       safe_strcpy(dir,ConfigFile,sizeof(dir));
+                       char dir[MAXLEN];
+
+                       safe_strcpy(dir,File,sizeof(dir));
                        if (snprintf(AuthUserTemplateFile,sizeof(AuthUserTemplateFile),"%s/%s",dirname(dir),wbuf)>=sizeof(AuthUserTemplateFile)) {
                                debuga(__FILE__,__LINE__,_("Template file name is too long in parameter \"AuthUserTemplateFile\"\n"));
                                exit(EXIT_FAILURE);
@@ -867,8 +873,9 @@ static void parmtest(char *buf)
 #ifndef HAVE_GD
                if (Graphs)
                        debugaz(__FILE__,__LINE__,_("No graphs available as sarg was not compiled with libgd. Set \"graphs\" to \"no\" in %s to disable this warning\n"),
-                               ConfigFile);
+                               File);
 #endif
+               safe_strcpy(GraphConfigFile,File,sizeof(GraphConfigFile));
                return;
        }
 
@@ -973,32 +980,48 @@ static void parmtest(char *buf)
        printf(_("SARG: Unknown option %s\n"),buf);
 }
 
-void getconf(void)
+void getconf(const char *File)
 {
        FILE *fp_in;
        char buf[MAXLEN];
+       char IncludeFile[MAXLEN];
+
+       IncludeLevel++;
+       if (debug) {
+               if (IncludeLevel<=1)
+                       debuga(__FILE__,__LINE__,_("Loading configuration file \"%s\"\n"),File);
+               else
+                       debuga(__FILE__,__LINE__,_("Including configuration file \"%s\"\n"),File);
+       }
 
-       if(debug)
-               debuga(__FILE__,__LINE__,_("Loading configuration from \"%s\"\n"),ConfigFile);
+       // stop if include files are producing a loop
+       if (IncludeLevel>5) {
+               debuga(__FILE__,__LINE__,_("Too many nested configuration files included in \"%s\""),ConfigFile);
+               exit(EXIT_FAILURE);
+       }
 
-       if ((fp_in = fopen(ConfigFile, "r")) == NULL) {
-               debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),ConfigFile,strerror(errno));
+       if ((fp_in = fopen(File, "r")) == NULL) {
+               debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),File,strerror(errno));
                exit(EXIT_FAILURE);
        }
 
        while (fgets(buf, sizeof(buf), fp_in) != NULL) {
                fixendofline(buf);
 
+               if (getparam_string("include",buf,IncludeFile,sizeof(IncludeFile))>0) {
+                       getconf(IncludeFile);
+                       continue;
+               }
+
                if (debugz>=LogLevel_Data)
                        printf("SYSCONFDIR %s\n",buf);
 
-               parmtest(buf);
-
+               parmtest(buf,File);
        }
 
        if (fclose(fp_in)==EOF) {
-               debuga(__FILE__,__LINE__,_("Read error in \"%s\": %s\n"),ConfigFile,strerror(errno));
+               debuga(__FILE__,__LINE__,_("Read error in \"%s\": %s\n"),File,strerror(errno));
                exit(EXIT_FAILURE);
        }
-       return;
+       IncludeLevel--;
 }