diff options
author | petr/cps@outpost.site <> | 2006-11-23 18:26:56 +0300 |
---|---|---|
committer | petr/cps@outpost.site <> | 2006-11-23 18:26:56 +0300 |
commit | 3c8ed475cb748f58c63b4ef12a3eb8266c80debb (patch) | |
tree | fe6c96f8b709eab25fb56b316927004e72ceabcc /server-tools | |
parent | db522c30f350eea83741f18728a3834044212a35 (diff) | |
parent | aad182fb26ba33a16e46755daf324b7aa148e9a9 (diff) | |
download | mariadb-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.cc | 65 |
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); |