Sophie

Sophie

distrib > Mandriva > 2008.0 > x86_64 > media > main-testing-src > by-pkgid > adf83d37405e61716c565e6e16f370ea > files > 26

mysql-5.0.45-7.3mdv2008.0.src.rpm

From: timDate: November 7 2007 11:23pm
Subject: bk commit into 5.0 tree (tsmith:1.2538) BUG#20748

Below is the list of changes that have just been committed into a local
5.0 repository of tsmith. When tsmith 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@stripped, 2007-11-07 15:23:50-07:00, tsmith@stripped +6 -0
  Bug #20748: Configuration files should not be read more than once
  
  A user could not override system-wide settings in their ~/.my.cnf,
  because the DEFAULT_SYSCONFDIR was being searched last.  Also, in
  some configurations (especially when the --sysconfdir compile-time
  option is set to /etc or /etc/mysql), the system-wide my.cnf file
  was read multiple times, causing confusion and potential problems.
  
  Rearrange default directories to conform to the manual and logic.
  Move --sysconfdir=<path> (DEFAULT_SYSCONFDIR) from the last default
  directory to the middle of the list.  $HOME/.my.cnf should be last,
  so the user is able to override the system-wide settings.
  
  Change init_default_directories() to remove duplicates from the
  list.

  include/my_sys.h@stripped, 2007-11-07 15:23:49-07:00, tsmith@stripped +2 -0
    Add array_append_string_unique(), from mf_arr_appstr.c

  libmysql/Makefile.shared@stripped, 2007-11-07 15:23:49-07:00, tsmith@stripped +1 -1
    Add new mf_arr_appstr.lo object

  mysys/CMakeLists.txt@stripped, 2007-11-07 15:23:49-07:00, tsmith@stripped +1 -1
    Add new mf_arr_appstr.c source.

  mysys/Makefile.am@stripped, 2007-11-07 15:23:49-07:00, tsmith@stripped +1 -1
    Add new mf_arr_appstr.c source.

  mysys/default.c@stripped, 2007-11-07 15:23:49-07:00, tsmith@stripped +129 -63
    Change order in which defaults files are added to default_directories,
    in order to conform to the manual (and to common sense).  This fixes
    a particularly bad problem on Unix, where ~/.my.cnf was read before
    /usr/local/etc/my.cnf.
    
    Also, don't add duplicate entries; move the existing entry to the
    end of the list instead.
    
    
    Here is a comparison of the order of defaults files, BEFORE and AFTER
    this patch.
    
    On Windows:
    
    BEFORE:  C:\, GetWindowsDirectory(), GetSystemWindowsDirectory(),
             $MYSQL_HOME, defaults-extra-file, INSTALLDIR
    
    AFTER:  GetSystemWindowsDirectory(), GetWindowsDirectory(), C:\,
            INSTALLDIR, $MYSQL_HOME, defaults-extra-file
    
    GetSystemWindowsDirectory() is moved before GetWindowsDirectory() because
    the former is shared by all Terminal Services users, while the latter is
    private for each user.
    
    
    On Netware (no change):
    
    BEFORE:  sys:/etc/, $MYSQL_HOME, defaults-extra-file
    
    AFTER:  sys:/etc, $MYSQL_HOME, defaults-extra-file
    
    
    On OS/2:
    
    BEFORE:  $ETC, /etc, $MYSQL_HOME, defaults-extra-file
    
    AFTER:  /etc, $ETC, $MYSQL_HOME, defaults-extra-file
    
    
    On everything else (general Unix):
    
    BEFORE:  /etc, $MYSQL_HOME, defaults-extra-file, ~/, --sysconfdir
    
    AFTER:  /etc/, --sysconfdir, $MYSQL_HOME, defaults-extra-file, ~/
    
    The BEFORE code added --sysconfdir on all systems, but only the
    Unix build system actually defined a value for it.

  mysys/mf_arr_appstr.c@stripped, 2007-11-07 15:23:49-07:00, tsmith@stripped +61 -0
    BitKeeper file /home/tsmith/m/bk/build/50-b20748/mysys/mf_arr_appstr.c

  mysys/mf_arr_appstr.c@stripped, 2007-11-07 15:23:49-07:00, tsmith@stripped +0 -0

