diff options
author | unknown <petr@mysql.com> | 2005-03-29 11:58:34 +0400 |
---|---|---|
committer | unknown <petr@mysql.com> | 2005-03-29 11:58:34 +0400 |
commit | 50c6e343e0b505c9d6fc44365f52518dc84cf03d (patch) | |
tree | 3089af03a40edc8b58e0bcca5310447bfec8261e /mysys | |
parent | 5fb5282784c2d3fabb504367c1114282a65bbee8 (diff) | |
parent | 2a33129a492781b5aaa4d2e37321af521fcd7b86 (diff) | |
download | mariadb-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.c | 135 |
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; |