diff options
author | unknown <petr@mysql.com> | 2005-05-16 03:01:05 +0400 |
---|---|---|
committer | unknown <petr@mysql.com> | 2005-05-16 03:01:05 +0400 |
commit | f53de71f7ea704ade7b4509a506f889eda3541b4 (patch) | |
tree | 56d4f80052ccf888c59433be52b8ea30b5a79fb1 /mysys | |
parent | 8a9ed2328c67a9b294a8f8d64ecc1fc5a7c2df6e (diff) | |
parent | 7317af46f64322ccb35f2487258c886f58997fc1 (diff) | |
download | mariadb-git-f53de71f7ea704ade7b4509a506f889eda3541b4.tar.gz |
Merge
include/my_sys.h:
Auto merged
libmysql/Makefile.shared:
Auto merged
mysys/default.c:
SCCS merged
Diffstat (limited to 'mysys')
-rw-r--r-- | mysys/default.c | 138 | ||||
-rw-r--r-- | mysys/my_chsize.c | 4 |
2 files changed, 141 insertions, 1 deletions
diff --git a/mysys/default.c b/mysys/default.c index d35eb399b80..a680915b6d5 100644 --- a/mysys/default.c +++ b/mysys/default.c @@ -50,9 +50,11 @@ const char *default_directories[MAX_DEFAULT_DIRS + 1]; #ifdef __WIN__ static const char *f_extensions[]= { ".ini", ".cnf", 0 }; +#define NEWLINE "\r\n" static char system_dir[FN_REFLEN], shared_system_dir[FN_REFLEN]; #else static const char *f_extensions[]= { ".cnf", 0 }; +#define NEWLINE "\n" #endif /* @@ -79,6 +81,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 |