diff -Nrup a/include/my_sys.h b/include/my_sys.h
--- a/include/my_sys.h	2007-05-17 01:48:09 -06:00
+++ b/include/my_sys.h	2007-11-07 15:23:49 -07:00
@@ -691,6 +691,8 @@ extern WF_PACK *wf_comp(my_string str);
 extern int wf_test(struct wild_file_pack *wf_pack,const char *name);
 extern void wf_end(struct wild_file_pack *buffer);
 extern size_s strip_sp(my_string str);
+extern my_bool array_append_string_unique(const char *str,
+                                          const char **array, size_t size);
 extern void get_date(my_string to,int timeflag,time_t use_time);
 extern void soundex(CHARSET_INFO *, my_string out_pntr, my_string in_pntr,pbool remove_garbage);
 extern int init_record_cache(RECORD_CACHE *info,uint cachesize,File file,
diff -Nrup a/libmysql/Makefile.shared b/libmysql/Makefile.shared
--- a/libmysql/Makefile.shared	2006-11-27 13:12:37 -07:00
+++ b/libmysql/Makefile.shared	2007-11-07 15:23:49 -07:00
@@ -59,7 +59,7 @@ mysysobjects1 =		my_init.lo my_static.lo
 			mf_pack.lo my_messnc.lo mf_dirname.lo mf_fn_ext.lo\
 			mf_wcomp.lo typelib.lo safemalloc.lo my_alloc.lo \
 			mf_format.lo mf_path.lo mf_unixpath.lo my_fopen.lo \
-			my_symlink.lo my_fstream.lo \
+			my_symlink.lo my_fstream.lo mf_arr_appstr.lo \
 			mf_loadpath.lo my_pthread.lo my_thr_init.lo \
 			thr_mutex.lo mulalloc.lo string.lo \
                         default.lo default_modify.lo \
diff -Nrup a/mysys/CMakeLists.txt b/mysys/CMakeLists.txt
--- a/mysys/CMakeLists.txt	2007-08-03 13:43:43 -06:00
+++ b/mysys/CMakeLists.txt	2007-11-07 15:23:49 -07:00
@@ -26,7 +26,7 @@ ADD_LIBRARY(mysys array.c charset-def.c 
 				errors.c hash.c list.c md5.c mf_brkhant.c mf_cache.c mf_dirname.c mf_fn_ext.c
 				mf_format.c mf_getdate.c mf_iocache.c mf_iocache2.c mf_keycache.c 
 				mf_keycaches.c mf_loadpath.c mf_pack.c mf_path.c mf_qsort.c mf_qsort2.c
-				mf_radix.c mf_same.c mf_sort.c mf_soundex.c mf_strip.c mf_tempdir.c
+				mf_radix.c mf_same.c mf_sort.c mf_soundex.c mf_strip.c mf_arr_appstr.c mf_tempdir.c
 				mf_tempfile.c mf_unixpath.c mf_wcomp.c mf_wfile.c mulalloc.c my_access.c
 				my_aes.c my_alarm.c my_alloc.c my_append.c my_bit.c my_bitmap.c my_chsize.c
 				my_clock.c my_compress.c my_conio.c my_copy.c my_crc32.c my_create.c my_delete.c
diff -Nrup a/mysys/Makefile.am b/mysys/Makefile.am
--- a/mysys/Makefile.am	2007-03-12 07:52:30 -06:00
+++ b/mysys/Makefile.am	2007-11-07 15:23:49 -07:00
@@ -38,7 +38,7 @@ libmysys_a_SOURCES =    my_init.c my_get
 			my_error.c errors.c my_div.c my_messnc.c \
 			mf_format.c mf_same.c mf_dirname.c mf_fn_ext.c \
 			my_symlink.c my_symlink2.c \
-			mf_pack.c mf_unixpath.c mf_strip.c \
+			mf_pack.c mf_unixpath.c mf_strip.c mf_arr_appstr.c \
 			mf_wcomp.c mf_wfile.c my_gethwaddr.c \
 			mf_qsort.c mf_qsort2.c mf_sort.c \
 			ptr_cmp.c mf_radix.c queues.c \
diff -Nrup a/mysys/default.c b/mysys/default.c
--- a/mysys/default.c	2007-04-27 17:23:15 -06:00
+++ b/mysys/default.c	2007-11-07 15:23:49 -07:00
@@ -47,7 +47,7 @@ char *my_defaults_extra_file=0;
 
 /* Which directories are searched for options (and in which order) */
 
-#define MAX_DEFAULT_DIRS 7
+#define MAX_DEFAULT_DIRS 6
 const char *default_directories[MAX_DEFAULT_DIRS + 1];
 
 #ifdef __WIN__
@@ -83,7 +83,22 @@ static int search_default_file_with_ext(
                                         void *func_ctx,
 					const char *dir, const char *ext,
 					const char *config_file, int recursion_level);
-static void init_default_directories();
+
+
+
+/**
+  Create the list of default directories.
+
+  @details
+  On all systems, if a directory is already in the list, it will be moved
+  to the end of the list.  This avoids reading defaults files multiple times,
+  while ensuring the correct precedence.
+
+  @return void
+*/
+
+static void (*init_default_directories)();
+
 
 static char *remove_end_comment(char *ptr);
 
@@ -913,6 +928,25 @@ void print_defaults(const char *conf_fil
 #include <help_end.h>
 
 
+#define ADD_DIRECTORY(DIR) \
+  do { \
+    my_bool rc= \
+      array_append_string_unique((DIR), default_directories, \
+                                 array_elements(default_directories)); \
+    DBUG_ASSERT(rc == FALSE);                   /* Success */ \
+  } while (0)
+
+
+#define ADD_COMMON_DIRECTORIES() \
+  do { \
+    char *env; \
+    if ((env= getenv(STRINGIFY_ARG(DEFAULT_HOME_ENV)))) \
+      ADD_DIRECTORY(env); \
+    /* Placeholder for --defaults-extra-file=<path> */ \
+    ADD_DIRECTORY(""); \
+  } while (0)
+
+
 #ifdef __WIN__
 /*
   This wrapper for GetSystemWindowsDirectory() will dynamically bind to the
@@ -947,73 +981,33 @@ static uint my_get_system_windows_direct
   }
   return count;
 }
-#endif
 
 
-/*
-  Create the list of default directories.
+/**
+  Initialize default directories for Microsoft Windows
 
-  On Microsoft Windows, this is:
-    1. C:/
+  @details
+    1. GetSystemWindowsDirectory()
     2. GetWindowsDirectory()
-    3. GetSystemWindowsDirectory()
-    4. getenv(DEFAULT_HOME_ENV)
-    5. Directory above where the executable is located
-    6. ""
-    7. --sysconfdir=<path>
-
-  On Novell NetWare, this is:
-    1. sys:/etc/
-    2. getenv(DEFAULT_HOME_ENV)
-    3. ""
-    4. --sysconfdir=<path>
-
-  On OS/2, this is:
-    1. getenv(ETC)
-    2. /etc/
-    3. getenv(DEFAULT_HOME_ENV)
-    4. ""
-    5. "~/"
-    6. --sysconfdir=<path>
-
-  Everywhere else, this is:
-    1. /etc/
-    2. getenv(DEFAULT_HOME_ENV)
-    3. ""
-    4. "~/"
-    5. --sysconfdir=<path>
-
- */
+    3. C:/
+    4. Directory above where the executable is located
+    5. getenv(DEFAULT_HOME_ENV)
+    6. --defaults-extra-file=<path> (run-time option)
+*/
 
-static void init_default_directories()
+static void init_default_directories_win()
 {
-  const char *env, **ptr= default_directories;
+  bzero(default_directories, sizeof(default_directories));
 
-#ifdef __WIN__
-  *ptr++= "C:/";
+  if (my_get_system_windows_directory(shared_system_dir,
+                                      sizeof(shared_system_dir)))
+    ADD_DIRECTORY(&shared_system_dir);
 
   if (GetWindowsDirectory(system_dir,sizeof(system_dir)))
-    *ptr++= (char*)&system_dir;
-  if (my_get_system_windows_directory(shared_system_dir,
-                                      sizeof(shared_system_dir)) &&
-      strcmp(system_dir, shared_system_dir))
-    *ptr++= (char *)&shared_system_dir;
+    ADD_DIRECTORY(&system_dir);
+
+  ADD_DIRECTORY("C:/");
 
-#elif defined(__NETWARE__)
-  *ptr++= "sys:/etc/";
-#else
-#if defined(__EMX__) || defined(OS2)
-  if ((env= getenv("ETC")))
-    *ptr++= env;
-#endif
-  *ptr++= "/etc/";
-#endif
-  if ((env= getenv(STRINGIFY_ARG(DEFAULT_HOME_ENV))))
-    *ptr++= env;
-  *ptr++= "";			/* Place for defaults_extra_file */
-#if !defined(__WIN__) && !defined(__NETWARE__)
-  *ptr++= "~/";;
-#elif defined(__WIN__)
   if (GetModuleFileName(NULL, config_dir, sizeof(config_dir)))
   {
     char *last= NULL, *end= strend(config_dir);
@@ -1043,12 +1037,84 @@ static void init_default_directories()
         last= end;
       }
     }
-    *ptr++= (char *)&config_dir;
+    ADD_DIRECTORY(&config_dir);
   }
-#endif
+
+  ADD_COMMON_DIRECTORIES();
+}
+
+static void (*init_default_directories)()= init_default_directories_win;
+
+#elif defined(__NETWARE__)
+
+/**
+  Initialize default directories for Novell Netware
+
+  @details
+    1. sys:/etc/
+    2. getenv(DEFAULT_HOME_ENV)
+    3. --defaults-extra-file=<path> (run-time option)
+*/
+
+static void init_default_directories_netware()
+{
+  bzero(default_directories, sizeof(default_directories));
+  ADD_DIRECTORY("sys:/etc/");
+  ADD_COMMON_DIRECTORIES();
+}
+
+static void (*init_default_directories)()= init_default_directories_netware;
+
+#elif defined(__EMX__) || defined(OS2)
+
+/**
+  Initialize default directories for OS/2
+
+  @details
+    1. /etc/
+    2. getenv(ETC)
+    3. getenv(DEFAULT_HOME_ENV)
+    4. --defaults-extra-file=<path> (run-time option)
+*/
+
+static void init_default_directories_os2()
+{
+  const char *env;
+
+  bzero(default_directories, sizeof(default_directories));
+  ADD_DIRECTORY("/etc/");
+  if ((env= getenv("ETC")))
+    ADD_DIRECTORY(env);
+  ADD_COMMON_DIRECTORIES();
+}
+
+static void (*init_default_directories)()= init_default_directories_os2;
+
+#else
+
+/**
+  Initialize default directories for Unix
+
+  @details
+    1. /etc/
+    2. --sysconfdir=<path> (compile-time option)
+    3. getenv(DEFAULT_HOME_ENV)
+    4. --defaults-extra-file=<path> (run-time option)
+    5. "~/"
+*/
+
+static void init_default_directories_unix()
+{
+  bzero(default_directories, sizeof(default_directories));
+  ADD_DIRECTORY("/etc/");
 #ifdef DEFAULT_SYSCONFDIR
   if (DEFAULT_SYSCONFDIR != "")
-    *ptr++= DEFAULT_SYSCONFDIR;
+    ADD_DIRECTORY(DEFAULT_SYSCONFDIR);
 #endif
-  *ptr= 0;			/* end marker */
+  ADD_COMMON_DIRECTORIES();
+  ADD_DIRECTORY("~/");
 }
+
+static void (*init_default_directories)()= init_default_directories_unix;
+
+#endif
diff -Nrup a/mysys/mf_arr_appstr.c b/mysys/mf_arr_appstr.c
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/mysys/mf_arr_appstr.c	2007-11-07 15:23:49 -07:00
@@ -0,0 +1,61 @@
+/* Copyright (C) 2007 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; version 2 of the License.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+#include "mysys_priv.h"
+#include <m_string.h>                           /* strcmp() */
+
+
+/**
+  Append str to array, or move to the end if it already exists
+
+  @param str    String to be appended
+  @param array  The array, terminated by a NULL element, all unused elements
+                pre-initialized to NULL
+  @param size   Size of the array; array must be terminated by a NULL
+                pointer, so can hold size - 1 elements
+
+  @retval FALSE  Success
+  @retval TRUE   Failure, array is full
+*/
+
+my_bool array_append_string_unique(const char *str,
+                                   const char **array, size_t size)
+{
+  const char **p;
+  /* end points at the terminating NULL element */
+  const char **end= array + size - 1;
+  DBUG_ASSERT(*end == NULL);
+
+  for (p= array; *p; ++p)
+  {
+    if (strcmp(*p, str) == 0)
+      break;
+  }
+  if (p >= end)
+    return TRUE;                               /* Array is full */
+
+  DBUG_ASSERT(*p == NULL || strcmp(*p, str) == 0);
+
+  while (*(p + 1))
+  {
+    *p= *(p + 1);
+    ++p;
+  }
+
+  DBUG_ASSERT(p < end);
+  *p= str;
+
+  return FALSE;                                 /* Success */
+}