diff options
author | unknown <petr@mysql.com> | 2005-06-01 04:40:22 +0400 |
---|---|---|
committer | unknown <petr@mysql.com> | 2005-06-01 04:40:22 +0400 |
commit | 26f03563f724b1bcab931d1120a56825135ce24c (patch) | |
tree | 9ad013e8ea02fb9d7bc9887be150da9b869ae2b7 /server-tools | |
parent | 1c7b61e3aef5227165a9957ead000e67935708b2 (diff) | |
download | mariadb-git-26f03563f724b1bcab931d1120a56825135ce24c.tar.gz |
fix IM to display version string in "show instance status" (Bug #10229)
server-tools/instance-manager/buffer.h:
fix for the valgring error
server-tools/instance-manager/commands.cc:
sent the version string
server-tools/instance-manager/instance_options.cc:
compute and store the version string
server-tools/instance-manager/instance_options.h:
add a version string option, and added caching of the mysqld_path length
server-tools/instance-manager/options.cc:
fix valgrind error
server-tools/instance-manager/parse_output.cc:
Add an option to parse_output_and_get_value in order to be
able to get the rest of the string after the found word in
the output of popen() (E.g. a version string).
server-tools/instance-manager/parse_output.h:
prototype changed
Diffstat (limited to 'server-tools')
-rw-r--r-- | server-tools/instance-manager/buffer.h | 2 | ||||
-rw-r--r-- | server-tools/instance-manager/commands.cc | 9 | ||||
-rw-r--r-- | server-tools/instance-manager/instance_options.cc | 115 | ||||
-rw-r--r-- | server-tools/instance-manager/instance_options.h | 9 | ||||
-rw-r--r-- | server-tools/instance-manager/options.cc | 2 | ||||
-rw-r--r-- | server-tools/instance-manager/parse_output.cc | 24 | ||||
-rw-r--r-- | server-tools/instance-manager/parse_output.h | 3 |
7 files changed, 129 insertions, 35 deletions
diff --git a/server-tools/instance-manager/buffer.h b/server-tools/instance-manager/buffer.h index a94047b11a5..e63d725f508 100644 --- a/server-tools/instance-manager/buffer.h +++ b/server-tools/instance-manager/buffer.h @@ -52,7 +52,7 @@ public: ~Buffer() { - free(buffer); + my_free(buffer, MYF(0)); } public: diff --git a/server-tools/instance-manager/commands.cc b/server-tools/instance-manager/commands.cc index 77c26fd28de..737eb47bdf6 100644 --- a/server-tools/instance-manager/commands.cc +++ b/server-tools/instance-manager/commands.cc @@ -203,15 +203,14 @@ int Show_instance_status::execute(struct st_net *net, if (!(instance= instance_map->find(instance_name, strlen(instance_name)))) goto err; if (instance->is_running()) - { store_to_string(&send_buff, (char*) "online", &position); - store_to_string(&send_buff, "unknown", &position); - } else - { store_to_string(&send_buff, (char*) "offline", &position); + + if (instance->options.mysqld_version) + store_to_string(&send_buff, instance->options.mysqld_version, &position); + else store_to_string(&send_buff, (char*) "unknown", &position); - } if (send_buff.is_error() || diff --git a/server-tools/instance-manager/instance_options.cc b/server-tools/instance-manager/instance_options.cc index c8288c35a6f..c6b9141ece4 100644 --- a/server-tools/instance-manager/instance_options.cc +++ b/server-tools/instance-manager/instance_options.cc @@ -27,6 +27,39 @@ #include <signal.h> #include <m_string.h> +#ifdef __WIN__ +#define NEWLINE_LEN 2 +#else +#define NEWLINE_LEN 1 +#endif + + +/* Create "mysqld ..." command in the buffer */ + +static inline int create_mysqld_command(Buffer *buf, + const char *mysqld_path_str, + uint mysqld_path_len, + const char *option, + uint option_len) +{ + int position= 0; + + if (buf->get_size()) /* malloc succeeded */ + { + buf->append(position, mysqld_path_str, mysqld_path_len); + position+= mysqld_path_len; + /* here the '\0' character is copied from the option string */ + buf->append(position, option, option_len); + + if (buf->is_error()) + return 1; + } + else + return 1; + + return 0; +} + /* Get compiled-in value of default_option @@ -50,44 +83,83 @@ int Instance_options::get_default_option(char *result, size_t result_len, const char *option_name) { - int position= 0; int rc= 1; char verbose_option[]= " --no-defaults --verbose --help"; - Buffer cmd(strlen(mysqld_path) + sizeof(verbose_option) + 1); - if (cmd.get_size()) /* malloc succeeded */ - { - cmd.append(position, mysqld_path, strlen(mysqld_path)); - position+= strlen(mysqld_path); - cmd.append(position, verbose_option, sizeof(verbose_option) - 1); - position+= sizeof(verbose_option) - 1; - cmd.append(position, "\0", 1); + /* reserve space fot the path + option + final '\0' */ + Buffer cmd(mysqld_path_len + sizeof(verbose_option)); - if (cmd.is_error()) - goto err; - /* get the value from "mysqld --help --verbose" */ - rc= parse_output_and_get_value(cmd.buffer, option_name + 2, + if (create_mysqld_command(&cmd, mysqld_path, mysqld_path_len, + verbose_option, sizeof(verbose_option))) + goto err; + + /* +2 eats first "--" from the option string (E.g. "--datadir") */ + rc= parse_output_and_get_value(cmd.buffer, option_name + 2, result, result_len); + + return rc; +err: + return 1; +} + + +/* + Fill mysqld_version option (used at initialization stage) + + SYNOPSYS + fill_instance_version() + + DESCRIPTION + + Get mysqld version string from "mysqld --version" output. + + RETURN + 0 - ok + 1 - error occured +*/ + +int Instance_options::fill_instance_version() +{ + enum { MAX_VERSION_STRING_LENGTH= 160 }; + enum { RETURN_LINE= 1 }; + char result[MAX_VERSION_STRING_LENGTH]; + char version_option[]= " --version"; + int rc= 1; + Buffer cmd(mysqld_path_len + sizeof(version_option)); + + if (create_mysqld_command(&cmd, mysqld_path, mysqld_path_len, + version_option, sizeof(version_option))) + goto err; + + rc= parse_output_and_get_value(cmd.buffer, mysqld_path, + result, MAX_VERSION_STRING_LENGTH, + RETURN_LINE); + + if (*result != '\0') + { + /* chop the newline from the end of the version string */ + result[strlen(result) - NEWLINE_LEN]= '\0'; + mysqld_version= strdup_root(&alloc, result); } return rc; + err: return 1; } /* - Get compiled-in value of default_option + Fill various log options SYNOPSYS - get_default_option() - result buffer to put found value - result_len buffer size - option_name the name of the option, prefixed with "--" + fill_log_options() DESCRIPTION - Get compile-in value of requested option from server + Compute paths to enabled log files. If the path is not specified in the + instance explicitly (I.e. log=/home/user/mysql.log), we try to guess the + file name and placement. RETURN 0 - ok @@ -276,6 +348,8 @@ int Instance_options::complete_initialization(const char *default_path, goto err; } + mysqld_path_len= strlen(mysqld_path); + if (mysqld_port) mysqld_port_val= atoi(strchr(mysqld_port, '=') + 1); @@ -330,7 +404,8 @@ int Instance_options::complete_initialization(const char *default_path, options_array.elements*sizeof(char*)); argv[filled_default_options + options_array.elements]= 0; - fill_log_options(); + if (fill_log_options() || fill_instance_version()) + goto err; return 0; diff --git a/server-tools/instance-manager/instance_options.h b/server-tools/instance-manager/instance_options.h index ebeeaa1978e..0d2c32fae66 100644 --- a/server-tools/instance-manager/instance_options.h +++ b/server-tools/instance-manager/instance_options.h @@ -38,7 +38,7 @@ class Instance_options { public: Instance_options() : - 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_port_val(0), mysqld_path(0), nonguarded(0), shutdown_delay(0), shutdown_delay_val(0), filled_default_options(0) @@ -64,6 +64,11 @@ public: enum { MEM_ROOT_BLOCK_SIZE= 512 }; char pid_file_with_path[MAX_PATH_LEN]; char **argv; + /* + Here we cache the version string, obtained from mysqld --version. + In the case when mysqld binary is not found we get "unknown" here. + */ + const char *mysqld_version; /* We need the some options, so we store them as a separate pointers */ const char *mysqld_socket; const char *mysqld_datadir; @@ -74,6 +79,7 @@ public: const char *instance_name; uint instance_name_len; const char *mysqld_path; + uint mysqld_path_len; const char *nonguarded; const char *shutdown_delay; uint shutdown_delay_val; @@ -84,6 +90,7 @@ public: DYNAMIC_ARRAY options_array; private: int fill_log_options(); + int fill_instance_version(); int add_to_argv(const char *option); int get_default_option(char *result, size_t result_len, const char *option_name); diff --git a/server-tools/instance-manager/options.cc b/server-tools/instance-manager/options.cc index 28899940e47..e44e4c6ff34 100644 --- a/server-tools/instance-manager/options.cc +++ b/server-tools/instance-manager/options.cc @@ -224,10 +224,10 @@ int Options::load(int argc, char **argv) /* config-file options are prepended to command-line ones */ load_defaults("my", default_groups, &argc, &argv); + Options::saved_argv= argv; if ((rc= handle_options(&argc, &argv, my_long_options, get_one_option)) != 0) return rc; - Options::saved_argv= argv; return 0; } diff --git a/server-tools/instance-manager/parse_output.cc b/server-tools/instance-manager/parse_output.cc index d6adb8079ce..8e083b0cd0d 100644 --- a/server-tools/instance-manager/parse_output.cc +++ b/server-tools/instance-manager/parse_output.cc @@ -32,10 +32,13 @@ word the word to look for (usually an option name) result the buffer to store the next word (option value) result_len self-explanatory + get_all_line flag, which is set if we want to get all the line after + the matched word. DESCRIPTION Parse output of the "command". Find the "word" and return the next one + if get_all_line is 0. Return the rest of the parsed string otherwise. RETURN 0 - ok @@ -43,7 +46,8 @@ */ int parse_output_and_get_value(const char *command, const char *word, - char *result, size_t result_len) + char *result, size_t result_len, + int get_all_line) { FILE *output; uint wordlen; @@ -81,11 +85,19 @@ int parse_output_and_get_value(const char *command, const char *word, an option value. */ linep+= lineword_len; /* swallow the previous one */ - get_word((const char **) &linep, &lineword_len, NONSPACE); - if (result_len <= lineword_len) - goto err; - strncpy(result, linep, lineword_len); - result[lineword_len]= '\0'; + if (!get_all_line) + { + get_word((const char **) &linep, &lineword_len, NONSPACE); + if (result_len <= lineword_len) + goto err; + strncpy(result, linep, lineword_len); + result[lineword_len]= '\0'; + } + else + { + strncpy(result, linep, result_len); + result[result_len]= '\0'; /* safety */ + } goto pclose; } } diff --git a/server-tools/instance-manager/parse_output.h b/server-tools/instance-manager/parse_output.h index 48fd2ae4068..e0161cf29e3 100644 --- a/server-tools/instance-manager/parse_output.h +++ b/server-tools/instance-manager/parse_output.h @@ -17,6 +17,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ int parse_output_and_get_value(const char *command, const char *word, - char *result, size_t result_len); + char *result, size_t result_len, + int get_all_line= 0); #endif /* INCLUDES_MYSQL_INSTANCE_MANAGER_PARSE_OUTPUT_H */ |