summaryrefslogtreecommitdiff
path: root/server-tools
diff options
context:
space:
mode:
authorunknown <petr@mysql.com>2005-06-01 04:40:22 +0400
committerunknown <petr@mysql.com>2005-06-01 04:40:22 +0400
commit26f03563f724b1bcab931d1120a56825135ce24c (patch)
tree9ad013e8ea02fb9d7bc9887be150da9b869ae2b7 /server-tools
parent1c7b61e3aef5227165a9957ead000e67935708b2 (diff)
downloadmariadb-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.h2
-rw-r--r--server-tools/instance-manager/commands.cc9
-rw-r--r--server-tools/instance-manager/instance_options.cc115
-rw-r--r--server-tools/instance-manager/instance_options.h9
-rw-r--r--server-tools/instance-manager/options.cc2
-rw-r--r--server-tools/instance-manager/parse_output.cc24
-rw-r--r--server-tools/instance-manager/parse_output.h3
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 */