Merge pchardin@bk-internal.mysql.com:/home/bk/mysql-5.0

into mysql.com:/home/cps/mysql/trees/mysql-5.0
This commit is contained in:
petr@mysql.com 2005-06-22 12:41:29 +04:00
commit 71b425bedb

View file

@ -1,26 +1,18 @@
/* /* Copyright (C) 2005 MySQL AB
Add/remove option to the option file section.
SYNOPSYS This program is free software; you can redistribute it and/or modify
modify_defaults_file() it under the terms of the GNU General Public License as published by
file_location The location of configuration file to edit the Free Software Foundation; either version 2 of the License, or
option option to look for (at your option) any later version.
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 This program is distributed in the hope that it will be useful,
0 - ok but WITHOUT ANY WARRANTY; without even the implied warranty of
1 - some error has occured. Probably due to the lack of resourses MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 - cannot open the file GNU General Public License for more details.
*/
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include "my_global.h" #include "my_global.h"
#include "mysys_priv.h" #include "mysys_priv.h"
@ -40,6 +32,33 @@
static char *add_option(char *dst, const char *option_value, static char *add_option(char *dst, const char *option_value,
const char *option, int remove_option); const char *option, int remove_option);
/*
Add/remove option to the option file section.
SYNOPSYS
modify_defaults_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.
Note that there is a small time gap, when the file is incomplete,
and this theoretically might introduce a problem.
RETURN
0 - ok
1 - some error has occured. Probably due to the lack of resourses
2 - cannot open the file
*/
int modify_defaults_file(const char *file_location, const char *option, int modify_defaults_file(const char *file_location, const char *option,
const char *option_value, const char *option_value,
const char *section_name, int remove_option) const char *section_name, int remove_option)
@ -47,7 +66,7 @@ int modify_defaults_file(const char *file_location, const char *option,
FILE *cnf_file; FILE *cnf_file;
MY_STAT file_stat; MY_STAT file_stat;
char linebuff[BUFF_SIZE], *src_ptr, *dst_ptr, *file_buffer; char linebuff[BUFF_SIZE], *src_ptr, *dst_ptr, *file_buffer;
uint optlen, optval_len, sect_len, nr_newlines= 0; uint opt_len, optval_len, sect_len, nr_newlines= 0;
my_bool in_section= FALSE, opt_applied= 0; my_bool in_section= FALSE, opt_applied= 0;
DBUG_ENTER("modify_defaults_file"); DBUG_ENTER("modify_defaults_file");
@ -58,7 +77,7 @@ int modify_defaults_file(const char *file_location, const char *option,
if (my_fstat(fileno(cnf_file), &file_stat, MYF(0))) if (my_fstat(fileno(cnf_file), &file_stat, MYF(0)))
goto err; goto err;
optlen= (uint) strlen(option); opt_len= (uint) strlen(option);
optval_len= (uint) strlen(option_value); optval_len= (uint) strlen(option_value);
/* /*
@ -66,17 +85,18 @@ int modify_defaults_file(const char *file_location, const char *option,
for the option we want to add. for the option we want to add.
*/ */
if (!(file_buffer= (char*) my_malloc(sizeof(char) * if (!(file_buffer= (char*) my_malloc(sizeof(char) *
(file_stat.st_size + (file_stat.st_size +
/* option name len */ /* option name len */
optlen + opt_len +
/* reserve space for newline */ /* reserve space for newline */
NEWLINE_LEN + NEWLINE_LEN +
/* reserve for '=' char */ /* reserve for '=' char */
1 + 1 +
/* option value len */ /* option value len */
optval_len + optval_len +
/* The ending zero plus some safety */ /* The ending zero */
FN_REFLEN), MYF(MY_WME)))) 1), MYF(MY_WME))))
goto malloc_err; goto malloc_err;
sect_len= (uint) strlen(section_name); sect_len= (uint) strlen(section_name);
@ -94,10 +114,11 @@ int modify_defaults_file(const char *file_location, const char *option,
continue; continue;
} }
if (!opt_applied && in_section && !strncmp(src_ptr, option, optlen) && /* correct the option */
(*(src_ptr + optlen) == '=' || if (!opt_applied && in_section && !strncmp(src_ptr, option, opt_len) &&
my_isspace(&my_charset_latin1, *(src_ptr + optlen)) || (*(src_ptr + opt_len) == '=' ||
*(src_ptr + optlen) == '\0')) my_isspace(&my_charset_latin1, *(src_ptr + opt_len)) ||
*(src_ptr + opt_len) == '\0'))
{ {
dst_ptr= add_option(dst_ptr, option_value, option, remove_option); dst_ptr= add_option(dst_ptr, option_value, option, remove_option);
opt_applied= 1; opt_applied= 1;
@ -107,11 +128,12 @@ int modify_defaults_file(const char *file_location, const char *option,
/* If going to new group and we have option to apply, do it now */ /* If going to new group and we have option to apply, do it now */
if (in_section && !opt_applied && *src_ptr == '[') if (in_section && !opt_applied && *src_ptr == '[')
{ {
dst_ptr= add_option(dst_ptr, option_value, option, remove_option); dst_ptr= add_option(dst_ptr, option_value, option, remove_option);
opt_applied= 1; /* set the flag to do write() later */
} }
for (; nr_newlines; nr_newlines--) for (; nr_newlines; nr_newlines--)
dst_ptr= strmov(dst_ptr, NEWLINE); dst_ptr= strmov(dst_ptr, NEWLINE);
dst_ptr= strmov(dst_ptr, linebuff); dst_ptr= strmov(dst_ptr, linebuff);
} }
/* Look for a section */ /* Look for a section */
@ -120,13 +142,13 @@ int modify_defaults_file(const char *file_location, const char *option,
/* Copy the line to the buffer */ /* Copy the line to the buffer */
if (!strncmp(++src_ptr, section_name, sect_len)) if (!strncmp(++src_ptr, section_name, sect_len))
{ {
src_ptr+= sect_len; src_ptr+= sect_len;
/* Skip over whitespaces. They are allowed after section name */ /* Skip over whitespaces. They are allowed after section name */
for (; my_isspace(&my_charset_latin1, *src_ptr); src_ptr++) for (; my_isspace(&my_charset_latin1, *src_ptr); src_ptr++)
{} {}
if (*src_ptr != ']') if (*src_ptr != ']')
continue; /* Missing closing parenthesis. Assume this was no group */ continue; /* Missing closing parenthesis. Assume this was no group */
in_section= TRUE; in_section= TRUE;
} }
else else
@ -149,10 +171,10 @@ int modify_defaults_file(const char *file_location, const char *option,
{ {
/* Don't write the file if there are no changes to be made */ /* Don't write the file if there are no changes to be made */
if (my_chsize(fileno(cnf_file), (my_off_t) (dst_ptr - file_buffer), 0, if (my_chsize(fileno(cnf_file), (my_off_t) (dst_ptr - file_buffer), 0,
MYF(MY_WME)) || MYF(MY_WME)) ||
my_fseek(cnf_file, 0, MY_SEEK_SET, MYF(0)) || my_fseek(cnf_file, 0, MY_SEEK_SET, MYF(0)) ||
my_fwrite(cnf_file, file_buffer, (uint) (dst_ptr - file_buffer), my_fwrite(cnf_file, file_buffer, (uint) (dst_ptr - file_buffer),
MYF(MY_NABP))) MYF(MY_NABP)))
goto err; goto err;
} }
if (my_fclose(cnf_file, MYF(MY_WME))) if (my_fclose(cnf_file, MYF(MY_WME)))