summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/my_sys.h5
-rw-r--r--libmysql/Makefile.shared2
-rw-r--r--mysys/default.c138
-rw-r--r--mysys/my_chsize.c4
-rw-r--r--server-tools/instance-manager/buffer.cc4
-rw-r--r--server-tools/instance-manager/commands.cc474
-rw-r--r--server-tools/instance-manager/commands.h24
-rw-r--r--server-tools/instance-manager/guardian.cc2
-rw-r--r--server-tools/instance-manager/instance.cc11
-rw-r--r--server-tools/instance-manager/instance_map.cc2
-rw-r--r--server-tools/instance-manager/instance_options.cc111
-rw-r--r--server-tools/instance-manager/instance_options.h9
-rw-r--r--server-tools/instance-manager/listener.cc25
-rw-r--r--server-tools/instance-manager/log.cc8
-rw-r--r--server-tools/instance-manager/manager.cc3
-rw-r--r--server-tools/instance-manager/messages.cc4
-rw-r--r--server-tools/instance-manager/mysql_connection.cc16
-rw-r--r--server-tools/instance-manager/mysql_manager_error.h2
-rw-r--r--server-tools/instance-manager/mysqlmanager.cc3
-rw-r--r--server-tools/instance-manager/options.cc2
-rw-r--r--server-tools/instance-manager/parse.cc43
-rw-r--r--server-tools/instance-manager/parse.h3
-rw-r--r--server-tools/instance-manager/protocol.cc9
-rw-r--r--server-tools/instance-manager/protocol.h3
24 files changed, 467 insertions, 440 deletions
diff --git a/include/my_sys.h b/include/my_sys.h
index f63743a4c6c..aa8ef70e237 100644
--- a/include/my_sys.h
+++ b/include/my_sys.h
@@ -773,6 +773,11 @@ extern void reset_root_defaults(MEM_ROOT *mem_root, uint block_size,
extern char *strdup_root(MEM_ROOT *root,const char *str);
extern char *strmake_root(MEM_ROOT *root,const char *str,uint len);
extern char *memdup_root(MEM_ROOT *root,const char *str,uint len);
+extern int my_correct_defaults_file(const char *file_location,
+ const char *option,
+ const char *option_value,
+ const char *section_name,
+ int remove_option);
extern void get_defaults_files(int argc, char **argv,
char **defaults, char **extra_defaults);
extern int load_defaults(const char *conf_file, const char **groups,
diff --git a/libmysql/Makefile.shared b/libmysql/Makefile.shared
index 204c833dd21..bcd2ec6c057 100644
--- a/libmysql/Makefile.shared
+++ b/libmysql/Makefile.shared
@@ -67,7 +67,7 @@ mysysobjects1 = my_init.lo my_static.lo my_malloc.lo my_realloc.lo \
mf_iocache2.lo my_seek.lo my_sleep.lo \
my_pread.lo mf_cache.lo md5.lo sha1.lo \
my_getopt.lo my_gethostbyname.lo my_port.lo \
- my_rename.lo
+ my_rename.lo my_chsize.lo
sqlobjects = net.lo
sql_cmn_objects = pack.lo client.lo my_time.lo
diff --git a/mysys/default.c b/mysys/default.c
index 0f33c94d17e..e38babb849d 100644
--- a/mysys/default.c
+++ b/mysys/default.c
@@ -50,8 +50,10 @@ const char *default_directories[MAX_DEFAULT_DIRS + 1];
#ifdef __WIN__
static const char *f_extensions[]= { ".ini", ".cnf", 0 };
+#define NEWLINE "\r\n"
#else
static const char *f_extensions[]= { ".cnf", 0 };
+#define NEWLINE "\n"
#endif
/*
@@ -78,6 +80,142 @@ static void init_default_directories();
static char *remove_end_comment(char *ptr);
+/*
+ Add/remove option to the option file section.
+
+ SYNOPSYS
+ my_correct_file()
+ file_location The location of configuration file to edit
+ option option to look for
+ option value The value of the option we would like to set
+ section_name the name of the section
+ remove_option This is true if we want to remove the option.
+ False otherwise.
+ IMPLEMENTATION
+ We open the option file first, then read the file line-by-line,
+ looking for the section we need. At the same time we put these lines
+ into a buffer. Then we look for the option within this section and
+ change/remove it. In the end we get a buffer with modified version of the
+ file. Then we write it to the file, truncate it if needed and close it.
+
+ RETURN
+ 0 - ok
+ 1 - some error has occured. Probably due to the lack of resourses
+ -1 - cannot open the file
+*/
+
+int my_correct_defaults_file(const char *file_location, const char *option,
+ const char *option_value,
+ const char *section_name, int remove_option)
+{
+ FILE *cnf_file;
+ struct stat file_stat;
+ char linebuff[512], *ptr;
+ uint optlen;
+ uint len;
+ char *file_buffer;
+ uint position= 0;
+ int is_found= FALSE;
+
+ optlen= strlen(option);
+
+ DBUG_ENTER("my_correct_file");
+
+ if (!(cnf_file= my_fopen(file_location, O_RDWR, MYF(0))))
+ goto err_fopen;
+
+ /* my_fstat doesn't use the flag parameter */
+ if (my_fstat(fileno(cnf_file), &file_stat, MYF(0)))
+ goto err;
+
+ /*
+ Reserve space to read the contents of the file and some more
+ for the option we want ot add.
+ */
+ file_buffer= (char*) my_malloc(sizeof(char)*
+ (file_stat.st_size + /* current file size */
+ optlen + /* option name len */
+ 2 + /* reserve space for newline */
+ 1 + /* reserve for '=' char */
+ strlen(option_value)), /* option value len */
+ MYF(MY_WME));
+
+ if (!file_buffer)
+ goto malloc_err;
+ while (fgets(linebuff, sizeof(linebuff), cnf_file))
+ {
+ len= strlen(linebuff);
+
+ /* if the section is found traverse it */
+ if (is_found)
+ {
+ /* skip the old value of the option we are changing */
+ if (strncmp(linebuff, option, optlen))
+ {
+ /* copy all other lines */
+ strmake(file_buffer + position, linebuff, len);
+ position+= len;
+ }
+ }
+ else
+ {
+ strmake(file_buffer + position, linebuff, len);
+ position+= len;
+ }
+
+
+ /* looking for appropriate section */
+ for (ptr= linebuff ; my_isspace(&my_charset_latin1,*ptr) ; ptr++)
+ {}
+
+ if (*ptr == '[')
+ {
+ /* copy the line to the buffer */
+ if (!strncmp(++ptr, section_name, strlen(section_name)))
+ {
+ is_found= TRUE;
+ /* add option */
+ if (!remove_option)
+ {
+ strmake(file_buffer + position, option, optlen);
+ position+= optlen;
+ if (*option_value)
+ {
+ *(file_buffer + position++)= '=';
+ strmake(file_buffer + position, option_value,
+ strlen(option_value));
+ position+= strlen(option_value);
+ }
+ /* add a newline */
+ strcat(file_buffer + position, NEWLINE);
+ position+= strlen(NEWLINE);
+ }
+ }
+ else
+ is_found= FALSE; /* mark that this section is of no interest to us */
+ }
+
+ }
+
+ if (my_chsize(fileno(cnf_file), position, 0, MYF(MY_WME)) ||
+ my_fseek(cnf_file, 0, MY_SEEK_SET, MYF(0)) ||
+ my_fwrite(cnf_file, file_buffer, position, MYF(MY_NABP)) ||
+ my_fclose(cnf_file, MYF(MY_WME)))
+ goto err;
+
+ my_free(file_buffer, MYF(0));
+
+ DBUG_RETURN(0);
+
+err:
+ my_free(file_buffer, MYF(0));
+malloc_err:
+ my_fclose(cnf_file, MYF(0));
+ DBUG_RETURN(1); /* out of resources */
+err_fopen:
+ DBUG_RETURN(-1); /* cannot access the option file */
+}
+
/*
Process config files in default directories.
diff --git a/mysys/my_chsize.c b/mysys/my_chsize.c
index c258121226d..9760de29a08 100644
--- a/mysys/my_chsize.c
+++ b/mysys/my_chsize.c
@@ -30,7 +30,9 @@
MyFlags Flags
DESCRIPTION
- my_chsize() truncates file if shorter else fill with the filler character
+ my_chsize() truncates file if shorter else fill with the filler character.
+ The function also changes the file pointer. Usually it points to the end
+ of the file after execution.
RETURN VALUE
0 Ok
diff --git a/server-tools/instance-manager/buffer.cc b/server-tools/instance-manager/buffer.cc
index b000a48d5ae..26df401c3c5 100644
--- a/server-tools/instance-manager/buffer.cc
+++ b/server-tools/instance-manager/buffer.cc
@@ -64,7 +64,7 @@ int Buffer::append(uint position, const char *string, uint len_arg)
DESCRIPTION
- The method checks whether it is possible to pus a string of teh "len_arg"
+ The method checks whether it is possible to put a string of the "len_arg"
length into the buffer, starting from "position" byte. In the case when the
buffer is too small it reallocs the buffer. The total size of the buffer is
restricted with 16 Mb.
@@ -81,7 +81,7 @@ int Buffer::reserve(uint position, uint len_arg)
if (position + len_arg >= buffer_size)
{
- buffer= (char *) my_realloc(buffer,
+ buffer= (char*) my_realloc(buffer,
min(MAX_BUFFER_SIZE,
max((uint) (buffer_size*1.5),
position + len_arg)), MYF(0));
diff --git a/server-tools/instance-manager/commands.cc b/server-tools/instance-manager/commands.cc
index 3b4c43d289c..d6d4370fb7f 100644
--- a/server-tools/instance-manager/commands.cc
+++ b/server-tools/instance-manager/commands.cc
@@ -25,11 +25,32 @@
#include <m_string.h>
#include <mysql.h>
+#include <my_dir.h>
-/* some useful functions */
+/*
+ Add a string to a buffer
+
+ SYNOPSYS
+ put_to_buff()
+ buff buffer to add the string
+ str string to add
+ uint offset in the buff to add a string
+
+ DESCRIPTION
+
+ Function to add a string to the buffer. It is different from
+ store_to_string, which is used in the protocol.cc. The last
+ one also stores the length of the string in a special way.
+ This is required for MySQL client/server protocol support only.
+
+ RETURN
+ 0 - ok
+ 1 - error occured
+*/
+
-static int put_to_buff(Buffer *buff, const char *str, uint *position)
+static inline int put_to_buff(Buffer *buff, const char *str, uint *position)
{
uint len= strlen(str);
if (buff->append(*position, str, len))
@@ -47,15 +68,16 @@ static int put_to_buff(Buffer *buff, const char *str, uint *position)
The method sends a list of instances in the instance map to the client.
SYNOPSYS
- Show_instances::do_command()
- net The network connection to the client.
+ Show_instances::execute()
+ net The network connection to the client.
+ connection_id Client connection ID
RETURN
0 - ok
1 - error occured
*/
-int Show_instances::do_command(struct st_net *net)
+int Show_instances::execute(struct st_net *net, ulong connection_id)
{
Buffer send_buff; /* buffer for packets */
LIST name, status;
@@ -63,11 +85,11 @@ int Show_instances::do_command(struct st_net *net)
LIST *field_list;
uint position=0;
- name_field.name= (char *) "instance_name";
- name_field.length= 20;
+ name_field.name= (char*) "instance_name";
+ name_field.length= DEFAULT_FIELD_LENGTH;
name.data= &name_field;
- status_field.name= (char *) "status";
- status_field.length= 20;
+ status_field.name= (char*) "status";
+ status_field.length= DEFAULT_FIELD_LENGTH;
status.data= &status_field;
field_list= list_add(NULL, &status);
field_list= list_add(field_list, &name);
@@ -84,9 +106,9 @@ int Show_instances::do_command(struct st_net *net)
position= 0;
store_to_string(&send_buff, instance->options.instance_name, &position);
if (instance->is_running())
- store_to_string(&send_buff, (char *) "online", &position);
+ store_to_string(&send_buff, (char*) "online", &position);
else
- store_to_string(&send_buff, (char *) "offline", &position);
+ store_to_string(&send_buff, (char*) "offline", &position);
if (my_net_write(net, send_buff.buffer, (uint) position))
goto err;
}
@@ -99,16 +121,7 @@ int Show_instances::do_command(struct st_net *net)
return 0;
err:
- return 1;
-}
-
-
-int Show_instances::execute(struct st_net *net, ulong connection_id)
-{
- if (do_command(net))
- return ER_OUT_OF_RESOURCES;
-
- return 0;
+ return ER_OUT_OF_RESOURCES;
}
@@ -116,10 +129,10 @@ int Show_instances::execute(struct st_net *net, ulong connection_id)
int Flush_instances::execute(struct st_net *net, ulong connection_id)
{
- if (instance_map->flush_instances())
+ if (instance_map->flush_instances() ||
+ net_send_ok(net, connection_id, NULL))
return ER_OUT_OF_RESOURCES;
- net_send_ok(net, connection_id, NULL);
return 0;
}
@@ -134,9 +147,7 @@ Show_instance_status::Show_instance_status(Instance_map *instance_map_arg,
/* we make a search here, since we don't want to store the name */
if ((instance= instance_map->find(name, len)))
- {
instance_name= instance->options.instance_name;
- }
else
instance_name= NULL;
}
@@ -156,8 +167,8 @@ Show_instance_status::Show_instance_status(Instance_map *instance_map_arg,
*/
-int Show_instance_status::do_command(struct st_net *net,
- const char *instance_name)
+int Show_instance_status::execute(struct st_net *net,
+ ulong connection_id)
{
enum { MAX_VERSION_LENGTH= 40 };
Buffer send_buff; /* buffer for packets */
@@ -166,14 +177,17 @@ int Show_instance_status::do_command(struct st_net *net,
NAME_WITH_LENGTH name_field, status_field, version_field;
uint position=0;
+ if (!instance_name)
+ return ER_BAD_INSTANCE_NAME;
+
/* create list of the fileds to be passed to send_fields */
- name_field.name= (char *) "instance_name";
- name_field.length= 20;
+ name_field.name= (char*) "instance_name";
+ name_field.length= DEFAULT_FIELD_LENGTH;
name.data= &name_field;
- status_field.name= (char *) "status";
- status_field.length= 20;
+ status_field.name= (char*) "status";
+ status_field.length= DEFAULT_FIELD_LENGTH;
status.data= &status_field;
- version_field.name= (char *) "version";
+ version_field.name= (char*) "version";
version_field.length= MAX_VERSION_LENGTH;
version.data= &version_field;
field_list= list_add(NULL, &version);
@@ -185,18 +199,18 @@ int Show_instance_status::do_command(struct st_net *net,
{
Instance *instance;
- store_to_string(&send_buff, (char *) instance_name, &position);
+ store_to_string(&send_buff, (char*) instance_name, &position);
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, (char*) "online", &position);
store_to_string(&send_buff, "unknown", &position);
}
else
{
- store_to_string(&send_buff, (char *) "offline", &position);
- store_to_string(&send_buff, (char *) "unknown", &position);
+ store_to_string(&send_buff, (char*) "offline", &position);
+ store_to_string(&send_buff, (char*) "unknown", &position);
}
@@ -205,28 +219,13 @@ int Show_instance_status::do_command(struct st_net *net,
goto err;
}
- send_eof(net);
- net_flush(net);
+ if (send_eof(net) || net_flush(net))
+ goto err;
return 0;
err:
- return 1;
-}
-
-
-int Show_instance_status::execute(struct st_net *net, ulong connection_id)
-{
- if ((instance_name))
- {
- if (do_command(net, instance_name))
- return ER_OUT_OF_RESOURCES;
- return 0;
- }
- else
- {
- return ER_BAD_INSTANCE_NAME;
- }
+ return ER_OUT_OF_RESOURCES;
}
@@ -240,30 +239,29 @@ Show_instance_options::Show_instance_options(Instance_map *instance_map_arg,
/* we make a search here, since we don't want to store the name */
if ((instance= instance_map->find(name, len)))
- {
instance_name= instance->options.instance_name;
- }
else
instance_name= NULL;
}
-int Show_instance_options::do_command(struct st_net *net,
- const char *instance_name)
+int Show_instance_options::execute(struct st_net *net, ulong connection_id)
{
- enum { MAX_VERSION_LENGTH= 40 };
Buffer send_buff; /* buffer for packets */
LIST name, option;
LIST *field_list;
NAME_WITH_LENGTH name_field, option_field;
uint position=0;
+ if (!instance_name)
+ return ER_BAD_INSTANCE_NAME;
+
/* create list of the fileds to be passed to send_fields */
- name_field.name= (char *) "option_name";
- name_field.length= 20;
+ name_field.name= (char*) "option_name";
+ name_field.length= DEFAULT_FIELD_LENGTH;
name.data= &name_field;
- option_field.name= (char *) "value";
- option_field.length= 20;
+ option_field.name= (char*) "value";
+ option_field.length= DEFAULT_FIELD_LENGTH;
option.data= &option_field;
field_list= list_add(NULL, &option);
field_list= list_add(field_list, &name);
@@ -275,16 +273,16 @@ int Show_instance_options::do_command(struct st_net *net,
if (!(instance= instance_map->find(instance_name, strlen(instance_name))))
goto err;
- store_to_string(&send_buff, (char *) "instance_name", &position);
- store_to_string(&send_buff, (char *) instance_name, &position);
+ store_to_string(&send_buff, (char*) "instance_name", &position);
+ store_to_string(&send_buff, (char*) instance_name, &position);
if (my_net_write(net, send_buff.buffer, (uint) position))
goto err;
if ((instance->options.mysqld_path))
{
position= 0;
- store_to_string(&send_buff, (char *) "mysqld-path", &position);
+ store_to_string(&send_buff, (char*) "mysqld-path", &position);
store_to_string(&send_buff,
- (char *) instance->options.mysqld_path,
+ (char*) instance->options.mysqld_path,
&position);
if (send_buff.is_error() ||
my_net_write(net, send_buff.buffer, (uint) position))
@@ -294,7 +292,7 @@ int Show_instance_options::do_command(struct st_net *net,
if ((instance->options.nonguarded))
{
position= 0;
- store_to_string(&send_buff, (char *) "nonguarded", &position);
+ store_to_string(&send_buff, (char*) "nonguarded", &position);
store_to_string(&send_buff, "", &position);
if (send_buff.is_error() ||
my_net_write(net, send_buff.buffer, (uint) position))
@@ -318,7 +316,8 @@ int Show_instance_options::do_command(struct st_net *net,
/* join name and the value into the same option again */
*option_value= '=';
}
- else store_to_string(&send_buff, tmp_option + 2, &position);
+ else
+ store_to_string(&send_buff, tmp_option + 2, &position);
if (send_buff.is_error() ||
my_net_write(net, send_buff.buffer, (uint) position))
@@ -326,28 +325,13 @@ int Show_instance_options::do_command(struct st_net *net,
}
}
- send_eof(net);
- net_flush(net);
+ if (send_eof(net) || net_flush(net))
+ goto err;
return 0;
err:
- return 1;
-}
-
-
-int Show_instance_options::execute(struct st_net *net, ulong connection_id)
-{
- if ((instance_name))
- {
- if (do_command(net, instance_name))
- return ER_OUT_OF_RESOURCES;
- return 0;
- }
- else
- {
- return ER_BAD_INSTANCE_NAME;
- }
+ return ER_OUT_OF_RESOURCES;
}
@@ -367,9 +351,7 @@ int Start_instance::execute(struct st_net *net, ulong connection_id)
{
uint err_code;
if (instance == 0)
- {
return ER_BAD_INSTANCE_NAME; /* haven't found an instance */
- }
else
{
if ((err_code= instance->start()))
@@ -404,33 +386,59 @@ Show_instance_log::Show_instance_log(Instance_map *instance_map_arg,
/* we make a search here, since we don't want to store the name */
if ((instance= instance_map->find(name, len)))
- {
instance_name= instance->options.instance_name;
- }
else
instance_name= NULL;
}
-int Show_instance_log::do_command(struct st_net *net,
- const char *instance_name)
+
+/*
+ Open the logfile, read requested part of the log and send the info
+ to the client.
+
+ SYNOPSYS
+ Show_instance_log::execute()
+ net The network connection to the client.
+ connection_id Client connection ID
+
+ DESCRIPTION
+
+ Send a table with the content of the log requested. The function also
+ deals with errro handling, to be verbose.
+
+ RETURN
+ ER_OFFSET_ERROR We were requested to read negative number of bytes
+ from the log
+ ER_NO_SUCH_LOG The kind log being read is not enabled in the instance
+ ER_GUESS_LOGFILE IM wasn't able to figure out the log placement, while
+ it is enabled. Probably user should specify the path
+ to the logfile explicitly.
+ ER_OPEN_LOGFILE Cannot open the logfile
+ ER_READ_FILE Cannot read the logfile
+ ER_OUT_OF_RESOURCES We weren't able to allocate some resources
+*/
+
+int Show_instance_log::execute(struct st_net *net, ulong connection_id)
{
- enum { MAX_VERSION_LENGTH= 40 };
Buffer send_buff; /* buffer for packets */
LIST name;
LIST *field_list;
NAME_WITH_LENGTH name_field;
- uint position=0;
+ uint position= 0;
/* create list of the fileds to be passed to send_fields */
- name_field.name= (char *) "Log";
- name_field.length= 20;
+ name_field.name= (char*) "Log";
+ name_field.length= DEFAULT_FIELD_LENGTH;
name.data= &name_field;
field_list= list_add(NULL, &name);
+ if (!instance_name)
+ return ER_BAD_INSTANCE_NAME;
+
/* cannot read negative number of bytes */
if (offset > size)
- return ER_SYNTAX_ERROR;
+ return ER_OFFSET_ERROR;
send_fields(net, field_list);
@@ -439,43 +447,28 @@ int Show_instance_log::do_command(struct st_net *net,
const char *logpath;
File fd;
- if ((instance= instance_map->find(instance_name, strlen(instance_name))) == NULL)
+ if ((instance= instance_map->find(instance_name,
+ strlen(instance_name))) == NULL)
goto err;
- switch (log_type)
- {
- case LOG_ERROR:
- logpath= instance->options.error_log;
- break;
- case LOG_GENERAL:
- logpath= instance->options.query_log;
- break;
- case LOG_SLOW:
- logpath= instance->options.slow_log;
- break;
- default:
- logpath= NULL;
- }
+ logpath= instance->options.logs[log_type];
/* Instance has no such log */
if (logpath == NULL)
- {
return ER_NO_SUCH_LOG;
- }
else if (*logpath == '\0')
- {
return ER_GUESS_LOGFILE;
- }
- if ((fd= open(logpath, O_RDONLY)))
+ if ((fd= my_open(logpath, O_RDONLY | O_BINARY, MYF(MY_WME))) >= 0)
{
size_t buff_size;
int read_len;
/* calculate buffer size */
struct stat file_stat;
- if(fstat(fd, &file_stat))
+ /* my_fstat doesn't use the flag parameter */
+ if (my_fstat(fd, &file_stat, MYF(0)))
goto err;
buff_size= (size - offset);
@@ -483,22 +476,21 @@ int Show_instance_log::do_command(struct st_net *net,
/* read in one chunk */
read_len= my_seek(fd, file_stat.st_size - size, MY_SEEK_SET, MYF(0));
- char *bf= (char *) malloc(sizeof(char)*buff_size);
- read_len= my_read(fd, bf, buff_size, MYF(0));
- store_to_string(&send_buff, (char *) bf, &position, read_len);
+ char *bf= (char*) malloc(sizeof(char)*buff_size);
+ if ((read_len= my_read(fd, bf, buff_size, MYF(0))) < 0)
+ return ER_READ_FILE;
+ store_to_string(&send_buff, (char*) bf, &position, read_len);
close(fd);
}
else
- {
return ER_OPEN_LOGFILE;
- }
if (my_net_write(net, send_buff.buffer, (uint) position))
goto err;
}
- send_eof(net);
- net_flush(net);
+ if (send_eof(net) || net_flush(net))
+ goto err;
return 0;
@@ -507,20 +499,6 @@ err:
}
-int Show_instance_log::execute(struct st_net *net, ulong connection_id)
-{
- if (instance_name != NULL)
- {
- return do_command(net, instance_name);
- }
- else
- {
- return ER_BAD_INSTANCE_NAME;
- }
-}
-
-
-
/* implementation for Show_instance_log_files: */
Show_instance_log_files::Show_instance_log_files
@@ -531,48 +509,47 @@ Show_instance_log_files::Show_instance_log_files
/* we make a search here, since we don't want to store the name */
if ((instance= instance_map->find(name, len)))
- {
instance_name= instance->options.instance_name;
- }
else
instance_name= NULL;
}
/*
- The method sends a table with a the list of the log files
+ The method sends a table with a list of log files
used by the instance.
SYNOPSYS
- Show_instance_log_files::do_command()
+ Show_instance_log_files::execute()
net The network connection to the client.
- instance_name The name of the instance.
+ connection_id The ID of the client connection
RETURN
+ ER_BAD_INSTANCE_NAME The instance name specified is not valid
+ ER_OUT_OF_RESOURCES some error occured
0 - ok
- 1 - error occured
*/
-
-int Show_instance_log_files::do_command(struct st_net *net,
- const char *instance_name)
+int Show_instance_log_files::execute(struct st_net *net, ulong connection_id)
{
- enum { MAX_VERSION_LENGTH= 40 };
Buffer send_buff; /* buffer for packets */
LIST name, path, size;
LIST *field_list;
NAME_WITH_LENGTH name_field, path_field, size_field;
- uint position=0;
+ uint position= 0;
+
+ if (!instance_name)
+ return ER_BAD_INSTANCE_NAME;
/* create list of the fileds to be passed to send_fields */
- name_field.name= (char *) "Logfile";
- name_field.length= 20;
+ name_field.name= (char*) "Logfile";
+ name_field.length= DEFAULT_FIELD_LENGTH;
name.data= &name_field;
- path_field.name= (char *) "Path";
- path_field.length= 20;
+ path_field.name= (char*) "Path";
+ path_field.length= DEFAULT_FIELD_LENGTH;
path.data= &path_field;
- size_field.name= (char *) "Filesize";
- size_field.length= 20;
+ size_field.name= (char*) "Filesize";
+ size_field.length= DEFAULT_FIELD_LENGTH;
size.data= &size_field;
field_list= list_add(NULL, &size);
field_list= list_add(field_list, &path);
@@ -588,7 +565,7 @@ int Show_instance_log_files::do_command(struct st_net *net,
{
/*
We have alike structure in instance_options.cc. We use such to be able
- to loop througt the options, which we need to handle in some common way.
+ to loop through the options, which we need to handle in some common way.
*/
struct log_files_st
{
@@ -596,72 +573,59 @@ int Show_instance_log_files::do_command(struct st_net *net,
const char *value;
} logs[]=
{
- {"ERROR LOG", instance->options.error_log},
- {"GENERAL LOG", instance->options.query_log},
- {"SLOW LOG", instance->options.slow_log},
+ {"ERROR LOG", instance->options.logs[LOG_ERROR]},
+ {"GENERAL LOG", instance->options.logs[LOG_GENERAL]},
+ {"SLOW LOG", instance->options.logs[LOG_SLOW]},
{NULL, NULL}
};
struct log_files_st *log_files;
-
- instance->options.print_argv();
for (log_files= logs; log_files->name; log_files++)
{
if (log_files->value != NULL)
{
struct stat file_stat;
- char buff[20];
+ /*
+ Save some more space for the log file names. In fact all
+ we need is srtlen("GENERAL_LOG") + 1
+ */
+ enum { LOG_NAME_BUFFER_SIZE= 20 };
+ char buff[LOG_NAME_BUFFER_SIZE];
position= 0;
/* store the type of the log in the send buffer */
store_to_string(&send_buff, log_files->name, &position);
- switch (stat(log_files->value, &file_stat)) {
- case 0:
- if (S_ISREG(file_stat.st_mode))
- {
- store_to_string(&send_buff,
- (char *) log_files->value,
- &position);
- int10_to_str(file_stat.st_size, buff, 10);
- store_to_string(&send_buff, (char *) buff, &position);
- break;
- }
- default:
+ if (stat(log_files->value, &file_stat))
+ {
+ store_to_string(&send_buff, "", &position);
+ store_to_string(&send_buff, (char*) "0", &position);
+ }
+ else if (S_ISREG(file_stat.st_mode))
+ {
store_to_string(&send_buff,
- "",
+ (char*) log_files->value,
&position);
- store_to_string(&send_buff, (char *) "0", &position);
+ int10_to_str(file_stat.st_size, buff, 10);
+ store_to_string(&send_buff, (char*) buff, &position);
}
+
if (my_net_write(net, send_buff.buffer, (uint) position))
goto err;
}
}
}
- send_eof(net);
- net_flush(net);
+ if (send_eof(net) || net_flush(net))
+ goto err;
return 0;
err:
- return 1;
-}
-int Show_instance_log_files::execute(struct st_net *net, ulong connection_id)
-{
- if (instance_name != NULL)
- {
- if (do_command(net, instance_name))
- return ER_OUT_OF_RESOURCES;
- return 0;
- }
- else
- {
- return ER_BAD_INSTANCE_NAME;
- }
+ return ER_OUT_OF_RESOURCES;
}
-/* implementation for SET nstance_name.option=option_value: */
+/* implementation for SET instance_name.option=option_value: */
Set_option::Set_option(Instance_map *instance_map_arg,
const char *name, uint len,
@@ -679,10 +643,12 @@ Set_option::Set_option(Instance_map *instance_map_arg,
if ((option_len_arg < MAX_OPTION_LEN - 1) ||
(option_value_len_arg < MAX_OPTION_LEN - 1))
{
- strncpy(option, option_arg, option_len_arg);
+ strmake(option, option_arg, option_len_arg);
+ strmake(option_value, option_value_arg, option_value_len_arg);
+/* strncpy(option, option_arg, option_len_arg);
option[option_len_arg]= 0;
strncpy(option_value, option_value_arg, option_value_len_arg);
- option_value[option_value_len_arg]= 0;
+ option_value[option_value_len_arg]= 0; */
}
else
{
@@ -700,89 +666,38 @@ Set_option::Set_option(Instance_map *instance_map_arg,
/*
- Correct the file. skip option could be used in future if we don't want to
- let user change the options file (E.g. he lacks permissions to do that)
-*/
-int Set_option::correct_file(bool skip)
-{
- FILE *cnf_file;
- const char *default_location="/etc/my.cnf";
- char linebuff[4096], *ptr;
- uint optlen;
- Buffer file_buffer;
- uint position= 0;
- bool isfound= false;
-
- optlen= strlen(option);
-
- if (!(cnf_file= my_fopen(default_location, O_RDONLY, MYF(0))))
- goto err_fopen;
-
- while (fgets(linebuff, sizeof(linebuff), cnf_file))
- {
- /* if the section is found traverse it */
- if (isfound)
- {
- /* skip the old value of the option we are changing */
- if (strncmp(linebuff, option, optlen))
- {
- /* copy all other lines line */
- put_to_buff(&file_buffer, linebuff, &position);
- }
- }
- else
- put_to_buff(&file_buffer, linebuff, &position);
-
- /* looking for appropriate instance section */
- for (ptr= linebuff ; my_isspace(&my_charset_latin1,*ptr) ; ptr++);
- if (*ptr == '[')
- {
- /* copy the line to the buffer */
- if (!strncmp(++ptr, instance_name, instance_name_len))
- {
- isfound= true;
- /* add option */
- if (!skip)
- {
- put_to_buff(&file_buffer, option, &position);
- if (option_value[0] != 0)
- {
- put_to_buff(&file_buffer, "=", &position);
- put_to_buff(&file_buffer, option_value, &position);
- }
- /* add a newline */
- put_to_buff(&file_buffer, "\n", &position);
- }
- }
- else
- isfound= false; /* mark that this section is of no interest to us */
- }
+ The method sends a table with a list of log files
+ used by the instance.
- }
+ SYNOPSYS
+ Set_option::correct_file()
+ skip Skip the option, being searched while writing the result file.
+ That is, to delete it.
- if (my_fclose(cnf_file, MYF(0)))
- goto err;
+ DESCRIPTION
- /* we must hold an instance_map mutex while changing config file */
- instance_map->lock();
+ Correct the option file. The "skip" option is used to remove the found
+ option.
- if (!(cnf_file= my_fopen(default_location, O_WRONLY|O_TRUNC, MYF(0))))
- goto err;
- if (my_fwrite(cnf_file, file_buffer.buffer, position, MYF(MY_NABP)))
- goto err;
+ RETURN
+ ER_BAD_INSTANCE_NAME The instance name specified is not valid
+ ER_ACCESS_OPTION_FILE Cannot access the option file
+ 0 - ok
+*/
- if (my_fclose(cnf_file, MYF(0)))
- goto err;
+int Set_option::correct_file(int skip)
+{
+ int error;
- instance_map->unlock();
+ error= my_correct_defaults_file("/etc/my.cnf", option,
+ option_value, instance_name, skip);
+ if (error > 0)
+ return ER_OUT_OF_RESOURCES;
+ else if (error < 0)
+ return ER_ACCESS_OPTION_FILE;
+ /* everything was fine */
return 0;
-
-err:
- my_fclose(cnf_file, MYF(0));
- return ER_OUT_OF_RESOURCES;
-err_fopen:
- return ER_ACCESS_OPTION_FILE;
}
@@ -801,7 +716,14 @@ err_fopen:
int Set_option::do_command(struct st_net *net)
{
- return correct_file(false);
+ int error= 0;
+
+ /* we must hold the instance_map mutex while changing config file */
+ instance_map->lock();
+ error= correct_file(FALSE);
+ instance_map->unlock();
+
+ return error;
}
@@ -821,9 +743,7 @@ int Set_option::execute(struct st_net *net, ulong connection_id)
return val;
}
else
- {
return ER_BAD_INSTANCE_NAME;
- }
}
@@ -831,7 +751,7 @@ int Set_option::execute(struct st_net *net, ulong connection_id)
int Unset_option::do_command(struct st_net *net)
{
- return correct_file(true);
+ return correct_file(TRUE);
}
@@ -852,9 +772,7 @@ int Stop_instance::execute(struct st_net *net, ulong connection_id)
uint err_code;
if (instance == 0)
- {
return ER_BAD_INSTANCE_NAME; /* haven't found an instance */
- }
else
{
if (!(instance->options.nonguarded))
diff --git a/server-tools/instance-manager/commands.h b/server-tools/instance-manager/commands.h
index 46cd0893759..bfd38d34889 100644
--- a/server-tools/instance-manager/commands.h
+++ b/server-tools/instance-manager/commands.h
@@ -31,7 +31,6 @@ public:
Show_instances(Instance_map *instance_map_arg): Command(instance_map_arg)
{}
- int do_command(struct st_net *net);
int execute(struct st_net *net, ulong connection_id);
};
@@ -60,8 +59,8 @@ class Show_instance_status : public Command
{
public:
- Show_instance_status(Instance_map *instance_map_arg, const char *name, uint len);
- int do_command(struct st_net *net, const char *instance_name);
+ Show_instance_status(Instance_map *instance_map_arg,
+ const char *name, uint len);
int execute(struct st_net *net, ulong connection_id);
const char *instance_name;
};
@@ -76,10 +75,10 @@ class Show_instance_options : public Command
{
public:
- Show_instance_options(Instance_map *instance_map_arg, const char *name, uint len);
+ Show_instance_options(Instance_map *instance_map_arg,
+ const char *name, uint len);
int execute(struct st_net *net, ulong connection_id);
- int do_command(struct st_net *net, const char *instance_name);
const char *instance_name;
};
@@ -129,7 +128,6 @@ public:
Show_instance_log(Instance_map *instance_map_arg, const char *name,
uint len, Log_type log_type_arg, const char *size_arg,
const char *offset_arg);
- int do_command(struct st_net *net, const char *instance_name);
int execute(struct st_net *net, ulong connection_id);
Log_type log_type;
const char *instance_name;
@@ -147,8 +145,8 @@ class Show_instance_log_files : public Command
{
public:
- Show_instance_log_files(Instance_map *instance_map_arg, const char *name, uint len);
- int do_command(struct st_net *net, const char *instance_name);
+ Show_instance_log_files(Instance_map *instance_map_arg,
+ const char *name, uint len);
int execute(struct st_net *net, ulong connection_id);
const char *instance_name;
const char *option;
@@ -156,10 +154,10 @@ public:
/*
- Syntax error command. This command is issued if parser reported a syntax error.
- We need it to distinguish the parse error and the situation when parser internal
- error occured. E.g. parsing failed because we hadn't had enought memory. In the
- latter case parse_command() should return an error.
+ Syntax error command. This command is issued if parser reported a syntax
+ error. We need it to distinguish the parse error and the situation when
+ parser internal error occured. E.g. parsing failed because we hadn't had
+ enought memory. In the latter case parse_command() should return an error.
*/
class Syntax_error : public Command
@@ -185,7 +183,7 @@ public:
virtual int do_command(struct st_net *net);
int execute(struct st_net *net, ulong connection_id);
protected:
- int correct_file(bool skip);
+ int correct_file(int skip);
public:
const char *instance_name;
uint instance_name_len;
diff --git a/server-tools/instance-manager/guardian.cc b/server-tools/instance-manager/guardian.cc
index 5d89f167f2f..404e9f34ab5 100644
--- a/server-tools/instance-manager/guardian.cc
+++ b/server-tools/instance-manager/guardian.cc
@@ -315,7 +315,7 @@ int Guardian_thread::guard(Instance *instance, bool nolock)
content->restart_counter= 0;
content->crash_moment= 0;
content->state= NOT_STARTED;
- node->data= (void *) content;
+ node->data= (void*) content;
if (nolock)
guarded_instances= list_add(guarded_instances, node);
diff --git a/server-tools/instance-manager/instance.cc b/server-tools/instance-manager/instance.cc
index 9fdcab7ce7c..615f16f9e22 100644
--- a/server-tools/instance-manager/instance.cc
+++ b/server-tools/instance-manager/instance.cc
@@ -304,12 +304,11 @@ void Instance::kill_instance(int signum)
*/
if (!kill(pid, signum))
options.unlink_pidfile();
- else
- if (signum == SIGKILL) /* really killed instance with SIGKILL */
- log_error("The instance %s is being stopped forsibly. Normally \
- it should not happed. Probably the instance has been \
- hanging. You should also check your IM setup",
- options.instance_name);
+ else if (signum == SIGKILL) /* really killed instance with SIGKILL */
+ log_error("The instance %s is being stopped forsibly. Normally \
+ it should not happed. Probably the instance has been \
+ hanging. You should also check your IM setup",
+ options.instance_name);
}
return;
}
diff --git a/server-tools/instance-manager/instance_map.cc b/server-tools/instance-manager/instance_map.cc
index 3e76c24a9a1..792ffff5fb6 100644
--- a/server-tools/instance-manager/instance_map.cc
+++ b/server-tools/instance-manager/instance_map.cc
@@ -246,7 +246,7 @@ int Instance_map::load()
argv_options[1]= '\0';
if (my_search_option_files("my", &argc, (char ***) &argv, &args_used,
- process_option, (void *) this) ||
+ process_option, (void*) this) ||
complete_initialization())
return 1;
diff --git a/server-tools/instance-manager/instance_options.cc b/server-tools/instance-manager/instance_options.cc
index ce7d43db74a..b2602af6066 100644
--- a/server-tools/instance-manager/instance_options.cc
+++ b/server-tools/instance-manager/instance_options.cc
@@ -21,7 +21,6 @@
#include "instance_options.h"
#include "parse_output.h"
-#include "parse.h"
#include "buffer.h"
#include <my_sys.h>
@@ -36,7 +35,7 @@
get_default_option()
result buffer to put found value
result_len buffer size
- oprion_name the name of the option, prefixed with "--"
+ option_name the name of the option, prefixed with "--"
DESCRIPTION
@@ -47,6 +46,7 @@
1 - error occured
*/
+
int Instance_options::get_default_option(char *result, size_t result_len,
const char *option_name)
{
@@ -76,16 +76,30 @@ err:
}
+/*
+ Get compiled-in value of default_option
+
+ SYNOPSYS
+ get_default_option()
+ result buffer to put found value
+ result_len buffer size
+ option_name the name of the option, prefixed with "--"
+
+ DESCRIPTION
+
+ Get compile-in value of requested option from server
+
+ RETURN
+ 0 - ok
+ 1 - error occured
+*/
+
int Instance_options::fill_log_options()
{
- /* array for the log option for mysqld */
- enum { MAX_LOG_OPTIONS= 8 };
- enum { MAX_LOG_OPTION_LENGTH= 256 };
- /* the last option must be '\0', so we reserve space for it */
- char log_options[MAX_LOG_OPTIONS + 1][MAX_LOG_OPTION_LENGTH];
Buffer buff;
uint position= 0;
char **tmp_argv= argv;
+ enum { MAX_LOG_OPTION_LENGTH= 256 };
char datadir[MAX_LOG_OPTION_LENGTH];
char hostname[MAX_LOG_OPTION_LENGTH];
uint hostname_length;
@@ -93,43 +107,17 @@ int Instance_options::fill_log_options()
{
const char *name;
uint length;
- const char **value;
+ char **value;
const char *default_suffix;
- } logs[]=
+ } logs_st[]=
{
- {"--log-error", 11, &error_log, ".err"},
- {"--log", 5, &query_log, ".log"},
- {"--log-slow-queries", 18, &slow_log, "-slow.log"},
+ {"--log-error", 11, &(logs[LOG_ERROR]), ".err"},
+ {"--log", 5, &(logs[LOG_GENERAL]), ".log"},
+ {"--log-slow-queries", 18, &(logs[LOG_SLOW]), "-slow.log"},
{NULL, 0, NULL, NULL}
};
struct log_files_st *log_files;
- /* clean the buffer before usage */
- bzero(log_options, sizeof(log_options));
-
- /* create a "mysqld <argv_options>" command in the buffer */
- buff.append(position, mysqld_path, strlen(mysqld_path));
- position= strlen(mysqld_path);
-
- /* skip the first option */
- tmp_argv++;
-
- while (*tmp_argv != 0)
- {
- buff.append(position, " ", 1);
- position++;
- buff.append(position, *tmp_argv, strlen(*tmp_argv));
- position+= strlen(*tmp_argv);
- tmp_argv++;
- }
-
- buff.append(position, "\0", 1);
- position++;
-
- /* get options and parse them */
- if (parse_arguments(buff.buffer, "--log", (char *) log_options,
- MAX_LOG_OPTIONS + 1, MAX_LOG_OPTION_LENGTH))
- goto err;
/* compute hostname and datadir for the instance */
if (mysqld_datadir == NULL)
{
@@ -148,11 +136,11 @@ int Instance_options::fill_log_options()
hostname_length= strlen(hostname);
- for (log_files= logs; log_files->name; log_files++)
+ for (log_files= logs_st; log_files->name; log_files++)
{
- for (int i=0; (i < MAX_LOG_OPTIONS) && (log_options[i][0] != '\0'); i++)
+ for (int i=0; (argv[i] != 0); i++)
{
- if (!strncmp(log_options[i], log_files->name, log_files->length))
+ if (!strncmp(argv[i], log_files->name, log_files->length))
{
/*
This is really log_files->name option if and only if it is followed
@@ -160,8 +148,8 @@ int Instance_options::fill_log_options()
options as '--log' and '--log-bin'. This is checked in the following
two statements.
*/
- if (log_options[i][log_files->length] == '\0' ||
- my_isspace(default_charset_info, log_options[i][log_files->length]))
+ if (argv[i][log_files->length] == '\0' ||
+ my_isspace(default_charset_info, argv[i][log_files->length]))
{
char full_name[MAX_LOG_OPTION_LENGTH];
@@ -178,21 +166,25 @@ int Instance_options::fill_log_options()
else
goto err;
- *(log_files->value)= strdup_root(&alloc, datadir);
+ /*
+ If there were specified two identical logfiles options,
+ we would loose some memory in MEM_ROOT here. However
+ this situation is not typical.
+ */
+ *(log_files->value)= strdup_root(&alloc, full_name);
}
- if (log_options[i][log_files->length] == '=')
+ if (argv[i][log_files->length] == '=')
{
char full_name[MAX_LOG_OPTION_LENGTH];
- fn_format(full_name, log_options[i] +log_files->length + 1,
+ fn_format(full_name, argv[i] +log_files->length + 1,
datadir, "", MY_UNPACK_FILENAME | MY_SAFE_PATH);
if (!(*(log_files->value)=
strdup_root(&alloc, full_name)))
goto err;
}
-
}
}
}
@@ -205,6 +197,25 @@ err:
}
+/*
+ Get the full pid file name with path
+
+ SYNOPSYS
+ get_pid_filaname()
+ result buffer to sotre the pidfile value
+
+ IMPLEMENTATION
+ Get the data directory, then get the pid filename
+ (which is always set for an instance), then load the
+ full path with my_load_path(). It takes into account
+ whether it is already an absolute path or it should be
+ prefixed with the datadir and so on.
+
+ RETURN
+ 0 - ok
+ 1 - error occured
+*/
+
int Instance_options::get_pid_filename(char *result)
{
const char *pid_file= mysqld_pid_file;
@@ -405,7 +416,7 @@ int Instance_options::add_to_argv(const char* option)
DBUG_ASSERT(filled_default_options < MAX_NUMBER_OF_DEFAULT_OPTIONS);
if ((option))
- argv[filled_default_options++]= (char *) option;
+ argv[filled_default_options++]= (char*) option;
return 0;
}
@@ -433,10 +444,10 @@ int Instance_options::init(const char *instance_name_arg)
init_alloc_root(&alloc, MEM_ROOT_BLOCK_SIZE, 0);
- if (my_init_dynamic_array(&options_array, sizeof(char *), 0, 32))
+ if (my_init_dynamic_array(&options_array, sizeof(char*), 0, 32))
goto err;
- if (!(instance_name= strmake_root(&alloc, (char *) instance_name_arg,
+ if (!(instance_name= strmake_root(&alloc, (char*) instance_name_arg,
instance_name_len)))
goto err;
diff --git a/server-tools/instance-manager/instance_options.h b/server-tools/instance-manager/instance_options.h
index 4def59b75a2..ebeeaa1978e 100644
--- a/server-tools/instance-manager/instance_options.h
+++ b/server-tools/instance-manager/instance_options.h
@@ -18,6 +18,7 @@
#include <my_global.h>
#include <my_sys.h>
+#include "parse.h"
#ifdef __GNUC__
#pragma interface
@@ -40,8 +41,7 @@ public:
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), error_log(0), query_log(0), slow_log(0),
- filled_default_options(0)
+ shutdown_delay_val(0), filled_default_options(0)
{}
~Instance_options();
/* fills in argv */
@@ -77,9 +77,8 @@ public:
const char *nonguarded;
const char *shutdown_delay;
uint shutdown_delay_val;
- const char *error_log;
- const char *query_log;
- const char *slow_log;
+ /* log enums are defined in parse.h */
+ char *logs[3];
/* this value is computed and cashed here */
DYNAMIC_ARRAY options_array;
diff --git a/server-tools/instance-manager/listener.cc b/server-tools/instance-manager/listener.cc
index 946bab11a2e..98f5b64ca92 100644
--- a/server-tools/instance-manager/listener.cc
+++ b/server-tools/instance-manager/listener.cc
@@ -241,23 +241,20 @@ void Listener_thread::run()
}
}
}
- else
- if (FD_ISSET(ip_socket, &read_fds_arg))
+ else if (FD_ISSET(ip_socket, &read_fds_arg))
+ {
+ int client_fd= accept(ip_socket, 0, 0);
+ /* accept may return -1 (failure or spurious wakeup) */
+ if (client_fd >= 0) // connection established
{
- int client_fd= accept(ip_socket, 0, 0);
- /* accept may return -1 (failure or spurious wakeup) */
- if (client_fd >= 0) // connection established
+ if (Vio *vio= vio_new(client_fd, VIO_TYPE_TCPIP, 0))
+ handle_new_mysql_connection(vio);
+ else
{
- if (Vio *vio= vio_new(client_fd, VIO_TYPE_TCPIP, 0))
- {
- handle_new_mysql_connection(vio);
- }
- else
- {
- shutdown(client_fd, SHUT_RDWR);
- close(client_fd);
- }
+ shutdown(client_fd, SHUT_RDWR);
+ close(client_fd);
}
+ }
}
}
}
diff --git a/server-tools/instance-manager/log.cc b/server-tools/instance-manager/log.cc
index 5491b4e70e9..88d777eeeb6 100644
--- a/server-tools/instance-manager/log.cc
+++ b/server-tools/instance-manager/log.cc
@@ -70,7 +70,7 @@ static inline void log(FILE *file, const char *format, va_list args)
if (n < 0 || n == sizeof(buff_stack))
{
int size= sizeof(buff_stack) * 2;
- buff_msg= (char *) my_malloc(size, 0);
+ buff_msg= (char*) my_malloc(size, MYF(0));
while (true)
{
if (buff_msg == 0)
@@ -86,16 +86,16 @@ static inline void log(FILE *file, const char *format, va_list args)
size*= 2;
/* realloc() does unnecessary memcpy */
my_free(buff_msg, 0);
- buff_msg= (char *) my_malloc(size, 0);
+ buff_msg= (char*) my_malloc(size, MYF(0));
}
}
else if ((size_t) n > sizeof(buff_stack))
{
- buff_msg= (char *) my_malloc(n + 1, 0);
+ buff_msg= (char*) my_malloc(n + 1, MYF(0));
#ifdef DBUG
DBUG_ASSERT(n == vsnprintf(buff_msg, n + 1, format, args));
#else
- vsnprintf(buff_msg, n + 1, format, args);
+ vsnprintf(buff_msg, n + 1, format, args);
#endif
}
fprintf(file, "%s%s\n", buff_date, buff_msg);
diff --git a/server-tools/instance-manager/manager.cc b/server-tools/instance-manager/manager.cc
index fd8673c4d66..a4c81739b17 100644
--- a/server-tools/instance-manager/manager.cc
+++ b/server-tools/instance-manager/manager.cc
@@ -197,8 +197,7 @@ void manager(const Options &options)
goto err;
}
- switch (signo)
- {
+ switch (signo) {
case THR_SERVER_ALARM:
process_alarm(signo);
break;
diff --git a/server-tools/instance-manager/messages.cc b/server-tools/instance-manager/messages.cc
index 69bc8507c2e..a9b00b9e01f 100644
--- a/server-tools/instance-manager/messages.cc
+++ b/server-tools/instance-manager/messages.cc
@@ -55,8 +55,12 @@ static const char *mysqld_error_message(unsigned sql_errno)
case ER_CANNOT_START_INSTANCE:
return "Cannot start instance. Possible reasons are wrong instance options"
" or resources shortage";
+ case ER_OFFSET_ERROR:
+ return "Cannot read negative number of bytes";
case ER_STOP_INSTANCE:
return "Cannot stop instance";
+ case ER_READ_FILE:
+ return "Cannot read requested part of the logfile";
case ER_NO_SUCH_LOG:
return "The instance has no such log enabled";
case ER_OPEN_LOGFILE:
diff --git a/server-tools/instance-manager/mysql_connection.cc b/server-tools/instance-manager/mysql_connection.cc
index 036d0887d18..05fb6d4e0fb 100644
--- a/server-tools/instance-manager/mysql_connection.cc
+++ b/server-tools/instance-manager/mysql_connection.cc
@@ -261,10 +261,10 @@ int Mysql_connection_thread::check_connection()
}
client_capabilities|= ((ulong) uint2korr(net.read_pos + 2)) << 16;
- pos= (char *) net.read_pos + 32;
+ pos= (char*) net.read_pos + 32;
/* At least one byte for username and one byte for password */
- if (pos >= (char *) net.read_pos + pkt_len + 2)
+ if (pos >= (char*) net.read_pos + pkt_len + 2)
{
/*TODO add user and password handling in error messages*/
net_send_error(&net, ER_HANDSHAKE_ERROR);
@@ -301,9 +301,7 @@ int Mysql_connection_thread::do_command()
{
/* Check if we can continue without closing the connection */
if (net.error != 3) // what is 3 - find out
- {
return 1;
- }
if (thread_registry.is_shutdown())
return 1;
net_send_error(&net, net.last_errno);
@@ -346,14 +344,12 @@ int Mysql_connection_thread::dispatch_command(enum enum_server_command command,
res= command->execute(&net, connection_id);
delete command;
if (!res)
- {
- log_info("query for connection %d executed ok",connection_id);
- }
+ log_info("query for connection %d executed ok",connection_id);
else
{
- log_info("query for connection %d executed err=%d",connection_id,res);
- net_send_error(&net, res);
- return 0;
+ log_info("query for connection %d executed err=%d",connection_id,res);
+ net_send_error(&net, res);
+ return 0;
}
}
else
diff --git a/server-tools/instance-manager/mysql_manager_error.h b/server-tools/instance-manager/mysql_manager_error.h
index afb9affe621..ff782923a8e 100644
--- a/server-tools/instance-manager/mysql_manager_error.h
+++ b/server-tools/instance-manager/mysql_manager_error.h
@@ -27,5 +27,7 @@
#define ER_OPEN_LOGFILE 3006
#define ER_GUESS_LOGFILE 3007
#define ER_ACCESS_OPTION_FILE 3008
+#define ER_OFFSET_ERROR 3009
+#define ER_READ_FILE 3010
#endif /* INCLUDES_MYSQL_INSTANCE_MANAGER_MYSQL_MANAGER_ERROR_H */
diff --git a/server-tools/instance-manager/mysqlmanager.cc b/server-tools/instance-manager/mysqlmanager.cc
index 262686c3fab..5a6c398614b 100644
--- a/server-tools/instance-manager/mysqlmanager.cc
+++ b/server-tools/instance-manager/mysqlmanager.cc
@@ -136,7 +136,8 @@ static struct passwd *check_user(const char *user)
{
/* Allow a numeric uid to be used */
const char *pos;
- for (pos= user; my_isdigit(default_charset_info, *pos); pos++) ;
+ for (pos= user; my_isdigit(default_charset_info, *pos); pos++)
+ {}
if (*pos) /* Not numeric id */
goto err;
if (!(user_info= getpwuid(atoi(user))))
diff --git a/server-tools/instance-manager/options.cc b/server-tools/instance-manager/options.cc
index 4568d6b578d..28899940e47 100644
--- a/server-tools/instance-manager/options.cc
+++ b/server-tools/instance-manager/options.cc
@@ -158,7 +158,7 @@ static void passwd()
fprintf(stderr, "Creating record for new user.\n");
fprintf(stderr, "Enter user name: ");
- if (! fgets(user, sizeof(user), stdin))
+ if (!fgets(user, sizeof(user), stdin))
{
fprintf(stderr, "Unable to read user.\n");
return;
diff --git a/server-tools/instance-manager/parse.cc b/server-tools/instance-manager/parse.cc
index 8af7c88ece2..fae69375b61 100644
--- a/server-tools/instance-manager/parse.cc
+++ b/server-tools/instance-manager/parse.cc
@@ -198,9 +198,7 @@ Command *parse_command(Command_factory *factory, const char *text)
/* should be empty */
get_word(&text, &word_len);
if (word_len)
- {
goto syntax_error;
- }
if (skip)
command= factory->new_Unset_option(instance_name, instance_name_len,
@@ -330,44 +328,3 @@ syntax_error:
}
return command;
}
-
-/* additional parse function, needed to parse */
-
-/* create an array of strings from the output, starting from "word" */
-int parse_arguments(const char *command, const char *word, char *result,
- int max_result_cardinality, size_t option_len)
-{
- int wordlen;
- int i= 0; /* result array index */
- /* should be enough to store the string from the output */
- enum { MAX_LINE_LEN= 4096 };
- char linebuf[MAX_LINE_LEN];
-
- wordlen= strlen(word);
-
- uint lineword_len= 0;
- const char *linep= command;
- get_word((const char **) &linep, &lineword_len, NONSPACE);
- while ((*linep != '\0') && (i < max_result_cardinality))
- {
- if (!strncmp(word, linep, wordlen))
- {
- strncpy(result + i*option_len, linep, lineword_len);
- *(result + i*option_len + lineword_len)= '\0';
- linep+= lineword_len;
- i++;
- }
- else
- linep+= lineword_len;
- get_word((const char **) &linep, &lineword_len, NONSPACE);
-
- /* stop if we've filled the array */
- if (i >= max_result_cardinality)
- break;
- }
-
-
- return 0;
-}
-
-
diff --git a/server-tools/instance-manager/parse.h b/server-tools/instance-manager/parse.h
index f03ef4c8a00..0cfa33723c9 100644
--- a/server-tools/instance-manager/parse.h
+++ b/server-tools/instance-manager/parse.h
@@ -31,9 +31,6 @@ enum Log_type
Command *parse_command(Command_factory *factory, const char *text);
-int parse_arguments(const char *command, const char *word, char *result,
- int max_result_cardinality, size_t option_len);
-
/* define kinds of the word seek method */
enum { ALPHANUM= 1, NONSPACE };
diff --git a/server-tools/instance-manager/protocol.cc b/server-tools/instance-manager/protocol.cc
index f0928743716..62de48d0619 100644
--- a/server-tools/instance-manager/protocol.cc
+++ b/server-tools/instance-manager/protocol.cc
@@ -122,6 +122,7 @@ int store_to_string(Buffer *buf, const char *string, uint *position,
{
uint currpos;
+ /* reserve max amount of bytes needed to store length */
if (buf->reserve(*position, 9))
goto err;
currpos= (net_store_length(buf->buffer + *position,
@@ -175,10 +176,10 @@ int send_fields(struct st_net *net, LIST *fields)
position= 0;
field= (NAME_WITH_LENGTH *) tmp->data;
- store_to_string(&send_buff, (char *) "", &position); /* catalog name */
- store_to_string(&send_buff, (char *) "", &position); /* db name */
- store_to_string(&send_buff, (char *) "", &position); /* table name */
- store_to_string(&send_buff, (char *) "", &position); /* table name alias */
+ store_to_string(&send_buff, (char*) "", &position); /* catalog name */
+ store_to_string(&send_buff, (char*) "", &position); /* db name */
+ store_to_string(&send_buff, (char*) "", &position); /* table name */
+ store_to_string(&send_buff, (char*) "", &position); /* table name alias */
store_to_string(&send_buff, field->name, &position); /* column name */
store_to_string(&send_buff, field->name, &position); /* column name alias */
send_buff.reserve(position, 12);
diff --git a/server-tools/instance-manager/protocol.h b/server-tools/instance-manager/protocol.h
index c853fa10483..a2ed9a31889 100644
--- a/server-tools/instance-manager/protocol.h
+++ b/server-tools/instance-manager/protocol.h
@@ -25,6 +25,9 @@ typedef struct field {
uint length;
} NAME_WITH_LENGTH;
+/* default field length to be used in various field-realted functions */
+enum { DEFAULT_FIELD_LENGTH= 20 };
+
struct st_net;
int net_send_ok(struct st_net *net, unsigned long connection_id,