Below is the list of changes that have just been committed into a local
4.1 repository of cps. When cps does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet
1.2079 05/03/25 04:13:30 petr@stripped +1 -0
Post-review fixes for "!include" patch originating from Yahoo! (the whole patch is
recommitted)
mysys/default.c
1.48 05/03/25 04:13:27 petr@stripped +121 -14
Post-review fixes for "!include" patch originating from Yahoo!
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: petr
# Host: owlet.
# Root: /home/cps/mysql/trees/mysql-4.1
--- 1.47/mysys/default.c 2005-02-25 16:28:37 +03:00
+++ 1.48/mysys/default.c 2005-03-25 04:13:27 +03:00
@@ -73,7 +73,7 @@
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 @@
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 @@
{
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 @@
/*
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_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 @@
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;
| Thread |
|---|
| • bk commit into 4.1 tree (petr:1.2079) | Petr Chardin | 25 Mar |