Bug#19362 im_daemon_lifecycle fails when built from source distribution

- Add function "mysqld_real_path" which is needed if the mysqld_path is a symlink or a script(like libtool) that executes the real mysqld.
- Add new variable mysqld_real_path
- Use mysqld_real_path from fill_instance_version
parent 2c3a3bd8
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "parse_output.h" #include "parse_output.h"
#include "buffer.h" #include "buffer.h"
#include "log.h"
#include <my_sys.h> #include <my_sys.h>
#include <signal.h> #include <signal.h>
...@@ -132,7 +133,7 @@ int Instance_options::fill_instance_version() ...@@ -132,7 +133,7 @@ int Instance_options::fill_instance_version()
bzero(result, MAX_VERSION_STRING_LENGTH); bzero(result, MAX_VERSION_STRING_LENGTH);
rc= parse_output_and_get_value(cmd.buffer, mysqld_path, rc= parse_output_and_get_value(cmd.buffer, mysqld_real_path,
result, MAX_VERSION_STRING_LENGTH, result, MAX_VERSION_STRING_LENGTH,
GET_LINE); GET_LINE);
...@@ -143,6 +144,60 @@ int Instance_options::fill_instance_version() ...@@ -143,6 +144,60 @@ int Instance_options::fill_instance_version()
mysqld_version= strdup_root(&alloc, result); mysqld_version= strdup_root(&alloc, result);
} }
err: err:
if (rc)
log_error("fill_instance_version: Failed to get version of '%s'",
mysqld_path);
return rc;
}
/*
Fill mysqld_real_path
SYNOPSYS
fill_mysqld_real_path()
DESCRIPTION
Get the real path to mysqld from "mysqld --help" output.
Will print the realpath of mysqld between "Usage: " and "[OPTIONS]"
This is needed if the mysqld_path variable is pointing at a
script(for example libtool) or a symlink.
RETURN
0 - ok
1 - error occured
*/
int Instance_options::fill_mysqld_real_path()
{
char result[FN_REFLEN];
char help_option[]= " --no-defaults --help";
int rc= 1;
Buffer cmd(mysqld_path_len + sizeof(help_option));
if (create_mysqld_command(&cmd, mysqld_path, mysqld_path_len,
help_option, sizeof(help_option)))
goto err;
bzero(result, FN_REFLEN);
rc= parse_output_and_get_value(cmd.buffer, "Usage: ",
result, FN_REFLEN,
GET_LINE);
if (*result != '\0')
{
char* options_str;
/* chop the path of at [OPTIONS] */
if ((options_str= strstr(result, "[OPTIONS]")))
*options_str= '\0';
mysqld_real_path= strdup_root(&alloc, result);
}
err:
if (rc)
log_error("fill_mysqld_real_path: Failed to get real path of mysqld");
return rc; return rc;
} }
...@@ -405,7 +460,7 @@ int Instance_options::complete_initialization(const char *default_path, ...@@ -405,7 +460,7 @@ int Instance_options::complete_initialization(const char *default_path,
options_array.elements*sizeof(char*)); options_array.elements*sizeof(char*));
argv[filled_default_options + options_array.elements]= 0; argv[filled_default_options + options_array.elements]= 0;
if (fill_log_options() || fill_instance_version()) if (fill_log_options() || fill_mysqld_real_path() || fill_instance_version())
goto err; goto err;
return 0; return 0;
......
...@@ -44,7 +44,8 @@ public: ...@@ -44,7 +44,8 @@ public:
Instance_options() : Instance_options() :
mysqld_version(0), mysqld_socket(0), mysqld_datadir(0), mysqld_version(0), mysqld_socket(0), mysqld_datadir(0),
mysqld_bind_address(0), mysqld_pid_file(0), mysqld_port(0), mysqld_bind_address(0), mysqld_pid_file(0), mysqld_port(0),
mysqld_port_val(0), mysqld_path(0), nonguarded(0), shutdown_delay(0), mysqld_port_val(0), mysqld_path(0), mysqld_real_path(0),
nonguarded(0), shutdown_delay(0),
shutdown_delay_val(0), filled_default_options(0) shutdown_delay_val(0), filled_default_options(0)
{} {}
~Instance_options(); ~Instance_options();
...@@ -84,6 +85,7 @@ public: ...@@ -84,6 +85,7 @@ public:
uint instance_name_len; uint instance_name_len;
const char *mysqld_path; const char *mysqld_path;
uint mysqld_path_len; uint mysqld_path_len;
const char *mysqld_real_path;
const char *nonguarded; const char *nonguarded;
const char *shutdown_delay; const char *shutdown_delay;
uint shutdown_delay_val; uint shutdown_delay_val;
...@@ -95,6 +97,7 @@ public: ...@@ -95,6 +97,7 @@ public:
private: private:
int fill_log_options(); int fill_log_options();
int fill_instance_version(); int fill_instance_version();
int fill_mysqld_real_path();
int add_to_argv(const char *option); int add_to_argv(const char *option);
int get_default_option(char *result, size_t result_len, int get_default_option(char *result, size_t result_len,
const char *option_name); const char *option_name);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment