diff -uNr nagios3-3.2.0.orig/cgi/cgiutils.c nagios3-3.2.0/cgi/cgiutils.c --- nagios3-3.2.0.orig/cgi/cgiutils.c 2009-07-31 10:54:20.000000000 -0600 +++ nagios3-3.2.0/cgi/cgiutils.c 2010-04-18 01:20:45.000000000 -0600 @@ -1949,7 +1949,9 @@ /* include user-defined SSI footers or headers */ void include_ssi_files(char *cgi_name, int type){ char common_ssi_file[MAX_INPUT_BUFFER]; + char common_ssi_dir[MAX_INPUT_BUFFER]; char cgi_ssi_file[MAX_INPUT_BUFFER]; + char cgi_ssi_dir[MAX_INPUT_BUFFER]; char raw_cgi_name[MAX_INPUT_BUFFER]; char *stripped_cgi_name; int x; @@ -1957,6 +1959,9 @@ /* common header or footer */ snprintf(common_ssi_file,sizeof(common_ssi_file)-1,"%scommon-%s.ssi",physical_ssi_path,(type==SSI_HEADER)?"header":"footer"); common_ssi_file[sizeof(common_ssi_file)-1]='\x0'; + strcpy(common_ssi_dir, common_ssi_file); + if(strlen(common_ssi_dir) < sizeof(common_ssi_dir)-2) + strcat(common_ssi_dir, ".d"); /* CGI-specific header or footer */ strncpy(raw_cgi_name,cgi_name,sizeof(raw_cgi_name)-1); @@ -1966,14 +1971,21 @@ cgi_ssi_file[sizeof(cgi_ssi_file)-1]='\x0'; for(x=0;x\n"); include_ssi_file(common_ssi_file); + include_ssi_dir(common_ssi_dir); include_ssi_file(cgi_ssi_file); + include_ssi_dir(cgi_ssi_dir); } else{ + include_ssi_dir(cgi_ssi_dir); include_ssi_file(cgi_ssi_file); + include_ssi_dir(common_ssi_dir); include_ssi_file(common_ssi_file); printf("\n\n"); } @@ -2045,6 +2057,64 @@ } +/* include user-defined SSI footer or header directory */ +void include_ssi_dir(char *dirname){ + char file[MAX_FILENAME_LENGTH]; + DIR *dirp=NULL; + struct dirent *dirfile=NULL; + struct stat stat_buf; + + /* open the directory for reading */ + dirp=opendir(dirname); + if(dirp==NULL) + { + if (errno != ENOENT) + printf("
An opendir call returned %d while attempting to open directory %s.
", errno, dirname); + return; + } + + /* process all files in the directory... */ + while((dirfile=readdir(dirp))!=NULL){ + + /* skip hidden files and directories, and current and parent dir */ + if(dirfile->d_name[0]=='.') + continue; + + /* create /path/to/file */ + snprintf(file,sizeof(file),"%s/%s",dirname,dirfile->d_name); + file[sizeof(file)-1]='\x0'; + + /* process this if it's a non-hidden file... */ + if(stat(file,&stat_buf)==-1) + { + printf("
A stat call returned %d while looking for the file %s.
", errno, file); + continue; + } + + switch(stat_buf.st_mode & S_IFMT){ + + case S_IFREG: + /* process the file */ + include_ssi_file(file); + break; + + case S_IFDIR: + /* recurse into subdirectories... */ + include_ssi_dir(file); + break; + + default: + /* everything else we ignore */ + break; + } + } + + closedir(dirp); + return; + } + + + /* displays an error if CGI config file could not be read */ void cgi_config_file_error(char *config_file){ diff -uNr nagios3-3.2.0.orig/include/cgiutils.h.in nagios3-3.2.0/include/cgiutils.h.in --- nagios3-3.2.0.orig/include/cgiutils.h.in 2008-11-30 10:22:59.000000000 -0700 +++ nagios3-3.2.0/include/cgiutils.h.in 2010-04-18 01:20:25.000000000 -0600 @@ -505,6 +505,7 @@ void include_ssi_files(char *,int); /* include user-defined SSI footers/headers */ void include_ssi_file(char *); /* include user-defined SSI footer/header */ +void include_ssi_dir(char *); /* include user-defined SSI footer/headers */ void cgi_config_file_error(char *); void main_config_file_error(char *);