summaryrefslogtreecommitdiff
path: root/mysys
diff options
context:
space:
mode:
authorunknown <petr@mysql.com>2005-03-29 11:58:34 +0400
committerunknown <petr@mysql.com>2005-03-29 11:58:34 +0400
commit50c6e343e0b505c9d6fc44365f52518dc84cf03d (patch)
tree3089af03a40edc8b58e0bcca5310447bfec8261e /mysys
parent5fb5282784c2d3fabb504367c1114282a65bbee8 (diff)
parent2a33129a492781b5aaa4d2e37321af521fcd7b86 (diff)
downloadmariadb-git-50c6e343e0b505c9d6fc44365f52518dc84cf03d.tar.gz
Merge pchardin@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/home/cps/mysql/trees/mysql-4.1
Diffstat (limited to 'mysys')
-rw-r--r--mysys/default.c135
1 files changed, 121 insertions, 14 deletions
diff --git a/mysys/default.c b/mysys/default.c
index 5f554ac36f6..841a5f6004f 100644
--- a/mysys/default.c
+++ b/mysys/default.c
@@ -73,7 +73,7 @@ static int search_default_file(DYNAMIC_ARRAY *args,MEM_ROOT *alloc,
static int search_default_file_with_ext(DYNAMIC_ARRAY *args, MEM_ROOT *alloc,
const char *dir, const char *ext,
const char *config_file,
- TYPELIB *group);
+ TYPELIB *group, int recursion_level);
static char *remove_end_comment(char *ptr);
@@ -193,8 +193,8 @@ int load_defaults(const char *conf_file, const char **groups,
if (forced_default_file)
{
if ((error= search_default_file_with_ext(&args, &alloc, "", "",
- forced_default_file,
- &group)) < 0)
+ forced_default_file,
+ &group, 0)) < 0)
goto err;
if (error > 0)
{
@@ -311,7 +311,7 @@ static int search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc,
{
int error;
if ((error= search_default_file_with_ext(args, alloc, dir, *ext,
- config_file, group)) < 0)
+ config_file, group, 0)) < 0)
return error;
}
return 0;
@@ -320,15 +320,17 @@ static int search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc,
/*
Open a configuration file (if exists) and read given options from it
-
+
SYNOPSIS
search_default_file_with_ext()
args Store pointer to found options here
alloc Allocate strings in this object
dir directory to read
- config_file Name of configuration file
ext Extension for configuration file
+ config_file Name of configuration file
group groups to read
+ recursion_level the level of recursion, got while processing
+ "!include" or "!includedir"
RETURN
0 Success
@@ -340,12 +342,18 @@ static int search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc,
static int search_default_file_with_ext(DYNAMIC_ARRAY *args, MEM_ROOT *alloc,
const char *dir, const char *ext,
const char *config_file,
- TYPELIB *group)
+ TYPELIB *group, int recursion_level)
{
- char name[FN_REFLEN+10],buff[4096],*ptr,*end,*value,*tmp;
+ char name[FN_REFLEN + 10], buff[4096], *ptr, *end, *value, *tmp, **tmp_ext;
+ static const char includedir_keyword[]= "includedir";
+ static const char include_keyword[]= "include";
+ const int max_recursion_level= 10;
FILE *fp;
- uint line=0;
- my_bool read_values=0,found_group=0;
+ uint line= 0;
+ my_bool read_values= 0, found_group= 0;
+ uint i;
+ MY_DIR *search_dir;
+ FILEINFO *search_file;
if ((dir ? strlen(dir) : 0 )+strlen(config_file) >= FN_REFLEN-3)
return 0; /* Ignore wrong paths */
@@ -374,22 +382,121 @@ static int search_default_file_with_ext(DYNAMIC_ARRAY *args, MEM_ROOT *alloc,
if ((stat_info.st_mode & S_IWOTH) &&
(stat_info.st_mode & S_IFMT) == S_IFREG)
{
- fprintf(stderr, "warning: World-writeable config file %s is ignored\n",
+ fprintf(stderr, "warning: World-writable config file %s is ignored\n",
name);
return 0;
}
}
#endif
- if (!(fp = my_fopen(fn_format(name,name,"","",4),O_RDONLY,MYF(0))))
+ if (!(fp= my_fopen(fn_format(name, name, "", "", 4), O_RDONLY, MYF(0))))
return 0; /* Ignore wrong files */
- while (fgets(buff,sizeof(buff)-1,fp))
+ while (fgets(buff, sizeof(buff) - 1, fp))
{
line++;
/* Ignore comment and empty lines */
- for (ptr=buff ; my_isspace(&my_charset_latin1,*ptr) ; ptr++ ) ;
+ for (ptr= buff; my_isspace(&my_charset_latin1, *ptr); ptr++)
+ {}
+
if (*ptr == '#' || *ptr == ';' || !*ptr)
continue;
+
+ /* Configuration File Directives */
+ if ((*ptr == '!') && (recursion_level < max_recursion_level))
+ {
+ /* skip over `!' and following whitespace */
+ for (++ptr; my_isspace(&my_charset_latin1, ptr[0]); ptr++)
+ {}
+
+ if ((!strncmp(ptr, includedir_keyword, sizeof(includedir_keyword) - 1))
+ && my_isspace(&my_charset_latin1, ptr[sizeof(includedir_keyword) - 1]))
+ {
+ /* skip over "includedir" and following whitespace */
+ for (ptr+= sizeof(includedir_keyword) - 1;
+ my_isspace(&my_charset_latin1, ptr[0]); ptr++)
+ {}
+
+ /* trim trailing whitespace from directory name */
+ end= ptr + strlen(ptr) - 1;
+ /*
+ This would work fine even if no whitespaces are met
+ since fgets() stores the newline character in the buffer
+ */
+ for (; my_isspace(&my_charset_latin1, *(end - 1)); end--)
+ {}
+ end[0]= 0;
+
+ /* print error msg if there is nothing after !inludedir directive */
+ if (end == ptr)
+ {
+ fprintf(stderr,
+ "error: Wrong !includedir directive in config "
+ "file: %s at line %d\n",
+ name,line);
+ goto err;
+ }
+
+ if (!(search_dir= my_dir(ptr, MYF(MY_WME))))
+ goto err;
+
+ for (i= 0; i < (uint) search_dir->number_off_files; i++)
+ {
+ search_file= search_dir->dir_entry + i;
+ ext= fn_ext(search_file->name);
+
+ /* check extenstion */
+ for (tmp_ext= (char**) f_extensions; *tmp_ext; *tmp_ext++)
+ {
+ if (!strcmp(ext, *tmp_ext))
+ break;
+ }
+
+ if (*tmp_ext)
+ {
+ if (!(tmp= alloc_root(alloc, 2 + strlen(search_file->name)
+ + strlen(ptr))))
+ goto err;
+
+ fn_format(tmp, search_file->name, ptr, "",
+ MY_UNPACK_FILENAME | MY_SAFE_PATH);
+
+ search_default_file_with_ext(args, alloc, "", "", tmp, group,
+ recursion_level + 1);
+ }
+ }
+
+ my_dirend(search_dir);
+ }
+ else if ((!strncmp(ptr, include_keyword, sizeof(include_keyword) - 1))
+ && my_isspace(&my_charset_latin1, ptr[sizeof(include_keyword) - 1]))
+ {
+ /* skip over `include' and following whitespace */
+ for (ptr+= sizeof(include_keyword) - 1;
+ my_isspace(&my_charset_latin1, ptr[0]); ptr++)
+ {}
+
+ /* trim trailing whitespace from filename */
+ end= ptr + strlen(ptr) - 1;
+ for (; my_isspace(&my_charset_latin1, *(end - 1)) ; end--)
+ {}
+ end[0]= 0;
+
+ if (end == ptr)
+ {
+ fprintf(stderr,
+ "error: Wrong !include directive in config "
+ "file: %s at line %d\n",
+ name,line);
+ goto err;
+ }
+
+ search_default_file_with_ext(args, alloc, "", "", ptr, group,
+ recursion_level + 1);
+ }
+
+ continue;
+ }
+
if (*ptr == '[') /* Group name */
{
found_group=1;