summaryrefslogtreecommitdiff
path: root/server-tools
diff options
context:
space:
mode:
authorpetr/cps@outpost.site <>2006-11-23 18:26:56 +0300
committerpetr/cps@outpost.site <>2006-11-23 18:26:56 +0300
commit3c8ed475cb748f58c63b4ef12a3eb8266c80debb (patch)
treefe6c96f8b709eab25fb56b316927004e72ceabcc /server-tools
parentdb522c30f350eea83741f18728a3834044212a35 (diff)
parentaad182fb26ba33a16e46755daf324b7aa148e9a9 (diff)
downloadmariadb-git-3c8ed475cb748f58c63b4ef12a3eb8266c80debb.tar.gz
Merge pchardin@bk-internal.mysql.com:/home/bk/mysql-5.1-runtime
into outpost.site:/home/cps/mysql/trees/mysql-5.1-runtime
Diffstat (limited to 'server-tools')
-rw-r--r--server-tools/instance-manager/instance_options.cc65
1 files changed, 57 insertions, 8 deletions
diff --git a/server-tools/instance-manager/instance_options.cc b/server-tools/instance-manager/instance_options.cc
index 3400e1e10f5..58e7b630fe9 100644
--- a/server-tools/instance-manager/instance_options.cc
+++ b/server-tools/instance-manager/instance_options.cc
@@ -60,6 +60,29 @@ static inline bool create_mysqld_command(Buffer *buf,
return TRUE;
}
+static inline bool is_path_separator(char ch)
+{
+#if defined(__WIN__) || defined(__NETWARE__)
+ /* On windows and netware more delimiters are possible */
+ return ch == FN_LIBCHAR || ch == FN_DEVCHAR || ch == '/';
+#else
+ return ch == FN_LIBCHAR; /* Unixes */
+#endif
+}
+
+
+static char *find_last_path_separator(char *path, uint length)
+{
+ while (length)
+ {
+ if (is_path_separator(path[length]))
+ return path + length;
+ length--;
+ }
+ return NULL; /* No path separator found */
+}
+
+
bool Instance_options::is_option_im_specific(const char *option_name)
{
@@ -436,25 +459,51 @@ bool Instance_options::complete_initialization()
int arg_idx;
const char *tmp;
char *end;
+ char bin_name_firstchar;
if (!mysqld_path.str)
{
- /* Need one extra byte, as convert_dirname() adds a slash at the end. */
- mysqld_path.str= alloc_root(&alloc,
- strlen(Options::Main::default_mysqld_path) + 2);
+ /*
+ Need to copy the path to allocated memory, as convert_dirname() might
+ need to change it
+ */
+ mysqld_path.str=
+ alloc_root(&alloc, strlen(Options::Main::default_mysqld_path) + 1);
- if (! mysqld_path.str)
+ if (!mysqld_path.str)
return TRUE;
strcpy(mysqld_path.str, Options::Main::default_mysqld_path);
}
- // it's safe to cast this to char* since this is a buffer we are allocating
- end= convert_dirname((char*)mysqld_path.str, mysqld_path.str, NullS);
- end[-1]= 0;
-
mysqld_path.length= strlen(mysqld_path.str);
+ /*
+ If we found path with no slashes (end == NULL), we should not call
+ convert_dirname() at all. As we have got relative path to the binary.
+ That is, user supposes that mysqld resides in the same dir as
+ mysqlmanager.
+ */
+ if ((end= find_last_path_separator(mysqld_path.str, mysqld_path.length)))
+ {
+ bin_name_firstchar= end[1];
+
+ /*
+ Below we will conver the path to mysqld in the case, it was given
+ in a format of another OS (e.g. uses '/' instead of '\' etc).
+ Here we strip the path to get rid of the binary name ("mysqld"),
+ we do it by removing first letter of the binary name (e.g. 'm'
+ in "mysqld"). Later we put it back.
+ */
+ end[1]= 0;
+
+ /* convert dirname to the format of current OS */
+ convert_dirname((char*)mysqld_path.str, mysqld_path.str, NullS);
+
+ /* put back the first character of the binary name*/
+ end[1]= bin_name_firstchar;
+ }
+
if (mysqld_port)
mysqld_port_val= atoi(mysqld_port);