static void client_disconnect(MYSQL* mysql) { static char query[MAX_TEST_QUERY_LENGTH]; myheader_r("client_disconnect"); if (mysql) { if (opt_drop_db) { if (!opt_silent) fprintf(stdout, "\n dropping the test database '%s' ...", current_db); strxmov(query, "DROP DATABASE IF EXISTS ", current_db, NullS); mysql_query(mysql, query); if (!opt_silent) fprintf(stdout, "OK"); } if (!opt_silent) fprintf(stdout, "\n closing the connection ..."); mysql_close(mysql); if (!opt_silent) fprintf(stdout, "OK\n"); } }
my_string my_load_path(my_string to, const char *path, const char *own_path_prefix) { char buff[FN_REFLEN]; int is_cur; DBUG_ENTER("my_load_path"); DBUG_PRINT("enter",("path: %s prefix: %s",path, own_path_prefix ? own_path_prefix : "")); if ((path[0] == FN_HOMELIB && path[1] == FN_LIBCHAR) || test_if_hard_path(path)) VOID(strmov(buff,path)); else if ((is_cur=(path[0] == FN_CURLIB && path[1] == FN_LIBCHAR)) || (is_prefix((gptr) path,FN_PARENTDIR)) || ! own_path_prefix) { if (is_cur) is_cur=2; /* Remove current dir */ if (! my_getwd(buff,(uint) (FN_REFLEN-strlen(path)+is_cur),MYF(0))) VOID(strcat(buff,path+is_cur)); else VOID(strmov(buff,path)); /* Return org file name */ } else VOID(strxmov(buff,own_path_prefix,path,NullS)); strmov(to,buff); DBUG_PRINT("exit",("to: %s",to)); DBUG_RETURN(to); } /* my_load_path */
static void verify_col_data(const char *table, const char *col, const char *exp_data) { static char query[MAX_TEST_QUERY_LENGTH]; MYSQL_RES *result; MYSQL_ROW row; int rc, field= 1; if (table && col) { strxmov(query, "SELECT ", col, " FROM ", table, " LIMIT 1", NullS); if (!opt_silent) fprintf(stdout, "\n %s", query); rc= mysql_query(mysql, query); myquery(rc); field= 0; } result= mysql_use_result(mysql); mytest(result); if (!(row= mysql_fetch_row(result)) || !row[field]) { fprintf(stdout, "\n *** ERROR: FAILED TO GET THE RESULT ***"); exit(1); } if (strcmp(row[field], exp_data)) { fprintf(stdout, "\n obtained: `%s` (expected: `%s`)", row[field], exp_data); DIE_UNLESS(FALSE); } mysql_free_result(result); }
void SERVER_CONNECTION_CNF::set_server_version() { char *end = strxmov(this->server_version, MYSQL_SERVER_VERSION, "", NullS); if (!strstr("", "-debug")) { end = strmov(end, "-debug"); } strmov(end, "-log"); return; }
char *get_charsets_dir(char *buf) { const char *sharedir= SHAREDIR; char *res; DBUG_ENTER("get_charsets_dir"); if (charsets_dir != NULL) strmake(buf, charsets_dir, FN_REFLEN-1); else { if (test_if_hard_path(sharedir) || is_prefix(sharedir, DEFAULT_CHARSET_HOME)) strxmov(buf, sharedir, "/", CHARSET_DIR, NullS); else strxmov(buf, DEFAULT_CHARSET_HOME, "/", sharedir, "/", CHARSET_DIR, NullS); } res= convert_dirname(buf,buf,NullS); DBUG_PRINT("info",("charsets dir: '%s'", buf)); DBUG_RETURN(res); }
int myrg_create(const char *name, const char **table_names, uint insert_method, my_bool fix_names) { int save_errno; uint errpos; File file; char buff[FN_REFLEN],*end; DBUG_ENTER("myrg_create"); errpos=0; if ((file= mysql_file_create(rg_key_file_MRG, fn_format(buff, name, "", MYRG_NAME_EXT, MY_UNPACK_FILENAME|MY_APPEND_EXT), 0, O_RDWR | O_EXCL | O_NOFOLLOW, MYF(MY_WME))) < 0) goto err; errpos=1; if (table_names) { for ( ; *table_names ; table_names++) { my_stpcpy(buff,*table_names); if (fix_names) fn_same(buff,name,4); *(end=strend(buff))='\n'; end[1]=0; if (mysql_file_write(file, (uchar*) buff, (uint) (end-buff+1), MYF(MY_WME | MY_NABP))) goto err; } } if (insert_method != MERGE_INSERT_DISABLED) { end=strxmov(buff,"#INSERT_METHOD=", get_type(&merge_insert_method,insert_method-1),"\n",NullS); if (mysql_file_write(file, (uchar*) buff, (uint) (end-buff), MYF(MY_WME | MY_NABP))) goto err; } if (mysql_file_close(file, MYF(0))) goto err; DBUG_RETURN(0); err: save_errno=my_errno() ? my_errno() : -1; switch (errpos) { case 1: (void) mysql_file_close(file, MYF(0)); } set_my_errno(save_errno); DBUG_RETURN(save_errno); } /* myrg_create */
/* Open HKEY_LOCAL_MACHINE\SOFTWARE\MySQL and set any strings found there as environment variables */ static void win_init_registry(void) { HKEY key_handle; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)"SOFTWARE\\MySQL", 0, KEY_READ, &key_handle) == ERROR_SUCCESS) { LONG ret; DWORD index= 0; DWORD type; char key_name[256], key_data[1024]; DWORD key_name_len= sizeof(key_name) - 1; DWORD key_data_len= sizeof(key_data) - 1; while ((ret= RegEnumValue(key_handle, index++, key_name, &key_name_len, NULL, &type, (LPBYTE)&key_data, &key_data_len)) != ERROR_NO_MORE_ITEMS) { char env_string[sizeof(key_name) + sizeof(key_data) + 2]; if (ret == ERROR_MORE_DATA) { /* Registry value larger than 'key_data', skip it */ DBUG_PRINT("error", ("Skipped registry value that was too large")); } else if (ret == ERROR_SUCCESS) { if (type == REG_SZ) { strxmov(env_string, key_name, "=", key_data, NullS); /* variable for putenv must be allocated ! */ putenv(strdup(env_string)) ; } } else { /* Unhandled error, break out of loop */ break; } key_name_len= sizeof(key_name) - 1; key_data_len= sizeof(key_data) - 1; } RegCloseKey(key_handle); } }
void print_defaults(const char *conf_file, const char **groups) { #ifdef _WIN32 bool have_ext=fn_ext(conf_file)[0] != 0; #endif char name[FN_REFLEN]; const char **dirs; puts("\nDefault options are read from the following files in the given order:"); if (dirname_length(conf_file)) fputs(conf_file,stdout); else { #ifdef _WIN32 GetWindowsDirectory(name,sizeof(name)); printf("%s\\%s%s ",name,conf_file,have_ext ? "" : windows_ext); #endif #if defined(__EMX__) || defined(OS2) if (getenv("ETC")) printf("%s\\%s%s ", getenv("ETC"), conf_file, default_ext); #endif for (dirs=default_directories ; *dirs; dirs++) { if (**dirs) strmov(name,*dirs); else if (defaults_extra_file) strmov(name,defaults_extra_file); else continue; convert_dirname(name); if (name[0] == FN_HOMELIB) /* Add . to filenames in home */ strcat(name,"."); strxmov(strend(name),conf_file,default_ext," ",NullS); fputs(name,stdout); } puts(""); } fputs("The following groups are read:",stdout); for ( ; *groups ; groups++) { fputc(' ',stdout); fputs(*groups,stdout); } puts("\nThe following options may be given as the first argument:\n\ --print-defaults Print the program argument list and exit\n\ --no-defaults Don't read default options from any options file\n\ --defaults-file=# Only read default options from the given file #\n\ --defaults-extra-file=# Read this file after the global files are read"); }
static char *find_file_in_path(char *to, const char *name) { char *path,*pos,dir[2]; const char *ext=""; if (!(path=getenv("PATH"))) return NullS; dir[0]=FN_LIBCHAR; dir[1]=0; #ifdef PROGRAM_EXTENSION if (!fn_ext(name)[0]) ext=PROGRAM_EXTENSION; #endif for (pos=path ; (pos=strchr(pos,PATH_SEP)) ; path= ++pos) { if (path != pos) { strxmov(strnmov(to,path,(uint) (pos-path)),dir,name,ext,NullS); if (!access(to,F_OK)) { to[(uint) (pos-path)+1]=0; /* Return path only */ return to; } } } #ifdef __WIN__ to[0]=FN_CURLIB; strxmov(to+1,dir,name,ext,NullS); if (!access(to,F_OK)) /* Test in current dir */ { to[2]=0; /* Leave ".\" */ return to; } #endif return NullS; /* File not found */ }
void my_print_default_files(const char *conf_file) { const char *empty_list[]= { "", 0 }; my_bool have_ext= fn_ext(conf_file)[0] != 0; const char **exts_to_use= have_ext ? empty_list : f_extensions; char name[FN_REFLEN], **ext; puts("\nDefault options are read from the following files in the given order:"); if (dirname_length(conf_file)) fputs(conf_file,stdout); else { const char **dirs; MEM_ROOT alloc; init_alloc_root(&alloc, 512, 0, MYF(0)); if ((dirs= init_default_directories(&alloc)) == NULL) { fputs("Internal error initializing default directories list", stdout); } else { for ( ; *dirs; dirs++) { for (ext= (char**) exts_to_use; *ext; ext++) { const char *pos; char *end; if (**dirs) pos= *dirs; else if (my_defaults_extra_file) pos= my_defaults_extra_file; else continue; end= convert_dirname(name, pos, NullS); if (name[0] == FN_HOMELIB) /* Add . to filenames in home */ *end++= '.'; strxmov(end, conf_file, *ext, " ", NullS); fputs(name, stdout); } } } free_root(&alloc, MYF(0)); } puts(""); }
int myrg_create(const char *name, const char **table_names, uint insert_method, my_bool fix_names) { int save_errno; uint errpos; File file; char buff[FN_REFLEN],*end; DBUG_ENTER("myrg_create"); errpos=0; if ((file = my_create(fn_format(buff,name,"",MYRG_NAME_EXT,4),0, O_RDWR | O_TRUNC,MYF(MY_WME))) < 0) goto err; errpos=1; if (table_names) { for ( ; *table_names ; table_names++) { strmov(buff,*table_names); if (fix_names) fn_same(buff,name,4); *(end=strend(buff))='\n'; end[1]=0; if (my_write(file,buff,(uint) (end-buff+1), MYF(MY_WME | MY_NABP))) goto err; } } if (insert_method != MERGE_INSERT_DISABLED) { end=strxmov(buff,"#INSERT_METHOD=", get_type(&merge_insert_method,insert_method-1),"\n",NullS); if (my_write(file,buff,(uint) (end-buff),MYF(MY_WME | MY_NABP))) goto err; } if (my_close(file,MYF(0))) goto err; DBUG_RETURN(0); err: save_errno=my_errno ? my_errno : -1; switch (errpos) { case 1: VOID(my_close(file,MYF(0))); } DBUG_RETURN(my_errno=save_errno); } /* myrg_create */
static CHARSET_INFO * get_internal_charset(MY_CHARSET_LOADER *loader, uint cs_number, myf flags) { char buf[FN_REFLEN]; CHARSET_INFO *cs; DBUG_ASSERT(cs_number < array_elements(all_charsets)); if ((cs= all_charsets[cs_number])) { if (cs->state & MY_CS_READY) /* if CS is already initialized */ return cs; /* To make things thread safe we are not allowing other threads to interfere while we may changing the cs_info_table */ mysql_mutex_lock(&THR_LOCK_charset); if (!(cs->state & (MY_CS_COMPILED|MY_CS_LOADED))) /* if CS is not in memory */ { MY_CHARSET_LOADER loader; strxmov(get_charsets_dir(buf), cs->csname, ".xml", NullS); my_charset_loader_init_mysys(&loader); my_read_charset_file(&loader, buf, flags); } if (cs->state & MY_CS_AVAILABLE) { if (!(cs->state & MY_CS_READY)) { if ((cs->cset->init && cs->cset->init(cs, loader)) || (cs->coll->init && cs->coll->init(cs, loader))) { cs= NULL; } else cs->state|= MY_CS_READY; } } else cs= NULL; mysql_mutex_unlock(&THR_LOCK_charset); } return cs; }
static char *create_tmpdir(const char *progname) { static char test_dirname[FN_REFLEN]; char tmp_name[FN_REFLEN]; uint length; /* Create a temporary directory of name TMP-'executable', but without the -t extension */ fn_format(tmp_name, progname, "", "", MY_REPLACE_DIR | MY_REPLACE_EXT); length= strlen(tmp_name); if (length > 2 && tmp_name[length-2] == '-' && tmp_name[length-1] == 't') tmp_name[length-2]= 0; strxmov(test_dirname, "TMP-", tmp_name, NullS); /* Don't give an error if we can't create dir, as it may already exist from a previously aborted run */ (void) my_mkdir(test_dirname, 0777, MYF(0)); return test_dirname; }
static CHARSET_INFO *get_internal_charset(uint cs_number, myf flags) { char buf[FN_REFLEN]; CHARSET_INFO *cs; if ((cs= all_charsets[cs_number])) { if (cs->state & MY_CS_READY) /* if CS is already initialized */ return cs; /* To make things thread safe we are not allowing other threads to interfere while we may changing the cs_info_table */ pthread_mutex_lock(&THR_LOCK_charset); if (!(cs->state & (MY_CS_COMPILED|MY_CS_LOADED))) /* if CS is not in memory */ { strxmov(get_charsets_dir(buf), cs->csname, ".xml", NullS); my_read_charset_file(buf,flags); } if (cs->state & MY_CS_AVAILABLE) { if (!(cs->state & MY_CS_READY)) { if ((cs->cset->init && cs->cset->init(cs, cs_alloc)) || (cs->coll->init && cs->coll->init(cs, cs_alloc))) cs= NULL; else cs->state|= MY_CS_READY; } } else cs= NULL; pthread_mutex_unlock(&THR_LOCK_charset); } return cs; }
void my_print_default_files(const char *conf_file) { const char *empty_list[]= { "", 0 }; my_bool have_ext= fn_ext(conf_file)[0] != 0; const char **exts_to_use= have_ext ? empty_list : f_extensions; char name[FN_REFLEN], **ext; const char **dirs; init_default_directories(); puts("\nDefault options are read from the following files in the given order:"); if (dirname_length(conf_file)) fputs(conf_file,stdout); else { for (dirs=default_directories ; *dirs; dirs++) { for (ext= (char**) exts_to_use; *ext; ext++) { const char *pos; char *end; if (**dirs) pos= *dirs; else if (my_defaults_extra_file) pos= my_defaults_extra_file; else continue; end= convert_dirname(name, pos, NullS); if (name[0] == FN_HOMELIB) /* Add . to filenames in home */ *end++='.'; strxmov(end, conf_file, *ext, " ", NullS); fputs(name,stdout); } } } puts(""); }
static int create_sys_files(struct languages *lang_head, struct errors *error_head, uint row_count) { FILE *to; uint csnum= 0, length, i, row_nr; uchar head[32]; char outfile[FN_REFLEN], *outfile_end; long start_pos; struct message *tmp; struct languages *tmp_lang; struct errors *tmp_error; MY_STAT stat_info; DBUG_ENTER("create_sys_files"); /* going over all languages and assembling corresponding error messages */ for (tmp_lang= lang_head; tmp_lang; tmp_lang= tmp_lang->next_lang) { /* setting charset name */ if (!(csnum= get_charset_number(tmp_lang->charset, MY_CS_PRIMARY))) { fprintf(stderr, "Unknown charset '%s' in '%s'\n", tmp_lang->charset, TXTFILE); DBUG_RETURN(1); } outfile_end= strxmov(outfile, DATADIRECTORY, tmp_lang->lang_long_name, NullS); if (!my_stat(outfile, &stat_info,MYF(0))) { if (my_mkdir(outfile, 0777,MYF(0)) < 0) { fprintf(stderr, "Can't create output directory for %s\n", outfile); DBUG_RETURN(1); } } strxmov(outfile_end, FN_ROOTDIR, OUTFILE, NullS); if (!(to= my_fopen(outfile, O_WRONLY | FILE_BINARY, MYF(MY_WME)))) DBUG_RETURN(1); /* 4 is for 4 bytes to store row position / error message */ start_pos= (long) (HEADER_LENGTH + row_count * 4); fseek(to, start_pos, 0); row_nr= 0; for (tmp_error= error_head; tmp_error; tmp_error= tmp_error->next_error) { /* dealing with messages */ tmp= find_message(tmp_error, tmp_lang->lang_short_name, FALSE); if (!tmp) { fprintf(stderr, "Did not find message for %s neither in %s nor in default " "language\n", tmp_error->er_name, tmp_lang->lang_short_name); goto err; } if (copy_rows(to, tmp->text, row_nr, start_pos)) { fprintf(stderr, "Failed to copy rows to %s\n", outfile); goto err; } row_nr++; } /* continue with header of the errmsg.sys file */ length= ftell(to) - HEADER_LENGTH - row_count * 4; memset(head, 0, HEADER_LENGTH); memmove(head, file_head, 4); head[4]= 1; int4store(head + 6, length); int4store(head + 10, row_count); head[30]= csnum; my_fseek(to, 0l, MY_SEEK_SET, MYF(0)); if (my_fwrite(to, (uchar*) head, HEADER_LENGTH, MYF(MY_WME | MY_FNABP))) goto err; for (i= 0; i < row_count; i++) { int4store(head, file_pos[i]); if (my_fwrite(to, (uchar*) head, 4, MYF(MY_WME | MY_FNABP))) goto err; } my_fclose(to, MYF(0)); } DBUG_RETURN(0); err: my_fclose(to, MYF(0)); DBUG_RETURN(1); }
static void my_win_init(void) { DBUG_ENTER("my_win_init"); #if defined(_MSC_VER) #if _MSC_VER < 1300 /* Clear the OS system variable TZ and avoid the 100% CPU usage Only for old versions of Visual C++ */ _putenv( "TZ=" ); #endif #if _MSC_VER >= 1400 /* this is required to make crt functions return -1 appropriately */ _set_invalid_parameter_handler(my_parameter_handler); #endif #endif #ifdef __MSVC_RUNTIME_CHECKS /* Install handler to send RTC (Runtime Error Check) warnings to log file */ _RTC_SetErrorFunc(handle_rtc_failure); #endif _tzset(); /* The following is used by time functions */ #define OFFSET_TO_EPOC ((__int64) 134774 * 24 * 60 * 60 * 1000 * 1000 * 10) #define MS 10000000 { FILETIME ft; LARGE_INTEGER li, t_cnt; DBUG_ASSERT(sizeof(LARGE_INTEGER) == sizeof(query_performance_frequency)); if (QueryPerformanceFrequency((LARGE_INTEGER *)&query_performance_frequency) == 0) query_performance_frequency= 0; else { GetSystemTimeAsFileTime(&ft); li.LowPart= ft.dwLowDateTime; li.HighPart= ft.dwHighDateTime; query_performance_offset= li.QuadPart-OFFSET_TO_EPOC; QueryPerformanceCounter(&t_cnt); query_performance_offset-= (t_cnt.QuadPart / query_performance_frequency * MS + t_cnt.QuadPart % query_performance_frequency * MS / query_performance_frequency); } } { /* Open HKEY_LOCAL_MACHINE\SOFTWARE\MySQL and set any strings found there as environment variables */ HKEY key_handle; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)"SOFTWARE\\MySQL", 0, KEY_READ, &key_handle) == ERROR_SUCCESS) { LONG ret; DWORD index= 0; DWORD type; char key_name[256], key_data[1024]; DWORD key_name_len= sizeof(key_name) - 1; DWORD key_data_len= sizeof(key_data) - 1; while ((ret= RegEnumValue(key_handle, index++, key_name, &key_name_len, NULL, &type, (LPBYTE)&key_data, &key_data_len)) != ERROR_NO_MORE_ITEMS) { char env_string[sizeof(key_name) + sizeof(key_data) + 2]; if (ret == ERROR_MORE_DATA) { /* Registry value larger than 'key_data', skip it */ DBUG_PRINT("error", ("Skipped registry value that was too large")); } else if (ret == ERROR_SUCCESS) { if (type == REG_SZ) { strxmov(env_string, key_name, "=", key_data, NullS); /* variable for putenv must be allocated ! */ putenv(strdup(env_string)) ; } } else { /* Unhandled error, break out of loop */ break; } key_name_len= sizeof(key_name) - 1; key_data_len= sizeof(key_data) - 1; } RegCloseKey(key_handle) ; } } DBUG_VOID_RETURN ; }
static int search_default_file_with_ext(Process_option_func opt_handler, void *handler_ctx, const char *dir, const char *ext, const char *config_file, int recursion_level) { char name[FN_REFLEN + 10], buff[4096], curr_gr[4096], *ptr, *end, **tmp_ext; char *value, option[4096+2], tmp[FN_REFLEN]; static const char includedir_keyword[]= "includedir"; static const char include_keyword[]= "include"; const int max_recursion_level= 10; MYSQL_FILE *fp; uint line=0; my_bool found_group=0; uint i; MY_DIR *search_dir; FILEINFO *search_file; if ((dir ? strlen(dir) : 0 )+strlen(config_file) >= FN_REFLEN-3) return 0; /* Ignore wrong paths */ if (dir) { end=convert_dirname(name, dir, NullS); if (dir[0] == FN_HOMELIB) /* Add . to filenames in home */ *end++='.'; strxmov(end,config_file,ext,NullS); } else { strmov(name,config_file); } fn_format(name,name,"","",4); #if !defined(__WIN__) { MY_STAT stat_info; if (!my_stat(name,&stat_info,MYF(0))) return 1; /* Ignore world-writable regular files. This is mainly done to protect us to not read a file created by the mysqld server, but the check is still valid in most context. */ if ((stat_info.st_mode & S_IWOTH) && (stat_info.st_mode & S_IFMT) == S_IFREG) { fprintf(stderr, "Warning: World-writable config file '%s' is ignored\n", name); return 0; } } #endif if (!(fp= mysql_file_fopen(key_file_cnf, name, O_RDONLY, MYF(0)))) return 1; /* Ignore wrong files */ while (mysql_file_fgets(buff, sizeof(buff) - 1, fp)) { line++; /* Ignore comment and empty lines */ for (ptr= buff; my_isspace(&my_charset_latin1, *ptr); ptr++) {} if (*ptr == '#' || *ptr == ';' || !*ptr) continue; /* Configuration File Directives */ if (*ptr == '!') { if (recursion_level >= max_recursion_level) { for (end= ptr + strlen(ptr) - 1; my_isspace(&my_charset_latin1, *(end - 1)); end--) {} end[0]= 0; fprintf(stderr, "Warning: skipping '%s' directive as maximum include" "recursion level was reached in file %s at line %d\n", ptr, name, line); continue; } /* skip over `!' and following whitespace */ for (++ptr; my_isspace(&my_charset_latin1, ptr[0]); ptr++) {} if ((!strncmp(ptr, includedir_keyword, sizeof(includedir_keyword) - 1)) && my_isspace(&my_charset_latin1, ptr[sizeof(includedir_keyword) - 1])) { if (!(ptr= get_argument(includedir_keyword, sizeof(includedir_keyword), ptr, name, line))) goto err; if (!(search_dir= my_dir(ptr, MYF(MY_WME)))) goto err; for (i= 0; i < (uint) search_dir->number_of_files; i++) { search_file= search_dir->dir_entry + i; ext= fn_ext(search_file->name); /* check extension */ for (tmp_ext= (char**) f_extensions; *tmp_ext; tmp_ext++) { if (!strcmp(ext, *tmp_ext)) break; } if (*tmp_ext) { fn_format(tmp, search_file->name, ptr, "", MY_UNPACK_FILENAME | MY_SAFE_PATH); search_default_file_with_ext(opt_handler, handler_ctx, "", "", tmp, recursion_level + 1); } } my_dirend(search_dir); } else if ((!strncmp(ptr, include_keyword, sizeof(include_keyword) - 1)) && my_isspace(&my_charset_latin1, ptr[sizeof(include_keyword)-1])) { if (!(ptr= get_argument(include_keyword, sizeof(include_keyword), ptr, name, line))) goto err; search_default_file_with_ext(opt_handler, handler_ctx, "", "", ptr, recursion_level + 1); } continue; } if (*ptr == '[') /* Group name */ { found_group=1; if (!(end=(char *) strchr(++ptr,']'))) { fprintf(stderr, "error: Wrong group definition in config file: %s at line %d\n", name,line); goto err; } /* Remove end space */ for ( ; my_isspace(&my_charset_latin1,end[-1]) ; end--) ; end[0]=0; strmake(curr_gr, ptr, MY_MIN((size_t) (end-ptr)+1, sizeof(curr_gr)-1)); /* signal that a new group is found */ opt_handler(handler_ctx, curr_gr, NULL); continue; } if (!found_group) { fprintf(stderr, "error: Found option without preceding group in config file: %s at line: %d\n", name,line); goto err; } end= remove_end_comment(ptr); if ((value= strchr(ptr, '='))) end= value; /* Option without argument */ for ( ; my_isspace(&my_charset_latin1,end[-1]) ; end--) ; if (!value) { strmake(strmov(option,"--"),ptr, (size_t) (end-ptr)); if (opt_handler(handler_ctx, curr_gr, option)) goto err; } else { /* Remove pre- and end space */ char *value_end; for (value++ ; my_isspace(&my_charset_latin1,*value); value++) ; value_end=strend(value); /* We don't have to test for value_end >= value as we know there is an '=' before */ for ( ; my_isspace(&my_charset_latin1,value_end[-1]) ; value_end--) ; if (value_end < value) /* Empty string */ value_end=value; /* remove quotes around argument */ if ((*value == '\"' || *value == '\'') && /* First char is quote */ (value + 1 < value_end ) && /* String is longer than 1 */ *value == value_end[-1] ) /* First char is equal to last char */ { value++; value_end--; } ptr=strnmov(strmov(option,"--"),ptr,(size_t) (end-ptr)); *ptr++= '='; for ( ; value != value_end; value++) { if (*value == '\\' && value != value_end-1) { switch(*++value) { case 'n': *ptr++='\n'; break; case 't': *ptr++= '\t'; break; case 'r': *ptr++ = '\r'; break; case 'b': *ptr++ = '\b'; break; case 's': *ptr++= ' '; /* space */ break; case '\"': *ptr++= '\"'; break; case '\'': *ptr++= '\''; break; case '\\': *ptr++= '\\'; break; default: /* Unknown; Keep '\' */ *ptr++= '\\'; *ptr++= *value; break; } } else *ptr++= *value; } *ptr=0; if (opt_handler(handler_ctx, curr_gr, option)) goto err; } } mysql_file_fclose(fp, MYF(0)); return(0); err: mysql_file_fclose(fp, MYF(0)); return -1; /* Fatal error */ }
void print_defaults(const char *conf_file, const char **groups) { #ifdef __WIN__ my_bool have_ext= fn_ext(conf_file)[0] != 0; #endif char name[FN_REFLEN], **ext; const char **dirs; puts("\nDefault options are read from the following files in the given order:"); if (dirname_length(conf_file)) fputs(conf_file,stdout); else { #ifdef __WIN__ GetWindowsDirectory(name,sizeof(name)); if (!have_ext) { for (ext= (char**) f_extensions; *ext; *ext++) printf("%s\\%s%s ", name, conf_file, *ext); } else printf("%s\\%s ", name, conf_file); #endif #if defined(__EMX__) || defined(OS2) { const char *etc; if ((etc= getenv("ETC"))) { for (ext= (char**) f_extensions; *ext; *ext++) printf("%s\\%s%s ", etc, conf_file, *ext); } } #endif for (dirs=default_directories ; *dirs; dirs++) { for (ext= (char**) f_extensions; *ext; *ext++) { const char *pos; char *end; if (**dirs) pos= *dirs; else if (defaults_extra_file) pos= defaults_extra_file; else continue; end= convert_dirname(name, pos, NullS); if (name[0] == FN_HOMELIB) /* Add . to filenames in home */ *end++='.'; strxmov(end, conf_file, *ext, " ", NullS); fputs(name,stdout); } } puts(""); } fputs("The following groups are read:",stdout); for ( ; *groups ; groups++) { fputc(' ',stdout); fputs(*groups,stdout); } puts("\nThe following options may be given as the first argument:\n\ --print-defaults Print the program argument list and exit\n\ --no-defaults Don't read default options from any options file\n\ --defaults-file=# Only read default options from the given file #\n\ --defaults-extra-file=# Read this file after the global files are read"); }
void setEnvString(char *ret, const char *name, const char *value) { DBUG_ENTER("setEnvString"); strxmov(ret, name,"=",value,NullS); DBUG_VOID_RETURN ; }
static my_bool search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, const char *dir, const char *config_file, const char *ext, TYPELIB *group) { char name[FN_REFLEN+10],buff[4096],*ptr,*end,*value,*tmp; FILE *fp; uint line=0; my_bool read_values=0,found_group=0; if ((dir ? strlen(dir) : 0 )+strlen(config_file) >= FN_REFLEN-3) return 0; /* Ignore wrong paths */ if (dir) { strmov(name,dir); convert_dirname(name); if (dir[0] == FN_HOMELIB) /* Add . to filenames in home */ strcat(name,"."); strxmov(strend(name),config_file,ext,NullS); } else { strmov(name,config_file); } fn_format(name,name,"","",4); #if !defined(_WIN32) && !defined(OS2) { MY_STAT stat_info; if (!my_stat(name,&stat_info,MYF(0))) return 0; if (stat_info.st_mode & S_IWOTH) /* ignore world-writeable files */ { fprintf(stderr, "warning: World-writeable config file %s is ignored\n", name); return 0; } } #endif if (!(fp = my_fopen(fn_format(name,name,"","",4),O_RDONLY,MYF(0)))) return 0; /* Ignore wrong files */ while (fgets(buff,sizeof(buff)-1,fp)) { line++; /* Ignore comment and empty lines */ for (ptr=buff ; isspace(*ptr) ; ptr++ ) ; if (*ptr == '#' || *ptr == ';' || !*ptr) continue; if (*ptr == '[') /* Group name */ { found_group=1; if (!(end=(char *) strchr(++ptr,']'))) { fprintf(stderr, "error: Wrong group definition in config file: %s at line %d\n", name,line); goto err; } for ( ; isspace(end[-1]) ; end--) ; /* Remove end space */ end[0]=0; read_values=find_type(ptr,group,3) > 0; continue; } if (!found_group) { fprintf(stderr, "error: Found option without preceding group in config file: %s at line: %d\n", name,line); goto err; } if (!read_values) continue; if (!(end=value=strchr(ptr,'='))) end=strend(ptr); /* Option without argument */ for ( ; isspace(end[-1]) ; end--) ; if (!value) { if (!(tmp=alloc_root(alloc,(uint) (end-ptr)+3))) goto err; strmake(strmov(tmp,"--"),ptr,(uint) (end-ptr)); if (insert_dynamic(args,(gptr) &tmp)) goto err; } else { /* Remove pre- and end space */ char *value_end; for (value++ ; isspace(*value); value++) ; value_end=strend(value); for ( ; isspace(value_end[-1]) ; value_end--) ; if (value_end < value) /* Empty string */ value_end=value; if (!(tmp=alloc_root(alloc,(uint) (end-ptr)+3 + (uint) (value_end-value)+1))) goto err; if (insert_dynamic(args,(gptr) &tmp)) goto err; ptr=strnmov(strmov(tmp,"--"),ptr,(uint) (end-ptr)); *ptr++= '='; for ( ; value != value_end; value++) { if (*value == '\\' && value != value_end-1) { switch(*++value) { case 'n': *ptr++='\n'; break; case 't': *ptr++= '\t'; break; case 'r': *ptr++ = '\r'; break; case 'b': *ptr++ = '\b'; break; case 's': *ptr++= ' '; /* space */ break; case '\\': *ptr++= '\\'; break; default: /* Unknown; Keep '\' */ *ptr++= '\\'; *ptr++= *value; break; } } else *ptr++= *value; } *ptr=0; } } my_fclose(fp,MYF(0)); return(0); err: my_fclose(fp,MYF(0)); return 1; }
/** Connect to the server with options given by arguments to this application, stored in global variables opt_host, opt_user, opt_password, opt_db, opt_port and opt_unix_socket. @param flag[in] client_flag passed on to mysql_real_connect @param protocol[in] MYSQL_PROTOCOL_* to use for this connection @param auto_reconnect[in] set to 1 for auto reconnect @return pointer to initialized and connected MYSQL object */ static MYSQL* client_connect(ulong flag, uint protocol, my_bool auto_reconnect) { MYSQL* mysql; int rc; static char query[MAX_TEST_QUERY_LENGTH]; myheader_r("client_connect"); if (!opt_silent) fprintf(stdout, "\n Establishing a connection to '%s' ...", opt_host ? opt_host : ""); if (!(mysql= mysql_client_init(NULL))) { opt_silent= 0; myerror("mysql_client_init() failed"); exit(1); } /* enable local infile, in non-binary builds often disabled by default */ mysql_options(mysql, MYSQL_OPT_LOCAL_INFILE, 0); mysql_options(mysql, MYSQL_OPT_PROTOCOL, &protocol); if (opt_plugin_dir && *opt_plugin_dir) mysql_options(mysql, MYSQL_PLUGIN_DIR, opt_plugin_dir); if (opt_default_auth && *opt_default_auth) mysql_options(mysql, MYSQL_DEFAULT_AUTH, opt_default_auth); if (!(mysql_real_connect(mysql, opt_host, opt_user, opt_password, opt_db ? opt_db:"test", opt_port, opt_unix_socket, flag))) { opt_silent= 0; myerror("connection failed"); mysql_close(mysql); fprintf(stdout, "\n Check the connection options using --help or -?\n"); exit(1); } mysql->reconnect= auto_reconnect; if (!opt_silent) fprintf(stdout, "OK"); /* set AUTOCOMMIT to ON*/ mysql_autocommit(mysql, TRUE); if (!opt_silent) { fprintf(stdout, "\nConnected to MySQL server version: %s (%lu)\n", mysql_get_server_info(mysql), (ulong) mysql_get_server_version(mysql)); fprintf(stdout, "\n Creating a test database '%s' ...", current_db); } strxmov(query, "CREATE DATABASE IF NOT EXISTS ", current_db, NullS); rc= mysql_query(mysql, query); myquery(rc); strxmov(query, "USE ", current_db, NullS); rc= mysql_query(mysql, query); myquery(rc); have_innodb= check_have_innodb(mysql); if (!opt_silent) fprintf(stdout, "OK"); return mysql; }