mysqld.cc 224 KB
Newer Older
unknown's avatar
unknown committed
1
/* Copyright (C) 2000-2003 MySQL AB
2

unknown's avatar
unknown committed
3 4 5 6
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
7

unknown's avatar
unknown committed
8 9 10 11
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
12

unknown's avatar
unknown committed
13 14 15 16 17 18
   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 "mysql_priv.h"
#include <m_ctype.h>
19
#include <my_dir.h>
unknown's avatar
unknown committed
20
#include "sql_acl.h"
21
#include "slave.h"
22
#include "sql_repl.h"
23
#include "repl_failsafe.h"
unknown's avatar
unknown committed
24
#include "stacktrace.h"
25
#include "mysqld_suffix.h"
unknown's avatar
unknown committed
26 27 28
#ifdef HAVE_BERKELEY_DB
#include "ha_berkeley.h"
#endif
29
#ifdef HAVE_INNOBASE_DB
30
#include "ha_innodb.h"
31
#endif
unknown's avatar
unknown committed
32
#include "ha_myisam.h"
33 34 35
#ifdef HAVE_ISAM
#include "ha_isam.h"
#endif
unknown's avatar
unknown committed
36 37 38
#ifdef HAVE_NDBCLUSTER_DB
#include "ha_ndbcluster.h"
#endif
unknown's avatar
unknown committed
39 40 41
#include <nisam.h>
#include <thr_alarm.h>
#include <ft_global.h>
42
#include <errmsg.h>
unknown's avatar
unknown committed
43

unknown's avatar
unknown committed
44
#define mysqld_charset &my_charset_latin1
unknown's avatar
unknown committed
45

46 47 48 49
#ifndef DBUG_OFF
#define ONE_THREAD
#endif

unknown's avatar
unknown committed
50
#ifdef HAVE_purify
51 52 53 54 55
#define IF_PURIFY(A,B) (A)
#else
#define IF_PURIFY(A,B) (B)
#endif

unknown's avatar
unknown committed
56 57 58 59
#ifndef INADDR_NONE
#define INADDR_NONE -1				// Error value from inet_addr
#endif

60
/* stack traces are only supported on linux intel */
61 62 63 64 65 66
#if defined(__linux__)  && defined(__i386__) && defined(USE_PSTACK)
#define	HAVE_STACK_TRACE_ON_SEGV
#include "../pstack/pstack.h"
char pstack_file_name[80];
#endif /* __linux__ */

67 68 69
/* We have HAVE_purify below as this speeds up the shutdown of MySQL */

#if defined(HAVE_DEC_3_2_THREADS) || defined(SIGNALS_DONT_BREAK_READ) || defined(HAVE_purify) && defined(__linux__)
unknown's avatar
unknown committed
70
#define HAVE_CLOSE_SERVER_SOCK 1
71
#endif
unknown's avatar
unknown committed
72

unknown's avatar
unknown committed
73 74 75 76
extern "C" {					// Because of SCO 3.2V4.2
#include <errno.h>
#include <sys/stat.h>
#ifndef __GNU_LIBRARY__
77
#define __GNU_LIBRARY__				// Skip warnings in getopt.h
unknown's avatar
unknown committed
78
#endif
79
#include <my_getopt.h>
unknown's avatar
unknown committed
80 81 82 83 84 85 86 87 88 89
#ifdef HAVE_SYSENT_H
#include <sysent.h>
#endif
#ifdef HAVE_PWD_H
#include <pwd.h>				// For getpwent
#endif
#ifdef HAVE_GRP_H
#include <grp.h>
#endif

unknown's avatar
unknown committed
90 91 92
#if defined(OS2)
#  include <sys/un.h>
#elif !defined( __WIN__)
unknown's avatar
unknown committed
93
#  ifndef __NETWARE__
unknown's avatar
unknown committed
94
#include <sys/resource.h>
unknown's avatar
unknown committed
95
#  endif /* __NETWARE__ */
unknown's avatar
unknown committed
96 97 98 99 100 101 102 103 104 105 106
#ifdef HAVE_SYS_UN_H
#  include <sys/un.h>
#endif
#include <netdb.h>
#ifdef HAVE_SELECT_H
#  include <select.h>
#endif
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
#include <sys/utsname.h>
unknown's avatar
unknown committed
107
#endif /* __WIN__ */
unknown's avatar
unknown committed
108 109 110 111 112 113 114 115 116

#ifdef HAVE_LIBWRAP
#include <tcpd.h>
#include <syslog.h>
#ifdef NEED_SYS_SYSLOG_H
#include <sys/syslog.h>
#endif /* NEED_SYS_SYSLOG_H */
int allow_severity = LOG_INFO;
int deny_severity = LOG_WARNING;
117

118
#ifdef __STDC__
119 120 121
#define my_fromhost(A)	   fromhost(A)
#define my_hosts_access(A) hosts_access(A)
#define my_eval_client(A)  eval_client(A)
122 123 124 125
#else
#define my_fromhost(A)	   fromhost()
#define my_hosts_access(A) hosts_access()
#define my_eval_client(A)  eval_client()
unknown's avatar
unknown committed
126
#endif /* __STDC__ */
unknown's avatar
unknown committed
127 128
#endif /* HAVE_LIBWRAP */

129 130 131 132
#ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h>
#endif

unknown's avatar
unknown committed
133 134 135 136
#ifdef __NETWARE__
#include <nks/vm.h>
#include <library.h>
#include <monitor.h>
unknown's avatar
unknown committed
137 138 139 140 141 142
#include <zOmni.h>                              //For NEB
#include <neb.h>                                //For NEB
#include <nebpub.h>                             //For NEB
#include <zEvent.h>                             //For NSS event structures
#include <zPublics.h>

143 144 145
static void *neb_consumer_id= NULL;             //For storing NEB consumer id
static char datavolname[256]= {0};
static VolumeID_t datavolid;
unknown's avatar
unknown committed
146 147
static event_handle_t eh;
static Report_t ref;
148 149
static void *refneb= NULL;
static int volumeid= -1;
unknown's avatar
unknown committed
150 151 152

  /* NEB event callback */
unsigned long neb_event_callback(struct EventBlock *eblock);
153 154 155
static void registerwithneb();
static void getvolumename();
static void getvolumeID(BYTE *volumeName);
unknown's avatar
unknown committed
156
#endif /* __NETWARE__ */
157
  
unknown's avatar
unknown committed
158

unknown's avatar
unknown committed
159
#ifdef _AIX41
unknown's avatar
unknown committed
160
int initgroups(const char *,unsigned int);
unknown's avatar
unknown committed
161 162
#endif

unknown's avatar
unknown committed
163 164 165 166 167 168
#if defined(__FreeBSD__) && defined(HAVE_IEEEFP_H)
#include <ieeefp.h>
#ifdef HAVE_FP_EXCEPT				// Fix type conflict
typedef fp_except fp_except_t;
#endif

unknown's avatar
unknown committed
169
  /* We can't handle floating point exceptions with threads, so disable
unknown's avatar
unknown committed
170 171 172 173 174 175
     this on freebsd
  */

inline void reset_floating_point_exceptions()
{
  /* Don't fall for overflow, underflow,divide-by-zero or loss of precision */
unknown's avatar
unknown committed
176 177 178
#if defined(__i386__)
  fpsetmask(~(FP_X_INV | FP_X_DNML | FP_X_OFL | FP_X_UFL | FP_X_DZ |
	      FP_X_IMP));
unknown's avatar
unknown committed
179
#else
unknown's avatar
unknown committed
180 181 182
 fpsetmask(~(FP_X_INV |             FP_X_OFL | FP_X_UFL | FP_X_DZ |
	     FP_X_IMP));
#endif
unknown's avatar
unknown committed
183 184 185 186 187
}
#else
#define reset_floating_point_exceptions()
#endif /* __FreeBSD__ && HAVE_IEEEFP_H */

unknown's avatar
unknown committed
188 189
} /* cplusplus */

unknown's avatar
unknown committed
190 191 192 193 194 195

#if defined(HAVE_LINUXTHREADS)
#define THR_KILL_SIGNAL SIGINT
#else
#define THR_KILL_SIGNAL SIGUSR2		// Can't use this with LinuxThreads
#endif
unknown's avatar
unknown committed
196
#define MYSQL_KILL_SIGNAL SIGTERM
unknown's avatar
unknown committed
197 198 199 200 201 202 203 204 205 206 207

#ifdef HAVE_GLIBC2_STYLE_GETHOSTBYNAME_R
#include <sys/types.h>
#else
#include <my_pthread.h>			// For thr_setconcurency()
#endif

#ifdef SOLARIS
extern "C" int gethostname(char *name, int namelen);
#endif

208

unknown's avatar
unknown committed
209
/* Constants */
210

unknown's avatar
unknown committed
211 212 213 214
const char *show_comp_option_name[]= {"YES", "NO", "DISABLED"};
const char *sql_mode_names[] =
{
  "REAL_AS_FLOAT", "PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE",
215
  "?", "ONLY_FULL_GROUP_BY", "NO_UNSIGNED_SUBTRACTION",
unknown's avatar
unknown committed
216
  "NO_DIR_IN_CREATE",
217
  "POSTGRESQL", "ORACLE", "MSSQL", "DB2", "MAXDB", "NO_KEY_OPTIONS",
218
  "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS", "MYSQL323", "MYSQL40", "ANSI",
219
  "NO_AUTO_VALUE_ON_ZERO", NullS
unknown's avatar
unknown committed
220 221 222 223
};
TYPELIB sql_mode_typelib= { array_elements(sql_mode_names)-1,"",
			    sql_mode_names };
const char *first_keyword= "first", *binary_keyword= "BINARY";
unknown's avatar
SCRUM:  
unknown committed
224
const char *my_localhost= "localhost", *delayed_user= "DELAYED";
225 226 227 228 229 230
#if SIZEOF_OFF_T > 4 && defined(BIG_TABLES)
#define GET_HA_ROWS GET_ULL
#else
#define GET_HA_ROWS GET_ULONG
#endif

unknown's avatar
unknown committed
231
bool opt_large_files= sizeof(my_off_t) > 4;
232 233 234 235

/*
  Used with --help for detailed option
*/
236
bool opt_help= 0;
237 238
bool opt_verbose= 0;

unknown's avatar
unknown committed
239
arg_cmp_func Arg_comparator::comparator_matrix[4][2] =
240 241 242 243
{{&Arg_comparator::compare_string,     &Arg_comparator::compare_e_string},
 {&Arg_comparator::compare_real,       &Arg_comparator::compare_e_real},
 {&Arg_comparator::compare_int_signed, &Arg_comparator::compare_e_int},
 {&Arg_comparator::compare_row,        &Arg_comparator::compare_e_row}};
unknown's avatar
unknown committed
244

unknown's avatar
unknown committed
245

unknown's avatar
unknown committed
246
/* Global variables */
unknown's avatar
unknown committed
247 248

bool opt_log, opt_update_log, opt_bin_log, opt_slow_log;
249
bool opt_error_log= IF_WIN(1,0);
unknown's avatar
unknown committed
250
bool opt_disable_networking=0, opt_skip_show_db=0;
251
bool lower_case_table_names_used= 0;
unknown's avatar
unknown committed
252 253 254 255 256 257 258 259
bool server_id_supplied = 0;
bool opt_endinfo,using_udf_functions, locked_in_memory;
bool opt_using_transactions, using_update_log;
bool volatile abort_loop, select_thread_in_use, signal_thread_in_use;
bool volatile ready_to_exit, shutdown_in_progress, grant_option;

my_bool opt_skip_slave_start = 0; // If set, slave is not autostarted
my_bool opt_reckless_slave = 0;
260
my_bool opt_enable_named_pipe= 0, opt_debugging= 0;
261
my_bool opt_local_infile, opt_external_locking, opt_slave_compressed_protocol;
262 263
my_bool opt_safe_user_create = 0, opt_no_mix_types = 0;
my_bool opt_show_slave_auth_info, opt_sql_bin_update = 0;
264
my_bool opt_log_slave_updates= 0;
unknown's avatar
unknown committed
265
my_bool	opt_console= 0, opt_bdb, opt_innodb, opt_isam, opt_ndbcluster;
unknown's avatar
unknown committed
266
my_bool opt_readonly, use_temp_pool, relay_log_purge;
unknown's avatar
unknown committed
267
my_bool opt_sync_bdb_logs, opt_sync_frm;
268
my_bool opt_secure_auth= 0;
269 270
my_bool opt_short_log_format= 0;
my_bool opt_log_queries_not_using_indexes= 0;
unknown's avatar
unknown committed
271
my_bool lower_case_file_system= 0;
272
my_bool opt_innodb_safe_binlog= 0;
unknown's avatar
unknown committed
273
volatile bool mqh_used = 0;
274

275
uint mysqld_port, test_flags, select_errors, dropping_tables, ha_open_options;
unknown's avatar
unknown committed
276
uint delay_key_write_options, protocol_version;
unknown's avatar
unknown committed
277
uint lower_case_table_names;
unknown's avatar
unknown committed
278
uint opt_crash_binlog_innodb;
unknown's avatar
unknown committed
279
uint volatile thread_count, thread_running, kill_cached_threads, wake_thread;
unknown's avatar
unknown committed
280

unknown's avatar
unknown committed
281 282 283 284
ulong back_log, connect_timeout, concurrency;
ulong server_id, thd_startup_options;
ulong table_cache_size, thread_stack, thread_stack_min, what_to_log;
ulong query_buff_size, slow_launch_time, slave_open_temp_tables;
unknown's avatar
unknown committed
285
ulong open_files_limit, max_binlog_size, max_relay_log_size;
unknown's avatar
unknown committed
286
ulong slave_net_timeout;
287
ulong thread_cache_size=0, binlog_cache_size=0, max_binlog_cache_size=0;
288
ulong query_cache_size=0;
unknown's avatar
unknown committed
289
ulong com_stat[(uint) SQLCOM_END], com_other;
unknown's avatar
unknown committed
290
ulong bytes_sent, bytes_received, net_big_packet_count;
unknown's avatar
unknown committed
291 292 293
ulong refresh_version, flush_version;	/* Increments on each reload */
ulong query_id, long_query_count;
ulong aborted_threads, killed_threads, aborted_connects;
unknown's avatar
unknown committed
294 295 296
ulong delayed_insert_timeout, delayed_insert_limit, delayed_queue_size;
ulong delayed_insert_threads, delayed_insert_writes, delayed_rows_in_use;
ulong delayed_insert_errors,flush_time, thread_created;
297
ulong filesort_rows, filesort_range_count, filesort_scan_count;
298
ulong filesort_merge_passes;
299 300
ulong select_range_check_count, select_range_count, select_scan_count;
ulong select_full_range_join_count,select_full_join_count;
301 302
ulong specialflag=0,opened_tables=0,created_tmp_tables=0,
      created_tmp_disk_tables=0;
303
ulong binlog_cache_use= 0, binlog_cache_disk_use= 0;
unknown's avatar
unknown committed
304
ulong max_connections,max_used_connections,
unknown's avatar
unknown committed
305
      max_connect_errors, max_user_connections = 0;
unknown's avatar
unknown committed
306
ulong thread_id=1L,current_pid;
307
ulong slow_launch_threads = 0, sync_binlog_period;
unknown's avatar
unknown committed
308
ulong expire_logs_days = 0;
unknown's avatar
unknown committed
309 310 311 312 313 314
ulong rpl_recovery_rank=0;
ulong my_bind_addr;			/* the address we bind to */
volatile ulong cached_thread_count= 0;

double log_10[32];			/* 10 potences */
time_t start_time;
315

316 317
char mysql_home[FN_REFLEN], pidfile_name[FN_REFLEN], system_time_zone[30];
char *default_tz_name;
unknown's avatar
unknown committed
318 319
char log_error_file[FN_REFLEN], glob_hostname[FN_REFLEN];
char* log_error_file_ptr= log_error_file;
unknown's avatar
unknown committed
320
char mysql_real_data_home[FN_REFLEN],
unknown's avatar
merge  
unknown committed
321
     language[LIBLEN],reg_ext[FN_EXTLEN], mysql_charsets_dir[FN_REFLEN],
322
     *mysqld_user,*mysqld_chroot, *opt_init_file,
unknown's avatar
unknown committed
323
     *opt_init_connect, *opt_init_slave,
324
     def_ft_boolean_syntax[sizeof(ft_boolean_syntax)];
325

326
const char *opt_date_time_formats[3];
327

328
char *language_ptr, *default_collation_name, *default_character_set_name;
unknown's avatar
unknown committed
329
char mysql_data_home_buff[2], *mysql_data_home=mysql_real_data_home;
330
char server_version[SERVER_VERSION_LENGTH];
331
char *mysqld_unix_port, *opt_mysql_tmpdir;
unknown's avatar
unknown committed
332
char *my_bind_addr_str;
unknown's avatar
unknown committed
333
const char **errmesg;			/* Error messages */
334
const char *myisam_recover_options_str="OFF";
335
const char *sql_mode_str="OFF";
336 337
/* name of reference on left espression in rewritten IN subquery */
const char *in_left_expr_name= "<left expr>";
338 339
/* name of additional condition */
const char *in_additional_cond= "<IN COND>";
unknown's avatar
unknown committed
340 341 342 343 344 345 346 347
/* classes for comparation parsing/processing */
Eq_creator eq_creator;
Ne_creator ne_creator;
Gt_creator gt_creator;
Lt_creator lt_creator;
Ge_creator ge_creator;
Le_creator le_creator;

348

unknown's avatar
unknown committed
349 350
FILE *bootstrap_file;

351
I_List<i_string_pair> replicate_rewrite_db;
unknown's avatar
unknown committed
352 353 354
I_List<i_string> replicate_do_db, replicate_ignore_db;
// allow the user to tell us which db to replicate and which to ignore
I_List<i_string> binlog_do_db, binlog_ignore_db;
unknown's avatar
unknown committed
355
I_List<THD> threads,thread_cache;
356
I_List<NAMED_LIST> key_caches;
unknown's avatar
unknown committed
357

unknown's avatar
unknown committed
358 359
struct system_variables global_system_variables;
struct system_variables max_system_variables;
unknown's avatar
unknown committed
360

unknown's avatar
unknown committed
361
MY_TMPDIR mysql_tmpdir_list;
362
MY_BITMAP temp_pool;
unknown's avatar
unknown committed
363
KEY_CACHE *sql_key_cache;
unknown's avatar
unknown committed
364

365 366 367
CHARSET_INFO *system_charset_info, *files_charset_info ;
CHARSET_INFO *national_charset_info, *table_alias_charset;

unknown's avatar
unknown committed
368
SHOW_COMP_OPTION have_berkeley_db, have_innodb, have_isam, have_ndbcluster, 
369
  have_example_db, have_archive_db, have_csv_db;
unknown's avatar
unknown committed
370
SHOW_COMP_OPTION have_raid, have_openssl, have_symlink, have_query_cache;
371
SHOW_COMP_OPTION have_geometry, have_rtree_keys;
unknown's avatar
unknown committed
372 373 374
SHOW_COMP_OPTION have_crypt, have_compress;

/* Thread specific variables */
375

unknown's avatar
unknown committed
376 377 378
pthread_key(MEM_ROOT*,THR_MALLOC);
pthread_key(THD*, THR_THD);
pthread_mutex_t LOCK_mysql_create_db, LOCK_Acl, LOCK_open, LOCK_thread_count,
379
		LOCK_mapped_file, LOCK_status,
unknown's avatar
unknown committed
380
		LOCK_error_log, LOCK_uuid_generator,
unknown's avatar
unknown committed
381
		LOCK_delayed_insert, LOCK_delayed_status, LOCK_delayed_create,
382
		LOCK_crypt, LOCK_bytes_sent, LOCK_bytes_received,
383
	        LOCK_global_system_variables,
384
		LOCK_user_conn, LOCK_slave_list, LOCK_active_mi;
unknown's avatar
unknown committed
385
rw_lock_t	LOCK_grant, LOCK_sys_init_connect, LOCK_sys_init_slave;
unknown's avatar
unknown committed
386 387
pthread_cond_t COND_refresh,COND_thread_count, COND_slave_stopped,
	       COND_slave_start;
unknown's avatar
unknown committed
388 389 390 391
pthread_cond_t COND_thread_cache,COND_flush_thread_cache;
pthread_t signal_thread;
pthread_attr_t connection_attrib;

unknown's avatar
unknown committed
392 393 394 395 396
/* replication parameters, if master_host is not NULL, we are a slave */
uint master_port= MYSQL_PORT, master_connect_retry = 60;
uint report_port= MYSQL_PORT;
ulong master_retry_count=0;
char *master_user, *master_password, *master_host, *master_info_file;
unknown's avatar
unknown committed
397
char *relay_log_info_file, *report_user, *report_password, *report_host;
unknown's avatar
unknown committed
398
char *opt_relay_logname = 0, *opt_relaylog_index_name=0;
unknown's avatar
unknown committed
399 400 401
my_bool master_ssl;
char *master_ssl_key, *master_ssl_cert;
char *master_ssl_ca, *master_ssl_capath, *master_ssl_cipher;
unknown's avatar
unknown committed
402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420

/* Static variables */

static bool kill_in_progress, segfaulted;
static my_bool opt_do_pstack, opt_noacl, opt_bootstrap, opt_myisam_log;
static int cleanup_done;
static ulong opt_specialflag, opt_myisam_block_size;
static char *opt_logname, *opt_update_logname, *opt_binlog_index_name;
static char *opt_slow_logname;
static char *mysql_home_ptr, *pidfile_name_ptr;
static char **defaults_argv;
static char *opt_bin_logname;

static my_socket unix_sock,ip_sock;
static pthread_t select_thread;
struct rand_struct sql_rand; // used by sql_class.cc:THD::THD()

/* OS specific variables */

unknown's avatar
unknown committed
421 422 423
#ifdef __WIN__
#undef	 getpid
#include <process.h>
unknown's avatar
unknown committed
424 425 426 427 428 429 430

static pthread_cond_t COND_handler_count;
static uint handler_count;
static bool start_mode=0, use_opt_args;
static int opt_argc;
static char **opt_argv;

unknown's avatar
unknown committed
431
#if !defined(EMBEDDED_LIBRARY)
unknown's avatar
unknown committed
432
static HANDLE hEventShutdown;
433
static char shutdown_event_name[40];
unknown's avatar
unknown committed
434 435
#include "nt_servc.h"
static	 NTService  Service;	      // Service object for WinNT
unknown's avatar
unknown committed
436 437 438 439
#endif /* EMBEDDED_LIBRARY */
#endif /* __WIN__ */

#ifdef __NT__
440
static char pipe_name[512];
unknown's avatar
unknown committed
441 442 443
static SECURITY_ATTRIBUTES saPipeSecurity;
static SECURITY_DESCRIPTOR sdPipeDescriptor;
static HANDLE hPipe = INVALID_HANDLE_VALUE;
unknown's avatar
unknown committed
444
#endif
unknown's avatar
unknown committed
445

unknown's avatar
unknown committed
446 447 448 449
#ifdef OS2
pthread_cond_t eventShutdown;
#endif

unknown's avatar
unknown committed
450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468
#ifndef EMBEDDED_LIBRARY
bool mysql_embedded=0;
#else
bool mysql_embedded=1;
#endif

#ifndef DBUG_OFF
static const char* default_dbug_option;
#endif
#ifdef HAVE_LIBWRAP
char *libwrapName= NULL;
#endif
#ifdef HAVE_QUERY_CACHE
ulong query_cache_limit= 0;
ulong query_cache_min_res_unit= QUERY_CACHE_MIN_RESULT_DATA_SIZE;
Query_cache query_cache;
#endif
#ifdef HAVE_SMEM
char *shared_memory_base_name= default_shared_memory_base_name;
469
bool opt_enable_shared_memory;
unknown's avatar
unknown committed
470 471 472 473 474 475 476 477 478 479 480
#endif

#include "sslopt-vars.h"
#ifdef HAVE_OPENSSL
char *des_key_file;
struct st_VioSSLAcceptorFd *ssl_acceptor_fd;
#endif /* HAVE_OPENSSL */


/* Function declarations */

481
static void start_signal_handler(void);
482
extern "C" pthread_handler_decl(signal_hand, arg);
unknown's avatar
unknown committed
483
static void mysql_init_variables(void);
unknown's avatar
unknown committed
484
static void get_options(int argc,char **argv);
485
static void set_server_version(void);
486
static int init_thread_environment();
unknown's avatar
unknown committed
487 488
static char *get_relative_path(const char *path);
static void fix_paths(void);
489 490
extern "C" pthread_handler_decl(handle_connections_sockets,arg);
extern "C" pthread_handler_decl(kill_server_thread,arg);
unknown's avatar
unknown committed
491
static int bootstrap(FILE *file);
492
static void close_server_sock();
unknown's avatar
unknown committed
493 494
static bool read_init_file(char *file_name);
#ifdef __NT__
495
extern "C" pthread_handler_decl(handle_connections_namedpipes,arg);
unknown's avatar
unknown committed
496
#endif
497 498 499
#ifdef HAVE_SMEM
static pthread_handler_decl(handle_connections_shared_memory,arg);
#endif
500
extern "C" pthread_handler_decl(handle_slave,arg);
501
static ulong find_bit_type(const char *x, TYPELIB *bit_lib);
unknown's avatar
unknown committed
502
static void clean_up(bool print_message);
unknown's avatar
unknown committed
503
static void clean_up_mutexes(void);
504 505
static int test_if_case_insensitive(const char *dir_name);
static void create_pid_file();
506 507

#ifndef EMBEDDED_LIBRARY
unknown's avatar
unknown committed
508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523
/****************************************************************************
** Code to end mysqld
****************************************************************************/

static void close_connections(void)
{
#ifdef EXTRA_DEBUG
  int count=0;
#endif
  DBUG_ENTER("close_connections");

  /* Clear thread cache */
  kill_cached_threads++;
  flush_thread_cache();

  /* kill flush thread */
524 525
  (void) pthread_mutex_lock(&LOCK_manager);
  if (manager_thread_in_use)
unknown's avatar
unknown committed
526
  {
527 528
    DBUG_PRINT("quit",("killing manager thread: %lx",manager_thread));
   (void) pthread_cond_signal(&COND_manager);
unknown's avatar
unknown committed
529
  }
530
  (void) pthread_mutex_unlock(&LOCK_manager);
unknown's avatar
unknown committed
531 532

  /* kill connection thread */
unknown's avatar
unknown committed
533
#if !defined(__WIN__) && !defined(__EMX__) && !defined(OS2) && !defined(__NETWARE__)
unknown's avatar
unknown committed
534 535 536 537 538 539 540 541
  DBUG_PRINT("quit",("waiting for select thread: %lx",select_thread));
  (void) pthread_mutex_lock(&LOCK_thread_count);

  while (select_thread_in_use)
  {
    struct timespec abstime;
    int error;
    LINT_INIT(error);
542 543
    DBUG_PRINT("info",("Waiting for select_thread"));

unknown's avatar
unknown committed
544 545 546 547
#ifndef DONT_USE_THR_ALARM
    if (pthread_kill(select_thread,THR_CLIENT_ALARM))
      break;					// allready dead
#endif
548
    set_timespec(abstime, 2);
549
    for (uint tmp=0 ; tmp < 10 && select_thread_in_use; tmp++)
unknown's avatar
unknown committed
550 551 552 553 554 555 556 557 558 559
    {
      error=pthread_cond_timedwait(&COND_thread_count,&LOCK_thread_count,
				   &abstime);
      if (error != EINTR)
	break;
    }
#ifdef EXTRA_DEBUG
    if (error != 0 && !count++)
      sql_print_error("Got error %d from pthread_cond_timedwait",error);
#endif
unknown's avatar
unknown committed
560
    close_server_sock();
unknown's avatar
unknown committed
561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577
  }
  (void) pthread_mutex_unlock(&LOCK_thread_count);
#endif /* __WIN__ */


  /* Abort listening to new connections */
  DBUG_PRINT("quit",("Closing sockets"));
  if ( !opt_disable_networking )
  {
    if (ip_sock != INVALID_SOCKET)
    {
      (void) shutdown(ip_sock,2);
      (void) closesocket(ip_sock);
      ip_sock= INVALID_SOCKET;
    }
  }
#ifdef __NT__
unknown's avatar
unknown committed
578
  if (hPipe != INVALID_HANDLE_VALUE && opt_enable_named_pipe)
unknown's avatar
unknown committed
579
  {
unknown's avatar
merge  
unknown committed
580
    HANDLE temp;
unknown's avatar
unknown committed
581
    DBUG_PRINT( "quit", ("Closing named pipes") );
582

unknown's avatar
merge  
unknown committed
583
    /* Create connection to the handle named pipe handler to break the loop */
584
    if ((temp = CreateFile(pipe_name,
unknown's avatar
merge  
unknown committed
585 586 587 588 589 590 591
			   GENERIC_READ | GENERIC_WRITE,
			   0,
			   NULL,
			   OPEN_EXISTING,
			   0,
			   NULL )) != INVALID_HANDLE_VALUE)
    {
592
      WaitNamedPipe(pipe_name, 1000);
unknown's avatar
merge  
unknown committed
593 594 595 596 597 598
      DWORD dwMode = PIPE_READMODE_BYTE | PIPE_WAIT;
      SetNamedPipeHandleState(temp, &dwMode, NULL, NULL);
      CancelIo(temp);
      DisconnectNamedPipe(temp);
      CloseHandle(temp);
    }
unknown's avatar
unknown committed
599 600 601 602 603 604 605
  }
#endif
#ifdef HAVE_SYS_UN_H
  if (unix_sock != INVALID_SOCKET)
  {
    (void) shutdown(unix_sock,2);
    (void) closesocket(unix_sock);
606
    (void) unlink(mysqld_unix_port);
unknown's avatar
unknown committed
607 608 609
    unix_sock= INVALID_SOCKET;
  }
#endif
610
  end_thr_alarm(0);			 // Abort old alarms.
611
  end_slave();
unknown's avatar
unknown committed
612 613 614 615 616 617 618 619 620 621 622 623 624 625 626

  /* First signal all threads that it's time to die */

  THD *tmp;
  (void) pthread_mutex_lock(&LOCK_thread_count); // For unlink from list

  I_List_iterator<THD> it(threads);
  while ((tmp=it++))
  {
    DBUG_PRINT("quit",("Informing thread %ld that it's time to die",
		       tmp->thread_id));
    tmp->killed=1;
    if (tmp->mysys_var)
    {
      tmp->mysys_var->abort=1;
unknown's avatar
unknown committed
627 628
      pthread_mutex_lock(&tmp->mysys_var->mutex);
      if (tmp->mysys_var->current_cond)
unknown's avatar
unknown committed
629 630 631 632 633
      {
	pthread_mutex_lock(tmp->mysys_var->current_mutex);
	pthread_cond_broadcast(tmp->mysys_var->current_cond);
	pthread_mutex_unlock(tmp->mysys_var->current_mutex);
      }
unknown's avatar
unknown committed
634
      pthread_mutex_unlock(&tmp->mysys_var->mutex);
unknown's avatar
unknown committed
635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654
    }
  }
  (void) pthread_mutex_unlock(&LOCK_thread_count); // For unlink from list

  if (thread_count)
    sleep(1);					// Give threads time to die

  /* Force remaining threads to die by closing the connection to the client */

  for (;;)
  {
    DBUG_PRINT("quit",("Locking LOCK_thread_count"));
    (void) pthread_mutex_lock(&LOCK_thread_count); // For unlink from list
    if (!(tmp=threads.get()))
    {
      DBUG_PRINT("quit",("Unlocking LOCK_thread_count"));
      (void) pthread_mutex_unlock(&LOCK_thread_count);
      break;
    }
#ifndef __bsdi__				// Bug in BSDI kernel
655
    if (tmp->vio_ok())
unknown's avatar
unknown committed
656 657 658
    {
      sql_print_error(ER(ER_FORCING_CLOSE),my_progname,
		      tmp->thread_id,tmp->user ? tmp->user : "");
659
      close_connection(tmp,0,0);
unknown's avatar
unknown committed
660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677
    }
#endif
    DBUG_PRINT("quit",("Unlocking LOCK_thread_count"));
    (void) pthread_mutex_unlock(&LOCK_thread_count);
  }
  /* All threads has now been aborted */
  DBUG_PRINT("quit",("Waiting for threads to die (count=%u)",thread_count));
  (void) pthread_mutex_lock(&LOCK_thread_count);
  while (thread_count)
  {
    (void) pthread_cond_wait(&COND_thread_count,&LOCK_thread_count);
    DBUG_PRINT("quit",("One thread died (count=%u)",thread_count));
  }
  (void) pthread_mutex_unlock(&LOCK_thread_count);

  DBUG_PRINT("quit",("close_connections thread"));
  DBUG_VOID_RETURN;
}
678
#endif /*EMBEDDED_LIBRARY*/
unknown's avatar
unknown committed
679

680

681
static void close_server_sock()
unknown's avatar
unknown committed
682
{
683
#ifdef HAVE_CLOSE_SERVER_SOCK
unknown's avatar
unknown committed
684
  DBUG_ENTER("close_server_sock");
685 686 687
  my_socket tmp_sock;
  tmp_sock=ip_sock;
  if (tmp_sock != INVALID_SOCKET)
unknown's avatar
unknown committed
688 689
  {
    ip_sock=INVALID_SOCKET;
690
    DBUG_PRINT("info",("calling shutdown on TCP/IP socket"));
691
    VOID(shutdown(tmp_sock,2));
unknown's avatar
unknown committed
692
#if defined(__NETWARE__)
693
    /*
unknown's avatar
unknown committed
694 695
      The following code is disabled for normal systems as it causes MySQL
      to hang on AIX 4.3 during shutdown
696
    */
697
    DBUG_PRINT("info",("calling closesocket on TCP/IP socket"));
698
    VOID(closesocket(tmp_sock));
699
#endif
unknown's avatar
unknown committed
700
  }
701 702
  tmp_sock=unix_sock;
  if (tmp_sock != INVALID_SOCKET)
unknown's avatar
unknown committed
703
  {
704
    unix_sock=INVALID_SOCKET;
705
    DBUG_PRINT("info",("calling shutdown on unix socket"));
706
    VOID(shutdown(tmp_sock,2));
unknown's avatar
unknown committed
707
#if defined(__NETWARE__)
unknown's avatar
unknown committed
708
    /*
709 710
      The following code is disabled for normal systems as it may cause MySQL
      to hang on AIX 4.3 during shutdown
unknown's avatar
unknown committed
711 712
    */
    DBUG_PRINT("info",("calling closesocket on unix/IP socket"));
713
    VOID(closesocket(tmp_sock));
unknown's avatar
unknown committed
714
#endif
715
    VOID(unlink(mysqld_unix_port));
unknown's avatar
unknown committed
716 717 718
  }
  DBUG_VOID_RETURN;
#endif
719
}
unknown's avatar
unknown committed
720

721

unknown's avatar
unknown committed
722 723 724 725
void kill_mysql(void)
{
  DBUG_ENTER("kill_mysql");

unknown's avatar
unknown committed
726
#ifdef SIGNALS_DONT_BREAK_READ
727 728
  abort_loop=1;					// Break connection loops
  close_server_sock();				// Force accept to wake up
729
#endif
unknown's avatar
unknown committed
730

unknown's avatar
unknown committed
731
#if defined(__WIN__)
unknown's avatar
unknown committed
732
#if !defined(EMBEDDED_LIBRARY)
unknown's avatar
unknown committed
733 734 735 736 737
  {
    if (!SetEvent(hEventShutdown))
    {
      DBUG_PRINT("error",("Got error: %ld from SetEvent",GetLastError()));
    }
738 739 740 741 742 743
    /*
      or:
      HANDLE hEvent=OpenEvent(0, FALSE, "MySqlShutdown");
      SetEvent(hEventShutdown);
      CloseHandle(hEvent);
    */
unknown's avatar
unknown committed
744
  }
unknown's avatar
unknown committed
745
#endif
unknown's avatar
unknown committed
746 747
#elif defined(OS2)
  pthread_cond_signal( &eventShutdown);		// post semaphore
unknown's avatar
unknown committed
748
#elif defined(HAVE_PTHREAD_KILL)
749
  if (pthread_kill(signal_thread, MYSQL_KILL_SIGNAL))
unknown's avatar
unknown committed
750 751 752 753
  {
    DBUG_PRINT("error",("Got error %d from pthread_kill",errno)); /* purecov: inspected */
  }
#elif !defined(SIGNALS_DONT_BREAK_READ)
754
  kill(current_pid, MYSQL_KILL_SIGNAL);
unknown's avatar
unknown committed
755
#endif
unknown's avatar
unknown committed
756 757 758
  DBUG_PRINT("quit",("After pthread_kill"));
  shutdown_in_progress=1;			// Safety if kill didn't work
#ifdef SIGNALS_DONT_BREAK_READ
759
  if (!kill_in_progress)
unknown's avatar
unknown committed
760 761
  {
    pthread_t tmp;
unknown's avatar
unknown committed
762
    abort_loop=1;
unknown's avatar
unknown committed
763 764 765 766
    if (pthread_create(&tmp,&connection_attrib, kill_server_thread,
			   (void*) 0))
      sql_print_error("Error: Can't create thread to kill server");
  }
767
#endif
unknown's avatar
unknown committed
768
  DBUG_VOID_RETURN;
unknown's avatar
unknown committed
769 770 771 772
}

	/* Force server down. kill all connections and threads and exit */

unknown's avatar
unknown committed
773
#if defined(OS2) || defined(__NETWARE__)
unknown's avatar
unknown committed
774
extern "C" void kill_server(int sig_ptr)
775
#define RETURN_FROM_KILL_SERVER DBUG_VOID_RETURN
unknown's avatar
unknown committed
776
#elif !defined(__WIN__)
unknown's avatar
unknown committed
777
static void *kill_server(void *sig_ptr)
unknown's avatar
unknown committed
778
#define RETURN_FROM_KILL_SERVER DBUG_RETURN(0)
unknown's avatar
unknown committed
779 780
#else
static void __cdecl kill_server(int sig_ptr)
unknown's avatar
unknown committed
781
#define RETURN_FROM_KILL_SERVER DBUG_VOID_RETURN
unknown's avatar
unknown committed
782 783 784 785
#endif
{
  int sig=(int) (long) sig_ptr;			// This is passed a int
  DBUG_ENTER("kill_server");
786
#ifndef EMBEDDED_LIBRARY
787
  // if there is a signal during the kill in progress, ignore the other
unknown's avatar
unknown committed
788 789 790 791 792 793 794 795 796 797
  if (kill_in_progress)				// Safety
    RETURN_FROM_KILL_SERVER;
  kill_in_progress=TRUE;
  abort_loop=1;					// This should be set
  signal(sig,SIG_IGN);
  if (sig == MYSQL_KILL_SIGNAL || sig == 0)
    sql_print_error(ER(ER_NORMAL_SHUTDOWN),my_progname);
  else
    sql_print_error(ER(ER_GOT_SIGNAL),my_progname,sig); /* purecov: inspected */

unknown's avatar
unknown committed
798
#if defined(__NETWARE__) || (defined(USE_ONE_SIGNAL_HAND) && !defined(__WIN__) && !defined(OS2))
unknown's avatar
unknown committed
799 800 801 802 803 804
  my_thread_init();				// If this is a new thread
#endif
  close_connections();
  if (sig != MYSQL_KILL_SIGNAL && sig != 0)
    unireg_abort(1);				/* purecov: inspected */
  else
805
    unireg_end();
unknown's avatar
unknown committed
806 807 808
#ifdef __NETWARE__
  pthread_join(select_thread, NULL);		// wait for main thread
#endif /* __NETWARE__ */
809 810
  
  pthread_exit(0);				/* purecov: deadcode */
unknown's avatar
unknown committed
811

812
#endif /* EMBEDDED_LIBRARY */
unknown's avatar
unknown committed
813 814 815 816
  RETURN_FROM_KILL_SERVER;
}


unknown's avatar
unknown committed
817
#if defined(USE_ONE_SIGNAL_HAND) || (defined(__NETWARE__) && defined(SIGNALS_DONT_BREAK_READ))
818
extern "C" pthread_handler_decl(kill_server_thread,arg __attribute__((unused)))
unknown's avatar
unknown committed
819 820 821 822 823 824 825 826
{
  my_thread_init();				// Initialize new thread
  kill_server(0);
  my_thread_end();				// Normally never reached
  return 0;
}
#endif

unknown's avatar
unknown committed
827 828 829 830 831
#if defined(__amiga__)
#undef sigset
#define sigset signal
#endif

832
extern "C" sig_handler print_signal_warning(int sig)
unknown's avatar
unknown committed
833
{
834 835 836 837 838 839
  if (!DBUG_IN_USE)
  {
    if (global_system_variables.log_warnings)
      sql_print_error("Warning: Got signal %d from thread %d",
		      sig,my_thread_id());
  }
unknown's avatar
unknown committed
840 841 842
#ifdef DONT_REMEMBER_SIGNAL
  sigset(sig,print_signal_warning);		/* int. thread system calls */
#endif
unknown's avatar
unknown committed
843
#if !defined(__WIN__) && !defined(OS2) && !defined(__NETWARE__)
unknown's avatar
unknown committed
844 845 846 847 848
  if (sig == SIGALRM)
    alarm(2);					/* reschedule alarm */
#endif
}

849 850
/*
  cleanup all memory and end program nicely
unknown's avatar
unknown committed
851

852 853 854 855 856
  SYNOPSIS
    unireg_end()

  NOTES
    This function never returns.
unknown's avatar
unknown committed
857

858 859 860 861
    If SIGNALS_DONT_BREAK_READ is defined, this function is called
    by the main thread. To get MySQL to shut down nicely in this case
    (Mac OS X) we have to call exit() instead if pthread_exit().
*/
unknown's avatar
unknown committed
862

863
#ifndef EMBEDDED_LIBRARY
864
void unireg_end(void)
unknown's avatar
unknown committed
865
{
unknown's avatar
unknown committed
866
  clean_up(1);
unknown's avatar
unknown committed
867
  my_thread_end();
868
#if defined(SIGNALS_DONT_BREAK_READ) && !defined(__NETWARE__)
869 870
  exit(0);
#else
unknown's avatar
unknown committed
871
  pthread_exit(0);				// Exit is in main thread
872
#endif
unknown's avatar
unknown committed
873 874
}

875
extern "C" void unireg_abort(int exit_code)
unknown's avatar
unknown committed
876
{
877
  DBUG_ENTER("unireg_abort");
unknown's avatar
unknown committed
878 879
  if (exit_code)
    sql_print_error("Aborting\n");
unknown's avatar
unknown committed
880
  clean_up(exit_code || !opt_bootstrap); /* purecov: inspected */
881
  DBUG_PRINT("quit",("done with cleanup in unireg_abort"));
unknown's avatar
unknown committed
882 883
  clean_up_mutexes();
  my_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
unknown's avatar
unknown committed
884 885
  exit(exit_code); /* purecov: inspected */
}
886
#endif
unknown's avatar
unknown committed
887

unknown's avatar
unknown committed
888

889
void clean_up(bool print_message)
unknown's avatar
unknown committed
890 891 892 893
{
  DBUG_PRINT("exit",("clean_up"));
  if (cleanup_done++)
    return; /* purecov: inspected */
unknown's avatar
unknown committed
894 895 896 897 898 899

  mysql_log.cleanup();
  mysql_slow_log.cleanup();
  mysql_update_log.cleanup();
  mysql_bin_log.cleanup();

unknown's avatar
SCRUM  
unknown committed
900
#ifdef HAVE_REPLICATION
unknown's avatar
unknown committed
901 902
  if (use_slave_mask)
    bitmap_free(&slave_error_mask);
903
#endif
904
  my_tz_free();
905
  my_dbopt_free();
unknown's avatar
SCRUM:  
unknown committed
906
#ifndef NO_EMBEDDED_ACCESS_CHECKS
unknown's avatar
unknown committed
907 908
  acl_free(1);
  grant_free();
unknown's avatar
SCRUM:  
unknown committed
909
#endif
unknown's avatar
unknown committed
910
  query_cache_destroy();
unknown's avatar
unknown committed
911 912 913 914
  table_cache_free();
  hostname_cache_free();
  item_user_lock_free();
  lex_free();				/* Free some memory */
unknown's avatar
unknown committed
915
  set_var_free();
unknown's avatar
unknown committed
916 917 918 919
#ifdef HAVE_DLOPEN
  if (!opt_noacl)
    udf_free();
#endif
920
  (void) ha_panic(HA_PANIC_CLOSE);	/* close all tables and logs */
921 922
  delete_elements(&key_caches, (void (*)(const char*, gptr)) free_key_cache);
  multi_keycache_free();
923
  end_thr_alarm(1);			/* Free allocated memory */
unknown's avatar
unknown committed
924 925 926
#ifdef USE_RAID
  end_raid();
#endif
927
  my_free_open_file_info();
928 929 930 931 932 933
  my_free((char*) global_system_variables.date_format,
	  MYF(MY_ALLOW_ZERO_PTR));
  my_free((char*) global_system_variables.time_format,
	  MYF(MY_ALLOW_ZERO_PTR));
  my_free((char*) global_system_variables.datetime_format,
	  MYF(MY_ALLOW_ZERO_PTR));
unknown's avatar
unknown committed
934 935
  if (defaults_argv)
    free_defaults(defaults_argv);
unknown's avatar
SCRUM:  
unknown committed
936 937
  my_free(sys_init_connect.value, MYF(MY_ALLOW_ZERO_PTR));
  my_free(sys_init_slave.value, MYF(MY_ALLOW_ZERO_PTR));
unknown's avatar
unknown committed
938
  free_tmpdir(&mysql_tmpdir_list);
unknown's avatar
SCRUM  
unknown committed
939
#ifdef HAVE_REPLICATION
940
  my_free(slave_load_tmpdir,MYF(MY_ALLOW_ZERO_PTR));
941
#endif
942
  x_free(opt_bin_logname);
943
  x_free(opt_relay_logname);
unknown's avatar
unknown committed
944
  bitmap_free(&temp_pool);
unknown's avatar
unknown committed
945
  free_max_user_conn();
unknown's avatar
SCRUM  
unknown committed
946
#ifdef HAVE_REPLICATION
947
  end_slave_list();
948 949 950 951 952
  free_list(&replicate_do_db);
  free_list(&replicate_ignore_db);
  free_list(&binlog_do_db);
  free_list(&binlog_ignore_db);
  free_list(&replicate_rewrite_db);
953
#endif
unknown's avatar
unknown committed
954
#ifdef HAVE_OPENSSL
unknown's avatar
unknown committed
955 956
  if (ssl_acceptor_fd)
    my_free((gptr) ssl_acceptor_fd, MYF(MY_ALLOW_ZERO_PTR));
unknown's avatar
unknown committed
957 958
  free_des_key_file();
#endif /* HAVE_OPENSSL */
unknown's avatar
unknown committed
959 960 961
#ifdef USE_REGEX
  regex_end();
#endif
unknown's avatar
unknown committed
962

unknown's avatar
unknown committed
963 964
  if (print_message && errmesg)
    sql_print_error(ER(ER_SHUTDOWN_COMPLETE),my_progname);
unknown's avatar
unknown committed
965
#if !defined(__WIN__) && !defined(EMBEDDED_LIBRARY)
966 967
  if (!opt_bootstrap)
    (void) my_delete(pidfile_name,MYF(0));	// This may not always exist
unknown's avatar
unknown committed
968
#endif
969
  x_free((gptr) my_errmsg[ERRMAPP]);	/* Free messages */
970
  DBUG_PRINT("quit", ("Error messages freed"));
unknown's avatar
unknown committed
971 972
  /* Tell main we are ready */
  (void) pthread_mutex_lock(&LOCK_thread_count);
973
  DBUG_PRINT("quit", ("got thread count lock"));
unknown's avatar
unknown committed
974
  ready_to_exit=1;
unknown's avatar
unknown committed
975
  /* do the broadcast inside the lock to ensure that my_end() is not called */
unknown's avatar
unknown committed
976 977
  (void) pthread_cond_broadcast(&COND_thread_count);
  (void) pthread_mutex_unlock(&LOCK_thread_count);
unknown's avatar
unknown committed
978 979 980 981
  /*
    The following lines may never be executed as the main thread may have
    killed us
  */
982
  DBUG_PRINT("quit", ("done with cleanup"));
unknown's avatar
unknown committed
983 984 985
} /* clean_up */


unknown's avatar
unknown committed
986 987 988 989
static void clean_up_mutexes()
{
  (void) pthread_mutex_destroy(&LOCK_mysql_create_db);
  (void) pthread_mutex_destroy(&LOCK_Acl);
990
  (void) rwlock_destroy(&LOCK_grant);
unknown's avatar
unknown committed
991 992 993 994 995 996 997 998 999 1000 1001 1002 1003
  (void) pthread_mutex_destroy(&LOCK_open);
  (void) pthread_mutex_destroy(&LOCK_thread_count);
  (void) pthread_mutex_destroy(&LOCK_mapped_file);
  (void) pthread_mutex_destroy(&LOCK_status);
  (void) pthread_mutex_destroy(&LOCK_error_log);
  (void) pthread_mutex_destroy(&LOCK_delayed_insert);
  (void) pthread_mutex_destroy(&LOCK_delayed_status);
  (void) pthread_mutex_destroy(&LOCK_delayed_create);
  (void) pthread_mutex_destroy(&LOCK_manager);
  (void) pthread_mutex_destroy(&LOCK_crypt);
  (void) pthread_mutex_destroy(&LOCK_bytes_sent);
  (void) pthread_mutex_destroy(&LOCK_bytes_received);
  (void) pthread_mutex_destroy(&LOCK_user_conn);
1004
#ifdef HAVE_REPLICATION
unknown's avatar
unknown committed
1005
  (void) pthread_mutex_destroy(&LOCK_rpl_status);
1006 1007
  (void) pthread_cond_destroy(&COND_rpl_status);
#endif
unknown's avatar
unknown committed
1008
  (void) pthread_mutex_destroy(&LOCK_active_mi);
unknown's avatar
SCRUM:  
unknown committed
1009 1010
  (void) rwlock_destroy(&LOCK_sys_init_connect);
  (void) rwlock_destroy(&LOCK_sys_init_slave);
unknown's avatar
unknown committed
1011 1012 1013 1014 1015 1016 1017
  (void) pthread_mutex_destroy(&LOCK_global_system_variables);
  (void) pthread_cond_destroy(&COND_thread_count);
  (void) pthread_cond_destroy(&COND_refresh);
  (void) pthread_cond_destroy(&COND_thread_cache);
  (void) pthread_cond_destroy(&COND_flush_thread_cache);
  (void) pthread_cond_destroy(&COND_manager);
}
unknown's avatar
unknown committed
1018 1019 1020 1021 1022 1023 1024 1025

/****************************************************************************
** Init IP and UNIX socket
****************************************************************************/

static void set_ports()
{
  char	*env;
1026
  if (!mysqld_port && !opt_disable_networking)
unknown's avatar
unknown committed
1027 1028
  {					// Get port if not from commandline
    struct  servent *serv_ptr;
1029 1030 1031
    mysqld_port= MYSQL_PORT;
    if ((serv_ptr= getservbyname("mysql", "tcp")))
      mysqld_port= ntohs((u_short) serv_ptr->s_port); /* purecov: inspected */
unknown's avatar
unknown committed
1032
    if ((env = getenv("MYSQL_TCP_PORT")))
1033
      mysqld_port= (uint) atoi(env);		/* purecov: inspected */
unknown's avatar
unknown committed
1034
  }
1035
  if (!mysqld_unix_port)
unknown's avatar
unknown committed
1036 1037
  {
#ifdef __WIN__
1038
    mysqld_unix_port= (char*) MYSQL_NAMEDPIPE;
unknown's avatar
unknown committed
1039
#else
1040
    mysqld_unix_port= (char*) MYSQL_UNIX_ADDR;
unknown's avatar
unknown committed
1041 1042
#endif
    if ((env = getenv("MYSQL_UNIX_PORT")))
1043
      mysqld_unix_port= env;			/* purecov: inspected */
unknown's avatar
unknown committed
1044 1045 1046
  }
}

1047
#ifndef EMBEDDED_LIBRARY
unknown's avatar
unknown committed
1048 1049 1050 1051
/* Change to run as another user if started with --user */

static void set_user(const char *user)
{
unknown's avatar
unknown committed
1052
#if !defined(__WIN__) && !defined(OS2) && !defined(__NETWARE__)
1053 1054
  struct passwd *ent;
  uid_t user_id= geteuid();
unknown's avatar
unknown committed
1055 1056

  // don't bother if we aren't superuser
1057
  if (user_id)
unknown's avatar
unknown committed
1058 1059
  {
    if (user)
1060 1061 1062
    {
      /* Don't give a warning, if real user is same as given with --user */
      struct passwd *user_info= getpwnam(user);
1063 1064
      if ((!user_info || user_id != user_info->pw_uid) &&
	  global_system_variables.log_warnings)
1065 1066 1067
	fprintf(stderr,
		"Warning: One can only use the --user switch if running as root\n");
    }
unknown's avatar
unknown committed
1068 1069
    return;
  }
1070
  if (!user)
unknown's avatar
unknown committed
1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081
  {
    if (!opt_bootstrap)
    {
      fprintf(stderr,"Fatal error: Please read \"Security\" section of the manual to find out how to run mysqld as root!\n");
      unireg_abort(1);
    }
    return;
  }
  if (!strcmp(user,"root"))
    return;				// Avoid problem with dynamic libraries

unknown's avatar
unknown committed
1082
  uid_t uid;
unknown's avatar
unknown committed
1083 1084
  if (!(ent = getpwnam(user)))
  {
unknown's avatar
unknown committed
1085 1086
    // allow a numeric uid to be used
    const char *pos;
unknown's avatar
unknown committed
1087
    for (pos=user; my_isdigit(mysqld_charset,*pos); pos++) ;
unknown's avatar
unknown committed
1088 1089 1090 1091 1092 1093
    if (*pos)					// Not numeric id
    {
      fprintf(stderr,"Fatal error: Can't change to run as user '%s' ;  Please check that the user exists!\n",user);
      unireg_abort(1);
    }
    uid=atoi(user);				// Use numberic uid
unknown's avatar
unknown committed
1094
  }
unknown's avatar
unknown committed
1095 1096
  else
  {
unknown's avatar
unknown committed
1097
#ifdef HAVE_INITGROUPS
unknown's avatar
unknown committed
1098
    initgroups((char*) user,ent->pw_gid);
unknown's avatar
unknown committed
1099
#endif
unknown's avatar
unknown committed
1100 1101 1102 1103 1104 1105
    if (setgid(ent->pw_gid) == -1)
    {
      sql_perror("setgid");
      unireg_abort(1);
    }
    uid=ent->pw_uid;
unknown's avatar
unknown committed
1106
  }
unknown's avatar
unknown committed
1107 1108

  if (setuid(uid) == -1)
unknown's avatar
unknown committed
1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119
  {
    sql_perror("setuid");
    unireg_abort(1);
  }
#endif
}

/* Change root user if started with  --chroot */

static void set_root(const char *path)
{
unknown's avatar
unknown committed
1120
#if !defined(__WIN__) && !defined(__EMX__) && !defined(OS2) && !defined(__NETWARE__)
unknown's avatar
unknown committed
1121 1122 1123 1124 1125
  if (chroot(path) == -1)
  {
    sql_perror("chroot");
    unireg_abort(1);
  }
1126
  my_setwd("/", MYF(0));
unknown's avatar
unknown committed
1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152
#endif
}

static void server_init(void)
{
  struct sockaddr_in	IPaddr;
#ifdef HAVE_SYS_UN_H
  struct sockaddr_un	UNIXaddr;
#endif
  int	arg=1;
  DBUG_ENTER("server_init");

#ifdef	__WIN__
  if ( !opt_disable_networking )
  {
    WSADATA WsaData;
    if (SOCKET_ERROR == WSAStartup (0x0101, &WsaData))
    {
      my_message(0,"WSAStartup Failed\n",MYF(0));
      unireg_abort(1);
    }
  }
#endif /* __WIN__ */

  set_ports();

1153
  if (mysqld_port != 0 && !opt_disable_networking && !opt_bootstrap)
unknown's avatar
unknown committed
1154
  {
1155
    DBUG_PRINT("general",("IP Socket is %d",mysqld_port));
unknown's avatar
unknown committed
1156 1157 1158 1159 1160 1161 1162 1163 1164 1165
    ip_sock = socket(AF_INET, SOCK_STREAM, 0);
    if (ip_sock == INVALID_SOCKET)
    {
      DBUG_PRINT("error",("Got error: %d from socket()",socket_errno));
      sql_perror(ER(ER_IPSOCK_ERROR));		/* purecov: tested */
      unireg_abort(1);				/* purecov: tested */
    }
    bzero((char*) &IPaddr, sizeof(IPaddr));
    IPaddr.sin_family = AF_INET;
    IPaddr.sin_addr.s_addr = my_bind_addr;
1166
    IPaddr.sin_port = (unsigned short) htons((unsigned short) mysqld_port);
1167 1168 1169 1170 1171 1172

#ifndef __WIN__
    /*
      We should not use SO_REUSEADDR on windows as this would enable a
      user to open two mysqld servers with the same TCP/IP port.
    */
unknown's avatar
unknown committed
1173
    (void) setsockopt(ip_sock,SOL_SOCKET,SO_REUSEADDR,(char*)&arg,sizeof(arg));
unknown's avatar
unknown committed
1174
#endif /* __WIN__ */
unknown's avatar
unknown committed
1175 1176
    if (bind(ip_sock, my_reinterpret_cast(struct sockaddr *) (&IPaddr),
	     sizeof(IPaddr)) < 0)
unknown's avatar
unknown committed
1177 1178
    {
      DBUG_PRINT("error",("Got error: %d from bind",socket_errno));
unknown's avatar
unknown committed
1179
      sql_perror("Can't start server: Bind on TCP/IP port");
1180
      sql_print_error("Do you already have another mysqld server running on port: %d ?",mysqld_port);
unknown's avatar
unknown committed
1181 1182
      unireg_abort(1);
    }
1183
    if (listen(ip_sock,(int) back_log) < 0)
unknown's avatar
unknown committed
1184
    {
unknown's avatar
unknown committed
1185
      sql_perror("Can't start server: listen() on TCP/IP port");
unknown's avatar
unknown committed
1186
      sql_print_error("Error:  listen() on TCP/IP failed with error %d",
unknown's avatar
unknown committed
1187
		      socket_errno);
unknown's avatar
unknown committed
1188 1189
      unireg_abort(1);
    }
unknown's avatar
unknown committed
1190
  }
unknown's avatar
unknown committed
1191
  set_user(mysqld_user);		// Works also with mysqld_user==NULL
unknown's avatar
unknown committed
1192 1193 1194

#ifdef __NT__
  /* create named pipe */
1195
  if (Service.IsNT() && mysqld_unix_port[0] && !opt_bootstrap &&
unknown's avatar
unknown committed
1196
      opt_enable_named_pipe)
unknown's avatar
unknown committed
1197
  {
1198 1199 1200
    
    pipe_name[sizeof(pipe_name)-1]= 0;		/* Safety if too long string */
    strxnmov(pipe_name, sizeof(pipe_name)-1, "\\\\.\\pipe\\",
1201
	     mysqld_unix_port, NullS);
1202 1203
    bzero((char*) &saPipeSecurity, sizeof(saPipeSecurity));
    bzero((char*) &sdPipeDescriptor, sizeof(sdPipeDescriptor));
1204
    if (!InitializeSecurityDescriptor(&sdPipeDescriptor,
1205
				      SECURITY_DESCRIPTOR_REVISION))
unknown's avatar
unknown committed
1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217
    {
      sql_perror("Can't start server : Initialize security descriptor");
      unireg_abort(1);
    }
    if (!SetSecurityDescriptorDacl(&sdPipeDescriptor, TRUE, NULL, FALSE))
    {
      sql_perror("Can't start server : Set security descriptor");
      unireg_abort(1);
    }
    saPipeSecurity.nLength = sizeof( SECURITY_ATTRIBUTES );
    saPipeSecurity.lpSecurityDescriptor = &sdPipeDescriptor;
    saPipeSecurity.bInheritHandle = FALSE;
1218 1219 1220 1221 1222 1223 1224 1225 1226 1227
    if ((hPipe= CreateNamedPipe(pipe_name,
				PIPE_ACCESS_DUPLEX,
				PIPE_TYPE_BYTE |
				PIPE_READMODE_BYTE |
				PIPE_WAIT,
				PIPE_UNLIMITED_INSTANCES,
				(int) global_system_variables.net_buffer_length,
				(int) global_system_variables.net_buffer_length,
				NMPWAIT_USE_DEFAULT_WAIT,
				&saPipeSecurity)) == INVALID_HANDLE_VALUE)
unknown's avatar
unknown committed
1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242
      {
	LPVOID lpMsgBuf;
	int error=GetLastError();
	FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
		      FORMAT_MESSAGE_FROM_SYSTEM,
		      NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
		      (LPTSTR) &lpMsgBuf, 0, NULL );
	MessageBox( NULL, (LPTSTR) lpMsgBuf, "Error from CreateNamedPipe",
		    MB_OK|MB_ICONINFORMATION );
	LocalFree( lpMsgBuf );
	unireg_abort(1);
      }
  }
#endif

1243
#if defined(HAVE_SYS_UN_H)
unknown's avatar
unknown committed
1244 1245 1246
  /*
  ** Create the UNIX socket
  */
1247
  if (mysqld_unix_port[0] && !opt_bootstrap)
unknown's avatar
unknown committed
1248
  {
1249
    DBUG_PRINT("general",("UNIX Socket is %s",mysqld_unix_port));
unknown's avatar
unknown committed
1250

unknown's avatar
unknown committed
1251 1252 1253 1254 1255 1256
    if (strlen(mysqld_unix_port) > (sizeof(UNIXaddr.sun_path) - 1))
    {
      sql_print_error("The socket file path is too long (> %d): %s",
                    sizeof(UNIXaddr.sun_path) - 1, mysqld_unix_port);
      unireg_abort(1);
    }
1257
    if ((unix_sock= socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
unknown's avatar
unknown committed
1258 1259 1260 1261 1262 1263
    {
      sql_perror("Can't start server : UNIX Socket "); /* purecov: inspected */
      unireg_abort(1);				/* purecov: inspected */
    }
    bzero((char*) &UNIXaddr, sizeof(UNIXaddr));
    UNIXaddr.sun_family = AF_UNIX;
1264 1265
    strmov(UNIXaddr.sun_path, mysqld_unix_port);
    (void) unlink(mysqld_unix_port);
unknown's avatar
unknown committed
1266 1267 1268 1269 1270 1271 1272
    (void) setsockopt(unix_sock,SOL_SOCKET,SO_REUSEADDR,(char*)&arg,
		      sizeof(arg));
    umask(0);
    if (bind(unix_sock, my_reinterpret_cast(struct sockaddr *) (&UNIXaddr),
	     sizeof(UNIXaddr)) < 0)
    {
      sql_perror("Can't start server : Bind on unix socket"); /* purecov: tested */
1273
      sql_print_error("Do you already have another mysqld server running on socket: %s ?",mysqld_unix_port);
unknown's avatar
unknown committed
1274 1275 1276 1277
      unireg_abort(1);					/* purecov: tested */
    }
    umask(((~my_umask) & 0666));
#if defined(S_IFSOCK) && defined(SECURE_SOCKETS)
1278
    (void) chmod(mysqld_unix_port,S_IFSOCK);	/* Fix solaris 2.6 bug */
unknown's avatar
unknown committed
1279
#endif
1280 1281
    if (listen(unix_sock,(int) back_log) < 0)
      sql_print_error("Warning:  listen() on Unix socket failed with error %d",
unknown's avatar
unknown committed
1282
		      socket_errno);
unknown's avatar
unknown committed
1283 1284 1285 1286 1287 1288
  }
#endif
  DBUG_PRINT("info",("server started"));
  DBUG_VOID_RETURN;
}

1289
#endif /*!EMBEDDED_LIBRARY*/
unknown's avatar
unknown committed
1290 1291 1292

void yyerror(const char *s)
{
1293
  THD *thd=current_thd;
1294
  char *yytext= (char*) thd->lex->tok_start;
1295 1296
  /* "parse error" changed into "syntax error" between bison 1.75 and 1.875 */
  if (strcmp(s,"parse error") == 0 || strcmp(s,"syntax error") == 0)
unknown's avatar
unknown committed
1297
    s=ER(ER_SYNTAX_ERROR);
1298
  net_printf(thd,ER_PARSE_ERROR, s, yytext ? (char*) yytext : "",
1299
	     thd->lex->yylineno);
unknown's avatar
unknown committed
1300 1301
}

1302

1303
#ifndef EMBEDDED_LIBRARY
1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316
/*
  Close a connection

  SYNOPSIS
    close_connection()
    thd		Thread handle
    errcode	Error code to print to console
    lock	1 if we have have to lock LOCK_thread_count

  NOTES
    For the connection that is doing shutdown, this is called twice
*/

1317
void close_connection(THD *thd, uint errcode, bool lock)
unknown's avatar
unknown committed
1318
{
1319
  st_vio *vio;
unknown's avatar
unknown committed
1320 1321
  DBUG_ENTER("close_connection");
  DBUG_PRINT("enter",("fd: %s  error: '%s'",
1322 1323 1324
		      thd->net.vio ? vio_description(thd->net.vio) :
		      "(not connected)",
		      errcode ? ER(errcode) : ""));
unknown's avatar
unknown committed
1325 1326
  if (lock)
    (void) pthread_mutex_lock(&LOCK_thread_count);
1327
  if ((vio=thd->net.vio) != 0)
unknown's avatar
unknown committed
1328 1329
  {
    if (errcode)
1330
      send_error(thd, errcode, ER(errcode));	/* purecov: inspected */
unknown's avatar
unknown committed
1331 1332 1333 1334 1335 1336
    vio_close(vio);			/* vio is freed in delete thd */
  }
  if (lock)
    (void) pthread_mutex_unlock(&LOCK_thread_count);
  DBUG_VOID_RETURN;
}
1337 1338
#endif /* EMBEDDED_LIBRARY */

unknown's avatar
unknown committed
1339 1340 1341 1342

	/* Called when a thread is aborted */
	/* ARGSUSED */

1343
extern "C" sig_handler end_thread_signal(int sig __attribute__((unused)))
unknown's avatar
unknown committed
1344 1345 1346
{
  THD *thd=current_thd;
  DBUG_ENTER("end_thread_signal");
1347
  if (thd && ! thd->bootstrap)
1348 1349
  {
    statistic_increment(killed_threads, &LOCK_status);
unknown's avatar
unknown committed
1350
    end_thread(thd,0);
1351
  }
unknown's avatar
unknown committed
1352 1353 1354 1355 1356 1357 1358
  DBUG_VOID_RETURN;				/* purecov: deadcode */
}


void end_thread(THD *thd, bool put_in_cache)
{
  DBUG_ENTER("end_thread");
unknown's avatar
unknown committed
1359
  thd->cleanup();
unknown's avatar
unknown committed
1360 1361 1362
  (void) pthread_mutex_lock(&LOCK_thread_count);
  thread_count--;
  delete thd;
1363

1364 1365
  if (put_in_cache && cached_thread_count < thread_cache_size &&
      ! abort_loop && !kill_cached_threads)
unknown's avatar
unknown committed
1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378
  {
    /* Don't kill the thread, just put it in cache for reuse */
    DBUG_PRINT("info", ("Adding thread to cache"))
    cached_thread_count++;
    while (!abort_loop && ! wake_thread && ! kill_cached_threads)
      (void) pthread_cond_wait(&COND_thread_cache, &LOCK_thread_count);
    cached_thread_count--;
    if (kill_cached_threads)
      pthread_cond_signal(&COND_flush_thread_cache);
    if (wake_thread)
    {
      wake_thread--;
      thd=thread_cache.get();
1379
      thd->real_id=pthread_self();
unknown's avatar
unknown committed
1380
      (void) thd->store_globals();
1381
      threads.append(thd);
unknown's avatar
unknown committed
1382 1383 1384 1385 1386 1387 1388 1389 1390
      pthread_mutex_unlock(&LOCK_thread_count);
      DBUG_VOID_RETURN;
    }
  }

  DBUG_PRINT("info", ("sending a broadcast"))

  /* Tell main we are ready */
  (void) pthread_mutex_unlock(&LOCK_thread_count);
1391
  /* It's safe to broadcast outside a lock (COND... is not deleted here) */
unknown's avatar
unknown committed
1392
  (void) pthread_cond_broadcast(&COND_thread_count);
unknown's avatar
unknown committed
1393
  DBUG_PRINT("info", ("unlocked thread_count mutex"))
1394
#ifdef ONE_THREAD
unknown's avatar
unknown committed
1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429
  if (!(test_flags & TEST_NO_THREADS))	// For debugging under Linux
#endif
  {
    my_thread_end();
    pthread_exit(0);
  }
  DBUG_VOID_RETURN;
}


/* Start a cached thread. LOCK_thread_count is locked on entry */

static void start_cached_thread(THD *thd)
{
  thread_cache.append(thd);
  wake_thread++;
  thread_count++;
  pthread_cond_signal(&COND_thread_cache);
}


void flush_thread_cache()
{
  (void) pthread_mutex_lock(&LOCK_thread_count);
  kill_cached_threads++;
  while (cached_thread_count)
  {
    pthread_cond_broadcast(&COND_thread_cache);
    pthread_cond_wait(&COND_flush_thread_cache,&LOCK_thread_count);
  }
  kill_cached_threads--;
  (void) pthread_mutex_unlock(&LOCK_thread_count);
}


1430 1431 1432 1433 1434
/*
  Aborts a thread nicely. Commes here on SIGPIPE
  TODO: One should have to fix that thr_alarm know about this
  thread too.
*/
unknown's avatar
unknown committed
1435 1436

#ifdef THREAD_SPECIFIC_SIGPIPE
1437
extern "C" sig_handler abort_thread(int sig __attribute__((unused)))
unknown's avatar
unknown committed
1438 1439 1440 1441 1442 1443 1444 1445 1446 1447
{
  THD *thd=current_thd;
  DBUG_ENTER("abort_thread");
  if (thd)
    thd->killed=1;
  DBUG_VOID_RETURN;
}
#endif

/******************************************************************************
1448 1449 1450
  Setup a signal thread with handles all signals.
  Because Linux doesn't support schemas use a mutex to check that
  the signal thread is ready before continuing
unknown's avatar
unknown committed
1451 1452
******************************************************************************/

unknown's avatar
unknown committed
1453
#if defined(__WIN__) || defined(OS2)
unknown's avatar
unknown committed
1454 1455 1456 1457 1458
static void init_signals(void)
{
  int signals[] = {SIGINT,SIGILL,SIGFPE,SIGSEGV,SIGTERM,SIGABRT } ;
  for (uint i=0 ; i < sizeof(signals)/sizeof(int) ; i++)
    signal( signals[i], kill_server) ;
unknown's avatar
unknown committed
1459
#if defined(__WIN__)
unknown's avatar
unknown committed
1460
  signal(SIGBREAK,SIG_IGN);	//ignore SIGBREAK for NT
unknown's avatar
unknown committed
1461 1462 1463
#else
  signal(SIGBREAK, kill_server);
#endif
unknown's avatar
unknown committed
1464 1465
}

1466
static void start_signal_handler(void)
unknown's avatar
unknown committed
1467 1468 1469 1470
{}

static void check_data_home(const char *path)
{}
1471

unknown's avatar
unknown committed
1472

unknown's avatar
unknown committed
1473 1474 1475 1476 1477 1478 1479 1480
#elif defined(__NETWARE__)

// down server event callback
void mysql_down_server_cb(void *, void *)
{
  kill_server(0);
}

unknown's avatar
unknown committed
1481

unknown's avatar
unknown committed
1482 1483 1484 1485 1486
// destroy callback resources
void mysql_cb_destroy(void *)
{
  UnRegisterEventNotification(eh);  // cleanup down event notification
  NX_UNWRAP_INTERFACE(ref);
unknown's avatar
unknown committed
1487 1488 1489 1490 1491

  /* Deregister NSS volume deactivation event */
  NX_UNWRAP_INTERFACE(refneb);
  if (neb_consumer_id)
    UnRegisterConsumer(neb_consumer_id, NULL);	
unknown's avatar
unknown committed
1492 1493
}

unknown's avatar
unknown committed
1494

unknown's avatar
unknown committed
1495 1496 1497 1498 1499
// initialize callbacks
void mysql_cb_init()
{
  // register for down server event
  void *handle = getnlmhandle();
unknown's avatar
unknown committed
1500 1501
  rtag_t rt= AllocateResourceTag(handle, "MySQL Down Server Callback",
                                 EventSignature);
unknown's avatar
unknown committed
1502
  NX_WRAP_INTERFACE((void *)mysql_down_server_cb, 2, (void **)&ref);
unknown's avatar
unknown committed
1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513
  eh= RegisterForEventNotification(rt, EVENT_PRE_DOWN_SERVER,
                                   EVENT_PRIORITY_APPLICATION,
                                   NULL, ref, NULL);

  /*
    Register for volume deactivation event
    Wrap the callback function, as it is called by non-LibC thread
  */
  (void)NX_WRAP_INTERFACE(neb_event_callback, 1, &refneb);
  registerwithneb();

unknown's avatar
unknown committed
1514 1515 1516
  NXVmRegisterExitHandler(mysql_cb_destroy, NULL);  // clean-up
}

unknown's avatar
unknown committed
1517

1518
/* To get the name of the NetWare volume having MySQL data folder */
unknown's avatar
unknown committed
1519

1520
static void getvolumename()
unknown's avatar
unknown committed
1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536
{
  char *p;
  /*
    We assume that data path is already set.
    If not it won't come here. Terminate after volume name
  */
  if ((p= strchr(mysql_real_data_home, ':')))
    strmake(datavolname, mysql_real_data_home,
            (uint) (p - mysql_real_data_home));
}


/*
  Registering with NEB for NSS Volume Deactivation event
*/

1537
static void registerwithneb()
unknown's avatar
unknown committed
1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588
{

  ConsumerRegistrationInfo reg_info;
    
  /* Clear NEB registration structure */
  bzero((char*) &reg_info, sizeof(struct ConsumerRegistrationInfo));

  /* Fill the NEB consumer information structure */
  reg_info.CRIVersion= 1;  	            // NEB version
  /* NEB Consumer name */
  reg_info.CRIConsumerName= (BYTE *) "MySQL Database Server";
  /* Event of interest */
  reg_info.CRIEventName= (BYTE *) "NSS.ChangeVolState.Enter";
  reg_info.CRIUserParameter= NULL;	    // Consumer Info
  reg_info.CRIEventFlags= 0;	            // Event flags
  /* Consumer NLM handle */
  reg_info.CRIOwnerID= (LoadDefinitionStructure *)getnlmhandle();
  reg_info.CRIConsumerESR= NULL;	    // No consumer ESR required
  reg_info.CRISecurityToken= 0;	            // No security token for the event
  reg_info.CRIConsumerFlags= 0;             // SMP_ENABLED_BIT;	
  reg_info.CRIFilterName= 0;	            // No event filtering
  reg_info.CRIFilterDataLength= 0;          // No filtering data
  reg_info.CRIFilterData= 0;	            // No filtering data
  /* Callback function for the event */
  (void *)reg_info.CRIConsumerCallback= (void *) refneb;
  reg_info.CRIOrder= 0;	                    // Event callback order
  reg_info.CRIConsumerType= CHECK_CONSUMER; // Consumer type

  /* Register for the event with NEB */
  if (RegisterConsumer(&reg_info))
  {
    consoleprintf("Failed to register for NSS Volume Deactivation event \n");
    return;
  }
  /* This ID is required for deregistration */
  neb_consumer_id= reg_info.CRIConsumerID;

  /* Get MySQL data volume name, stored in global variable datavolname */
  getvolumename();

  /*
    Get the NSS volume ID of the MySQL Data volume.
    Volume ID is stored in a global variable
  */
  getvolumeID((BYTE*) datavolname);	
}


/*
  Callback for NSS Volume Deactivation event
*/
1589

unknown's avatar
unknown committed
1590 1591 1592
ulong neb_event_callback(struct EventBlock *eblock)
{
  EventChangeVolStateEnter_s *voldata;
1593 1594
  extern bool nw_panic;

unknown's avatar
unknown committed
1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606
  voldata= (EventChangeVolStateEnter_s *)eblock->EBEventData;

  /* Deactivation of a volume */
  if ((voldata->oldState == 6 && voldata->newState == 2))
  {
    /*
      Ensure that we bring down MySQL server only for MySQL data
      volume deactivation
    */
    if (!memcmp(&voldata->volID, &datavolid, sizeof(VolumeID_t)))
    {
      consoleprintf("MySQL data volume is deactivated, shutting down MySQL Server \n");
1607
      nw_panic = TRUE;
unknown's avatar
unknown committed
1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620
      kill_server(0);
    }
  }
  return 0;
}


/*
  Function to get NSS volume ID of the MySQL data
*/

#define ADMIN_VOL_PATH					"_ADMIN:/Volumes/"

1621
static void getvolumeID(BYTE *volumeName)
unknown's avatar
unknown committed
1622 1623 1624 1625 1626 1627 1628
{
  char path[zMAX_FULL_NAME];
  Key_t rootKey= 0, fileKey= 0;
  QUAD getInfoMask;
  zInfo_s info;
  STATUS status;

1629
  /* Get the root key */
unknown's avatar
unknown committed
1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674
  if ((status= zRootKey(0, &rootKey)) != zOK)
  {
    consoleprintf("\nGetNSSVolumeProperties - Failed to get root key, status: %d\n.", (int) status);
    goto exit;
  }

  /*
    Get the file key. This is the key to the volume object in the
    NSS admin volumes directory.
  */

  strxmov(path, (const char *) ADMIN_VOL_PATH, (const char *) volumeName,
          NullS);
  if ((status= zOpen(rootKey, zNSS_TASK, zNSPACE_LONG|zMODE_UTF8, 
                     (BYTE *) path, zRR_READ_ACCESS, &fileKey)) != zOK)
  {
    consoleprintf("\nGetNSSVolumeProperties - Failed to get file, status: %d\n.", (int) status);
    goto exit;
  }

  getInfoMask= zGET_IDS | zGET_VOLUME_INFO ;
  if ((status= zGetInfo(fileKey, getInfoMask, sizeof(info), 
                        zINFO_VERSION_A, &info)) != zOK)
  {
    consoleprintf("\nGetNSSVolumeProperties - Failed in zGetInfo, status: %d\n.", (int) status);
    goto exit;
  }

  /* Copy the data to global variable */
  datavolid.timeLow= info.vol.volumeID.timeLow;
  datavolid.timeMid= info.vol.volumeID.timeMid;
  datavolid.timeHighAndVersion= info.vol.volumeID.timeHighAndVersion;
  datavolid.clockSeqHighAndReserved= info.vol.volumeID.clockSeqHighAndReserved;
  datavolid.clockSeqLow= info.vol.volumeID.clockSeqLow;
  /* This is guranteed to be 6-byte length (but sizeof() would be better) */
  memcpy(datavolid.node, info.vol.volumeID.node, (unsigned int) 6);
		
exit:
  if (rootKey)
    zClose(rootKey);
  if (fileKey)
    zClose(fileKey);
}


unknown's avatar
unknown committed
1675 1676 1677 1678 1679 1680 1681 1682 1683
static void init_signals(void)
{
  int signals[] = {SIGINT,SIGILL,SIGFPE,SIGSEGV,SIGTERM,SIGABRT};

  for (uint i=0 ; i < sizeof(signals)/sizeof(int) ; i++)
    signal(signals[i], kill_server);
  mysql_cb_init();  // initialize callbacks
}

unknown's avatar
unknown committed
1684

unknown's avatar
unknown committed
1685 1686 1687 1688
static void start_signal_handler(void)
{
  // Save vm id of this process
  if (!opt_bootstrap)
1689
    create_pid_file();
unknown's avatar
unknown committed
1690 1691 1692 1693
  // no signal handler
}


unknown's avatar
unknown committed
1694 1695 1696 1697 1698 1699
/*
  Warn if the data is on a Traditional volume

  NOTE
    Already done by mysqld_safe
*/
unknown's avatar
unknown committed
1700 1701

static void check_data_home(const char *path)
1702 1703 1704
{
}

unknown's avatar
unknown committed
1705 1706 1707
#elif defined(__EMX__)
static void sig_reload(int signo)
{
1708
 // Flush everything
1709
  reload_acl_and_cache((THD*) 0,REFRESH_LOG, (TABLE_LIST*) 0, NULL);
unknown's avatar
unknown committed
1710 1711 1712 1713 1714
  signal(signo, SIG_ACK);
}

static void sig_kill(int signo)
{
1715
  if (!kill_in_progress)
unknown's avatar
unknown committed
1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733
  {
    abort_loop=1;				// mark abort for threads
    kill_server((void*) signo);
  }
  signal(signo, SIG_ACK);
}

static void init_signals(void)
{
  signal(SIGQUIT, sig_kill);
  signal(SIGKILL, sig_kill);
  signal(SIGTERM, sig_kill);
  signal(SIGINT,  sig_kill);
  signal(SIGHUP,  sig_reload);	// Flush everything
  signal(SIGALRM, SIG_IGN);
  signal(SIGBREAK,SIG_IGN);
  signal_thread = pthread_self();
}
1734 1735

static void start_signal_handler(void)
unknown's avatar
unknown committed
1736
{}
1737

unknown's avatar
unknown committed
1738
static void check_data_home(const char *path)
unknown's avatar
unknown committed
1739
{}
1740

unknown's avatar
unknown committed
1741
#else /* if ! __WIN__ && ! __EMX__ */
unknown's avatar
unknown committed
1742

unknown's avatar
unknown committed
1743 1744
#ifdef HAVE_LINUXTHREADS
#define UNSAFE_DEFAULT_LINUX_THREADS 200
1745
#endif
1746

1747
extern "C" sig_handler handle_segfault(int sig)
1748
{
unknown's avatar
unknown committed
1749
  THD *thd=current_thd;
1750 1751 1752 1753 1754 1755
  /*
    Strictly speaking, one needs a mutex here
    but since we have got SIGSEGV already, things are a mess
    so not having the mutex is not as bad as possibly using a buggy
    mutex - so we keep things simple
  */
1756
  if (segfaulted)
unknown's avatar
unknown committed
1757 1758 1759 1760
  {
    fprintf(stderr, "Fatal signal %d while backtracing\n", sig);
    exit(1);
  }
1761

1762
  segfaulted = 1;
1763
  fprintf(stderr,"\
1764
mysqld got signal %d;\n\
unknown's avatar
unknown committed
1765
This could be because you hit a bug. It is also possible that this binary\n\
unknown's avatar
unknown committed
1766
or one of the libraries it was linked against is corrupt, improperly built,\n\
unknown's avatar
unknown committed
1767 1768 1769 1770 1771
or misconfigured. This error can also be caused by malfunctioning hardware.\n",
	  sig);
  fprintf(stderr, "\
We will try our best to scrape up some info that will hopefully help diagnose\n\
the problem, but since we have already crashed, something is definitely wrong\n\
unknown's avatar
unknown committed
1772
and this may fail.\n\n");
unknown's avatar
unknown committed
1773
  fprintf(stderr, "key_buffer_size=%lu\n", 
unknown's avatar
unknown committed
1774
          (ulong) sql_key_cache->key_cache_mem_size);
unknown's avatar
unknown committed
1775
  fprintf(stderr, "read_buffer_size=%ld\n", global_system_variables.read_buff_size);
unknown's avatar
unknown committed
1776 1777 1778 1779
  fprintf(stderr, "max_used_connections=%ld\n", max_used_connections);
  fprintf(stderr, "max_connections=%ld\n", max_connections);
  fprintf(stderr, "threads_connected=%d\n", thread_count);
  fprintf(stderr, "It is possible that mysqld could use up to \n\
unknown's avatar
unknown committed
1780
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_connections = %ld K\n\
unknown's avatar
unknown committed
1781
bytes of memory\n", ((ulong) sql_key_cache->key_cache_mem_size +
1782
		     (global_system_variables.read_buff_size +
unknown's avatar
unknown committed
1783
		      global_system_variables.sortbuff_size) *
1784
		     max_connections)/ 1024);
unknown's avatar
unknown committed
1785
  fprintf(stderr, "Hope that's ok; if not, decrease some variables in the equation.\n\n");
1786

1787
#if defined(HAVE_LINUXTHREADS)
unknown's avatar
unknown committed
1788 1789 1790 1791
  if (sizeof(char*) == 4 && thread_count > UNSAFE_DEFAULT_LINUX_THREADS)
  {
    fprintf(stderr, "\
You seem to be running 32-bit Linux and have %d concurrent connections.\n\
unknown's avatar
unknown committed
1792 1793
If you have not changed STACK_SIZE in LinuxThreads and built the binary \n\
yourself, LinuxThreads is quite likely to steal a part of the global heap for\n\
unknown's avatar
unknown committed
1794
the thread stack. Please read http://www.mysql.com/doc/en/Linux.html\n\n",
unknown's avatar
unknown committed
1795 1796 1797
	    thread_count);
  }
#endif /* HAVE_LINUXTHREADS */
unknown's avatar
unknown committed
1798

unknown's avatar
unknown committed
1799
#ifdef HAVE_STACKTRACE
1800
  if (!(test_flags & TEST_NO_STACKTRACE))
unknown's avatar
unknown committed
1801
  {
1802
    fprintf(stderr,"thd=%p\n",thd);
unknown's avatar
unknown committed
1803 1804
    print_stacktrace(thd ? (gptr) thd->thread_stack : (gptr) 0,
		     thread_stack);
unknown's avatar
unknown committed
1805
  }
unknown's avatar
unknown committed
1806 1807 1808 1809 1810 1811 1812 1813
  if (thd)
  {
    fprintf(stderr, "Trying to get some variables.\n\
Some pointers may be invalid and cause the dump to abort...\n");
    safe_print_str("thd->query", thd->query, 1024);
    fprintf(stderr, "thd->thread_id=%ld\n", thd->thread_id);
  }
  fprintf(stderr, "\
unknown's avatar
unknown committed
1814
The manual page at http://www.mysql.com/doc/en/Crashing.html contains\n\
unknown's avatar
unknown committed
1815
information that should help you find out what is causing the crash.\n");
1816
  fflush(stderr);
unknown's avatar
unknown committed
1817 1818
#endif /* HAVE_STACKTRACE */

1819
 if (test_flags & TEST_CORE_ON_SIGNAL)
unknown's avatar
unknown committed
1820 1821 1822
 {
   fprintf(stderr, "Writing a core file\n");
   fflush(stderr);
1823
   write_core(sig);
unknown's avatar
unknown committed
1824
 }
1825
 exit(1);
1826 1827
}

unknown's avatar
unknown committed
1828 1829 1830 1831 1832 1833
#ifndef SA_RESETHAND
#define SA_RESETHAND 0
#endif
#ifndef SA_NODEFER
#define SA_NODEFER 0
#endif
1834

unknown's avatar
unknown committed
1835 1836 1837
static void init_signals(void)
{
  sigset_t set;
1838
  struct sigaction sa;
unknown's avatar
unknown committed
1839 1840
  DBUG_ENTER("init_signals");

1841 1842
  if (test_flags & TEST_SIGINT)
    sigset(THR_KILL_SIGNAL,end_thread_signal);
unknown's avatar
unknown committed
1843
  sigset(THR_SERVER_ALARM,print_signal_warning); // Should never be called!
unknown's avatar
unknown committed
1844

unknown's avatar
unknown committed
1845
  if (!(test_flags & TEST_NO_STACKTRACE) || (test_flags & TEST_CORE_ON_SIGNAL))
unknown's avatar
unknown committed
1846
  {
unknown's avatar
unknown committed
1847 1848 1849 1850
    sa.sa_flags = SA_RESETHAND | SA_NODEFER;
    sigemptyset(&sa.sa_mask);
    sigprocmask(SIG_SETMASK,&sa.sa_mask,NULL);

unknown's avatar
unknown committed
1851
    init_stacktrace();
unknown's avatar
unknown committed
1852 1853 1854
#if defined(__amiga__)
    sa.sa_handler=(void(*)())handle_segfault;
#else
unknown's avatar
unknown committed
1855
    sa.sa_handler=handle_segfault;
unknown's avatar
unknown committed
1856
#endif
unknown's avatar
unknown committed
1857
    sigaction(SIGSEGV, &sa, NULL);
1858
    sigaction(SIGABRT, &sa, NULL);
unknown's avatar
unknown committed
1859
#ifdef SIGBUS
unknown's avatar
unknown committed
1860
    sigaction(SIGBUS, &sa, NULL);
unknown's avatar
unknown committed
1861
#endif
unknown's avatar
unknown committed
1862
    sigaction(SIGILL, &sa, NULL);
1863
    sigaction(SIGFPE, &sa, NULL);
unknown's avatar
unknown committed
1864
  }
1865 1866 1867 1868 1869 1870 1871

#ifdef HAVE_GETRLIMIT
  if (test_flags & TEST_CORE_ON_SIGNAL)
  {
    /* Change limits so that we will get a core file */
    struct rlimit rl;
    rl.rlim_cur = rl.rlim_max = RLIM_INFINITY;
unknown's avatar
unknown committed
1872
    if (setrlimit(RLIMIT_CORE, &rl) && global_system_variables.log_warnings)
1873 1874 1875
      sql_print_error("Warning: setrlimit could not change the size of core files to 'infinity';  We may not be able to generate a core file on signals");
  }
#endif
unknown's avatar
unknown committed
1876 1877 1878 1879 1880 1881 1882 1883 1884
  (void) sigemptyset(&set);
#ifdef THREAD_SPECIFIC_SIGPIPE
  sigset(SIGPIPE,abort_thread);
  sigaddset(&set,SIGPIPE);
#else
  (void) signal(SIGPIPE,SIG_IGN);		// Can't know which thread
  sigaddset(&set,SIGPIPE);
#endif
  sigaddset(&set,SIGINT);
1885
#ifndef IGNORE_SIGHUP_SIGQUIT
unknown's avatar
unknown committed
1886 1887
  sigaddset(&set,SIGQUIT);
  sigaddset(&set,SIGHUP);
1888 1889
#endif
  sigaddset(&set,SIGTERM);
1890 1891

  /* Fix signals if blocked by parents (can happen on Mac OS X) */
unknown's avatar
unknown committed
1892
  sigemptyset(&sa.sa_mask);
1893 1894 1895 1896 1897 1898
  sa.sa_flags = 0;
  sa.sa_handler = print_signal_warning;
  sigaction(SIGTERM, &sa, (struct sigaction*) 0);
  sa.sa_flags = 0;
  sa.sa_handler = print_signal_warning;
  sigaction(SIGHUP, &sa, (struct sigaction*) 0);
unknown's avatar
unknown committed
1899 1900 1901 1902
#ifdef SIGTSTP
  sigaddset(&set,SIGTSTP);
#endif
  sigaddset(&set,THR_SERVER_ALARM);
1903 1904
  if (test_flags & TEST_SIGINT)
    sigdelset(&set,THR_KILL_SIGNAL);		// May be SIGINT
unknown's avatar
unknown committed
1905
  sigdelset(&set,THR_CLIENT_ALARM);		// For alarms
1906 1907
  sigprocmask(SIG_SETMASK,&set,NULL);
  pthread_sigmask(SIG_SETMASK,&set,NULL);
1908 1909 1910 1911
  DBUG_VOID_RETURN;
}


unknown's avatar
SCRUM:  
unknown committed
1912
#ifndef EMBEDDED_LIBRARY
1913 1914 1915 1916 1917
static void start_signal_handler(void)
{
  int error;
  pthread_attr_t thr_attr;
  DBUG_ENTER("start_signal_handler");
unknown's avatar
unknown committed
1918 1919 1920 1921 1922 1923 1924

  (void) pthread_attr_init(&thr_attr);
#if !defined(HAVE_DEC_3_2_THREADS)
  pthread_attr_setscope(&thr_attr,PTHREAD_SCOPE_SYSTEM);
  (void) pthread_attr_setdetachstate(&thr_attr,PTHREAD_CREATE_DETACHED);
  if (!(opt_specialflag & SPECIAL_NO_PRIOR))
    my_pthread_attr_setprio(&thr_attr,INTERRUPT_PRIOR);
1925
  pthread_attr_setstacksize(&thr_attr,thread_stack);
unknown's avatar
unknown committed
1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942
#endif

  (void) pthread_mutex_lock(&LOCK_thread_count);
  if ((error=pthread_create(&signal_thread,&thr_attr,signal_hand,0)))
  {
    sql_print_error("Can't create interrupt-thread (error %d, errno: %d)",
		    error,errno);
    exit(1);
  }
  (void) pthread_cond_wait(&COND_thread_count,&LOCK_thread_count);
  pthread_mutex_unlock(&LOCK_thread_count);

  (void) pthread_attr_destroy(&thr_attr);
  DBUG_VOID_RETURN;
}


1943
/* This threads handles all signals and alarms */
unknown's avatar
unknown committed
1944 1945

/* ARGSUSED */
1946
extern "C" void *signal_hand(void *arg __attribute__((unused)))
unknown's avatar
unknown committed
1947 1948 1949 1950 1951
{
  sigset_t set;
  int sig;
  my_thread_init();				// Init new thread
  DBUG_ENTER("signal_hand");
unknown's avatar
unknown committed
1952 1953
  signal_thread_in_use= 1;

unknown's avatar
unknown committed
1954 1955
  /*
    Setup alarm handler
1956 1957
    This should actually be '+ max_number_of_slaves' instead of +10,
    but the +10 should be quite safe.
unknown's avatar
unknown committed
1958
  */
1959 1960
  init_thr_alarm(max_connections +
		 global_system_variables.max_insert_delayed_threads + 10);
unknown's avatar
unknown committed
1961
#if SIGINT != THR_KILL_SIGNAL
1962 1963 1964 1965 1966 1967
  if (test_flags & TEST_SIGINT)
  {
    (void) sigemptyset(&set);			// Setup up SIGINT for debug
    (void) sigaddset(&set,SIGINT);		// For debugging
    (void) pthread_sigmask(SIG_UNBLOCK,&set,NULL);
  }
unknown's avatar
unknown committed
1968 1969 1970 1971 1972
#endif
  (void) sigemptyset(&set);			// Setup up SIGINT for debug
#ifdef USE_ONE_SIGNAL_HAND
  (void) sigaddset(&set,THR_SERVER_ALARM);	// For alarms
#endif
1973
#ifndef IGNORE_SIGHUP_SIGQUIT
unknown's avatar
unknown committed
1974 1975 1976 1977
  (void) sigaddset(&set,SIGQUIT);
#if THR_CLIENT_ALARM != SIGHUP
  (void) sigaddset(&set,SIGHUP);
#endif
1978 1979
#endif
  (void) sigaddset(&set,SIGTERM);
unknown's avatar
unknown committed
1980 1981 1982
  (void) sigaddset(&set,SIGTSTP);

  /* Save pid to this process (or thread on Linux) */
1983
  if (!opt_bootstrap)
1984 1985
    create_pid_file();

1986 1987 1988 1989 1990 1991 1992
#ifdef HAVE_STACK_TRACE_ON_SEGV
  if (opt_do_pstack)
  {
    sprintf(pstack_file_name,"mysqld-%lu-%%d-%%d.backtrace", (ulong)getpid());
    pstack_install_segv_action(pstack_file_name);
  }
#endif /* HAVE_STACK_TRACE_ON_SEGV */
unknown's avatar
unknown committed
1993

1994 1995 1996 1997 1998 1999 2000
  /*
    signal to start_signal_handler that we are ready
    This works by waiting for start_signal_handler to free mutex,
    after which we signal it that we are ready.
    At this pointer there is no other threads running, so there
    should not be any other pthread_cond_signal() calls.
  */
unknown's avatar
unknown committed
2001 2002
  (void) pthread_mutex_lock(&LOCK_thread_count);
  (void) pthread_mutex_unlock(&LOCK_thread_count);
2003
  (void) pthread_cond_broadcast(&COND_thread_count);
unknown's avatar
unknown committed
2004

2005
  (void) pthread_sigmask(SIG_BLOCK,&set,NULL);
unknown's avatar
unknown committed
2006 2007 2008 2009 2010
  for (;;)
  {
    int error;					// Used when debugging
    if (shutdown_in_progress && !abort_loop)
    {
2011
      sig= SIGTERM;
unknown's avatar
unknown committed
2012 2013 2014 2015 2016
      error=0;
    }
    else
      while ((error=my_sigwait(&set,&sig)) == EINTR) ;
    if (cleanup_done)
2017 2018
    {
      my_thread_end();
unknown's avatar
unknown committed
2019
      signal_thread_in_use= 0;
unknown's avatar
unknown committed
2020
      pthread_exit(0);				// Safety
2021
    }
unknown's avatar
unknown committed
2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040
    switch (sig) {
    case SIGTERM:
    case SIGQUIT:
    case SIGKILL:
#ifdef EXTRA_DEBUG
      sql_print_error("Got signal %d to shutdown mysqld",sig);
#endif
      DBUG_PRINT("info",("Got signal: %d  abort_loop: %d",sig,abort_loop));
      if (!abort_loop)
      {
	abort_loop=1;				// mark abort for threads
#ifdef USE_ONE_SIGNAL_HAND
	pthread_t tmp;
	if (!(opt_specialflag & SPECIAL_NO_PRIOR))
	  my_pthread_attr_setprio(&connection_attrib,INTERRUPT_PRIOR);
	if (pthread_create(&tmp,&connection_attrib, kill_server_thread,
			   (void*) sig))
	  sql_print_error("Error: Can't create thread to kill server");
#else
unknown's avatar
unknown committed
2041
	kill_server((void*) sig);	// MIT THREAD has a alarm thread
unknown's avatar
unknown committed
2042 2043 2044 2045
#endif
      }
      break;
    case SIGHUP:
unknown's avatar
unknown committed
2046 2047 2048 2049 2050 2051
      if (!abort_loop)
      {
	reload_acl_and_cache((THD*) 0,
			     (REFRESH_LOG | REFRESH_TABLES | REFRESH_FAST |
			      REFRESH_STATUS | REFRESH_GRANT |
			      REFRESH_THREADS | REFRESH_HOSTS),
2052
			     (TABLE_LIST*) 0, NULL); // Flush logs
unknown's avatar
unknown committed
2053 2054
	mysql_print_status((THD*) 0);		// Send debug some info
      }
unknown's avatar
unknown committed
2055 2056 2057 2058 2059 2060 2061 2062
      break;
#ifdef USE_ONE_SIGNAL_HAND
    case THR_SERVER_ALARM:
      process_alarm(sig);			// Trigger alarms.
      break;
#endif
    default:
#ifdef EXTRA_DEBUG
2063
      sql_print_error("Warning: Got signal: %d  error: %d",sig,error); /* purecov: tested */
unknown's avatar
unknown committed
2064 2065 2066 2067 2068 2069
#endif
      break;					/* purecov: tested */
    }
  }
  return(0);					/* purecov: deadcode */
}
unknown's avatar
SCRUM:  
unknown committed
2070
#endif /*!EMBEDDED_LIBRARY*/
unknown's avatar
unknown committed
2071

unknown's avatar
unknown committed
2072
static void check_data_home(const char *path)
unknown's avatar
unknown committed
2073
{}
unknown's avatar
unknown committed
2074

unknown's avatar
unknown committed
2075 2076 2077 2078
#endif	/* __WIN__*/


/*
2079 2080
  All global error messages are sent here where the first one is stored for
  the client
unknown's avatar
unknown committed
2081 2082 2083 2084
*/


/* ARGSUSED */
2085 2086
extern "C" int my_message_sql(uint error, const char *str,
			      myf MyFlags __attribute__((unused)))
unknown's avatar
unknown committed
2087
{
2088
  THD *thd;
unknown's avatar
unknown committed
2089
  DBUG_ENTER("my_message_sql");
2090 2091
  DBUG_PRINT("error", ("Message: '%s'", str));
  if ((thd= current_thd))
unknown's avatar
unknown committed
2092
  {
unknown's avatar
unknown committed
2093
    /*
2094
      thd->lex->current_select == 0 if lex structure is not inited
unknown's avatar
unknown committed
2095 2096
      (not query command (COM_QUERY))
    */
2097 2098
    if (thd->lex->current_select &&
	thd->lex->current_select->no_error && !thd->is_fatal_error)
unknown's avatar
unknown committed
2099
    {
2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111
      DBUG_PRINT("error", ("above error converted to warning"));
      push_warning(thd, MYSQL_ERROR::WARN_LEVEL_ERROR, error, str);
    }
    else
    {
      NET *net= &thd->net;
      net->report_error= 1;
      if (!net->last_error[0])			// Return only first message
      {
	strmake(net->last_error, str, sizeof(net->last_error)-1);
	net->last_errno= error ? error : ER_UNKNOWN_ERROR;
      }
unknown's avatar
unknown committed
2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125
    }
  }
  else
    sql_print_error("%s: %s",my_progname,str); /* purecov: inspected */
  DBUG_RETURN(0);
}

#ifdef __WIN__

struct utsname
{
  char nodename[FN_REFLEN];
};

unknown's avatar
unknown committed
2126

unknown's avatar
unknown committed
2127 2128 2129 2130 2131 2132
int uname(struct utsname *a)
{
  return -1;
}


2133
extern "C" pthread_handler_decl(handle_shutdown,arg)
unknown's avatar
unknown committed
2134 2135 2136 2137 2138 2139
{
  MSG msg;
  my_thread_init();

  /* this call should create the message queue for this thread */
  PeekMessage(&msg, NULL, 1, 65534,PM_NOREMOVE);
unknown's avatar
unknown committed
2140
#if !defined(EMBEDDED_LIBRARY)
unknown's avatar
unknown committed
2141
  if (WaitForSingleObject(hEventShutdown,INFINITE)==WAIT_OBJECT_0)
2142
#endif /* EMBEDDED_LIBRARY */
unknown's avatar
unknown committed
2143 2144 2145 2146
     kill_server(MYSQL_KILL_SIGNAL);
  return 0;
}

unknown's avatar
unknown committed
2147

unknown's avatar
unknown committed
2148
int STDCALL handle_kill(ulong ctrl_type)
unknown's avatar
unknown committed
2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159
{
  if (ctrl_type == CTRL_CLOSE_EVENT ||
      ctrl_type == CTRL_SHUTDOWN_EVENT)
  {
    kill_server(MYSQL_KILL_SIGNAL);
    return TRUE;
  }
  return FALSE;
}
#endif

2160

unknown's avatar
unknown committed
2161
#ifdef OS2
2162
extern "C" pthread_handler_decl(handle_shutdown,arg)
unknown's avatar
unknown committed
2163 2164 2165 2166 2167 2168 2169 2170 2171
{
  my_thread_init();

  // wait semaphore
  pthread_cond_wait( &eventShutdown, NULL);

  // close semaphore and kill server
  pthread_cond_destroy( &eventShutdown);

2172 2173 2174 2175
  /*
    Exit main loop on main thread, so kill will be done from
    main thread (this is thread 2)
  */
unknown's avatar
unknown committed
2176 2177 2178
  abort_loop = 1;

  // unblock select()
2179 2180
  so_cancel(ip_sock);
  so_cancel(unix_sock);
unknown's avatar
unknown committed
2181 2182 2183 2184 2185

  return 0;
}
#endif

2186

2187
const char *load_default_groups[]= { "mysqld","server",MYSQL_BASE_VERSION,0,0};
unknown's avatar
unknown committed
2188

2189 2190 2191 2192
bool open_log(MYSQL_LOG *log, const char *hostname,
	      const char *opt_name, const char *extension,
	      const char *index_file_name,
	      enum_log_type type, bool read_append,
2193
	      bool no_auto_events, ulong max_size)
unknown's avatar
unknown committed
2194 2195 2196 2197
{
  char tmp[FN_REFLEN];
  if (!opt_name || !opt_name[0])
  {
2198 2199 2200
    /*
      TODO: The following should be using fn_format();  We just need to
      first change fn_format() to cut the file name if it's too long.
unknown's avatar
unknown committed
2201 2202
    */
    strmake(tmp,hostname,FN_REFLEN-5);
2203
    strmov(fn_ext(tmp),extension);
unknown's avatar
unknown committed
2204 2205
    opt_name=tmp;
  }
2206
  // get rid of extension if the log is binary to avoid problems
2207 2208
  if (type == LOG_BIN)
  {
unknown's avatar
unknown committed
2209
    char *p = fn_ext(opt_name);
unknown's avatar
unknown committed
2210 2211 2212
    uint length=(uint) (p-opt_name);
    strmake(tmp,opt_name,min(length,FN_REFLEN));
    opt_name=tmp;
2213
  }
2214 2215
  return log->open(opt_name, type, 0, index_file_name,
		   (read_append) ? SEQ_READ_APPEND : WRITE_CACHE,
2216
		   no_auto_events, max_size);
unknown's avatar
unknown committed
2217 2218 2219
}


2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238
/*
  Initialize one of the global date/time format variables

  SYNOPSIS
    init_global_datetime_format()
    format_type		What kind of format should be supported
    var_ptr		Pointer to variable that should be updated
  
  NOTES
    The default value is taken from either opt_date_time_formats[] or
    the ISO format (ANSI SQL)

  RETURN
    0 ok
    1 error
*/

bool init_global_datetime_format(timestamp_type format_type,
				 DATE_TIME_FORMAT **var_ptr)
2239
{
2240 2241
  /* Get command line option */
  const char *str= opt_date_time_formats[format_type];
2242

2243
  if (!str)					// No specified format
2244
  {
2245 2246 2247 2248 2249 2250 2251
    str= get_date_time_format_str(&known_date_time_formats[ISO_FORMAT],
				  format_type);
    /*
      Set the "command line" option to point to the generated string so
      that we can set global formats back to default
    */
    opt_date_time_formats[format_type]= str;
2252
  }
2253
  if (!(*var_ptr= date_time_format_make(format_type, str, strlen(str))))
2254
  {
2255 2256
    fprintf(stderr, "Wrong date/time format specifier: %s\n", str);
    return 1;
2257
  }
2258
  return 0;
2259 2260 2261
}


2262 2263
static int init_common_variables(const char *conf_file_name, int argc,
				 char **argv, const char **groups)
unknown's avatar
unknown committed
2264 2265 2266
{
  my_umask=0660;		// Default umask for new files
  my_umask_dir=0700;		// Default umask for new directories
unknown's avatar
unknown committed
2267
  umask(((~my_umask) & 0666));
unknown's avatar
unknown committed
2268 2269
  tzset();			// Set tzname

unknown's avatar
SCRUM  
unknown committed
2270
  max_system_variables.pseudo_thread_id= (ulong)~0;
unknown's avatar
unknown committed
2271
  start_time=time((time_t*) 0);
unknown's avatar
unknown committed
2272 2273
  if (init_thread_environment())
    return 1;
unknown's avatar
unknown committed
2274
  mysql_init_variables();
unknown's avatar
unknown committed
2275

unknown's avatar
unknown committed
2276 2277 2278 2279 2280 2281 2282 2283
#ifdef OS2
  {
    // fix timezone for daylight saving
    struct tm *ts = localtime(&start_time);
    if (ts->tm_isdst > 0)
      _timezone -= 3600;
  }
#endif
unknown's avatar
unknown committed
2284 2285 2286 2287
#ifdef HAVE_TZNAME
  {
    struct tm tm_tmp;
    localtime_r(&start_time,&tm_tmp);
2288
    strmov(system_time_zone, tzname[tm_tmp.tm_isdst != 0 ? 1 : 0]);
unknown's avatar
unknown committed
2289 2290
  }
#endif
2291 2292 2293 2294 2295 2296 2297 2298
  /*
    We set SYSTEM time zone as reasonable default and 
    also for failure of my_tz_init() and bootstrap mode.
    If user explicitly set time zone with --default-time-zone
    option we will change this value in my_tz_init().
  */
  global_system_variables.time_zone= my_tz_SYSTEM;
  
unknown's avatar
unknown committed
2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309
  /*
    Init mutexes for the global MYSQL_LOG objects.
    As safe_mutex depends on what MY_INIT() does, we can't init the mutexes of
    global MYSQL_LOGs in their constructors, because then they would be inited
    before MY_INIT(). So we do it here.
  */
  mysql_log.init_pthread_objects();
  mysql_update_log.init_pthread_objects();
  mysql_slow_log.init_pthread_objects();
  mysql_bin_log.init_pthread_objects();
  
unknown's avatar
unknown committed
2310 2311
  if (gethostname(glob_hostname,sizeof(glob_hostname)-4) < 0)
    strmov(glob_hostname,"mysql");
unknown's avatar
unknown committed
2312
  strmake(pidfile_name, glob_hostname, sizeof(pidfile_name)-5);
2313
  strmov(fn_ext(pidfile_name),".pid");		// Add proper extension
unknown's avatar
unknown committed
2314

unknown's avatar
unknown committed
2315 2316
  load_defaults(conf_file_name, groups, &argc, &argv);
  defaults_argv=argv;
unknown's avatar
unknown committed
2317
  get_options(argc,argv);
2318 2319
  set_server_version();

unknown's avatar
unknown committed
2320 2321 2322
  DBUG_PRINT("info",("%s  Ver %s for %s on %s\n",my_progname,
		     server_version, SYSTEM_TYPE,MACHINE_TYPE));

unknown's avatar
unknown committed
2323 2324
  /* connections and databases needs lots of files */
  {
2325 2326 2327 2328
    uint files, wanted_files;

    wanted_files= 10+(uint) max(max_connections*5,
				 max_connections+table_cache_size*2);
unknown's avatar
unknown committed
2329
    set_if_bigger(wanted_files, open_files_limit);
2330 2331 2332
    files= my_set_max_open_files(wanted_files);

    if (files < wanted_files)
unknown's avatar
unknown committed
2333
    {
2334 2335 2336 2337 2338 2339 2340
      if (!open_files_limit)
      {
	max_connections=	(ulong) min((files-10),max_connections);
	table_cache_size= (ulong) max((files-10-max_connections)/2,64);
	DBUG_PRINT("warning",
		   ("Changed limits: max_open_files: %u  max_connections: %ld  table_cache: %ld",
		    files, max_connections, table_cache_size));
unknown's avatar
unknown committed
2341 2342
	if (global_system_variables.log_warnings)
	  sql_print_error("Warning: Changed limits: max_open_files: %u  max_connections: %ld  table_cache: %ld",
2343 2344
			files, max_connections, table_cache_size);
      }
unknown's avatar
unknown committed
2345
      else if (global_system_variables.log_warnings)
2346
	sql_print_error("Warning: Could not increase number of max_open_files to more than %u (request: %u)", files, wanted_files);
unknown's avatar
unknown committed
2347
    }
unknown's avatar
unknown committed
2348
    open_files_limit= files;
unknown's avatar
unknown committed
2349 2350
  }
  unireg_init(opt_specialflag); /* Set up extern variabels */
2351 2352
  if (init_errmessage())	/* Read error messages from file */
    return 1;
2353
  init_client_errs();
unknown's avatar
unknown committed
2354 2355 2356 2357 2358
  lex_init();
  item_init();
  set_var_init();
  mysys_uses_curses=0;
#ifdef USE_REGEX
unknown's avatar
unknown committed
2359
  regex_init(&my_charset_latin1);
unknown's avatar
unknown committed
2360
#endif
2361
  if (!(default_charset_info= get_charset_by_csname(default_character_set_name,
2362 2363
						    MY_CS_PRIMARY,
						    MYF(MY_WME))))
unknown's avatar
unknown committed
2364
    return 1;
2365 2366
  if (default_collation_name)
  {
unknown's avatar
unknown committed
2367 2368
    CHARSET_INFO *default_collation;
    default_collation= get_charset_by_name(default_collation_name, MYF(0));
unknown's avatar
unknown committed
2369 2370 2371 2372 2373 2374
    if (!default_collation)
    {
      sql_print_error(ER(ER_UNKNOWN_COLLATION), default_collation_name);
      return 1;
    }
    if (!my_charset_same(default_charset_info, default_collation))
2375 2376 2377 2378 2379 2380 2381 2382
    {
      sql_print_error(ER(ER_COLLATION_CHARSET_MISMATCH),
		      default_collation_name,
		      default_charset_info->csname);
      return 1;
    }
    default_charset_info= default_collation;
  }
2383 2384 2385 2386
  /* Set collactions that depends on the default collation */
  global_system_variables.collation_server=	 default_charset_info;
  global_system_variables.collation_database=	 default_charset_info;
  global_system_variables.collation_connection=  default_charset_info;
2387
  global_system_variables.character_set_results= default_charset_info;
2388
  global_system_variables.character_set_client= default_charset_info;
unknown's avatar
unknown committed
2389
  global_system_variables.collation_connection= default_charset_info;
2390

unknown's avatar
SCRUM:  
unknown committed
2391 2392 2393
  sys_init_connect.value_length= 0;
  if ((sys_init_connect.value= opt_init_connect))
    sys_init_connect.value_length= strlen(opt_init_connect);
2394 2395
  else
    sys_init_connect.value=my_strdup("",MYF(0));
unknown's avatar
SCRUM:  
unknown committed
2396 2397 2398 2399

  sys_init_slave.value_length= 0;
  if ((sys_init_slave.value= opt_init_slave))
    sys_init_slave.value_length= strlen(opt_init_slave);
2400 2401
  else
    sys_init_slave.value=my_strdup("",MYF(0));
2402

unknown's avatar
unknown committed
2403
  if (use_temp_pool && bitmap_init(&temp_pool,0,1024,1))
2404
    return 1;
unknown's avatar
unknown committed
2405 2406 2407
  if (my_dbopt_init())
    return 1;

unknown's avatar
unknown committed
2408 2409
  return 0;
}
unknown's avatar
unknown committed
2410

2411 2412

static int init_thread_environment()
unknown's avatar
unknown committed
2413
{
2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428
  (void) pthread_mutex_init(&LOCK_mysql_create_db,MY_MUTEX_INIT_SLOW);
  (void) pthread_mutex_init(&LOCK_Acl,MY_MUTEX_INIT_SLOW);
  (void) pthread_mutex_init(&LOCK_open,MY_MUTEX_INIT_FAST);
  (void) pthread_mutex_init(&LOCK_thread_count,MY_MUTEX_INIT_FAST);
  (void) pthread_mutex_init(&LOCK_mapped_file,MY_MUTEX_INIT_SLOW);
  (void) pthread_mutex_init(&LOCK_status,MY_MUTEX_INIT_FAST);
  (void) pthread_mutex_init(&LOCK_error_log,MY_MUTEX_INIT_FAST);
  (void) pthread_mutex_init(&LOCK_delayed_insert,MY_MUTEX_INIT_FAST);
  (void) pthread_mutex_init(&LOCK_delayed_status,MY_MUTEX_INIT_FAST);
  (void) pthread_mutex_init(&LOCK_delayed_create,MY_MUTEX_INIT_SLOW);
  (void) pthread_mutex_init(&LOCK_manager,MY_MUTEX_INIT_FAST);
  (void) pthread_mutex_init(&LOCK_crypt,MY_MUTEX_INIT_FAST);
  (void) pthread_mutex_init(&LOCK_bytes_sent,MY_MUTEX_INIT_FAST);
  (void) pthread_mutex_init(&LOCK_bytes_received,MY_MUTEX_INIT_FAST);
  (void) pthread_mutex_init(&LOCK_user_conn, MY_MUTEX_INIT_FAST);
2429
  (void) pthread_mutex_init(&LOCK_active_mi, MY_MUTEX_INIT_FAST);
2430
  (void) pthread_mutex_init(&LOCK_global_system_variables, MY_MUTEX_INIT_FAST);
unknown's avatar
unknown committed
2431
  (void) pthread_mutex_init(&LOCK_uuid_generator, MY_MUTEX_INIT_FAST);
unknown's avatar
SCRUM:  
unknown committed
2432 2433
  (void) my_rwlock_init(&LOCK_sys_init_connect, NULL);
  (void) my_rwlock_init(&LOCK_sys_init_slave, NULL);
2434
  (void) my_rwlock_init(&LOCK_grant, NULL);
unknown's avatar
unknown committed
2435 2436 2437 2438
  (void) pthread_cond_init(&COND_thread_count,NULL);
  (void) pthread_cond_init(&COND_refresh,NULL);
  (void) pthread_cond_init(&COND_thread_cache,NULL);
  (void) pthread_cond_init(&COND_flush_thread_cache,NULL);
2439
  (void) pthread_cond_init(&COND_manager,NULL);
unknown's avatar
SCRUM  
unknown committed
2440
#ifdef HAVE_REPLICATION
2441
  (void) pthread_mutex_init(&LOCK_rpl_status, MY_MUTEX_INIT_FAST);
2442
  (void) pthread_cond_init(&COND_rpl_status, NULL);
2443
#endif
unknown's avatar
unknown committed
2444 2445 2446 2447 2448
  /* Parameter for threads created for connections */
  (void) pthread_attr_init(&connection_attrib);
  (void) pthread_attr_setdetachstate(&connection_attrib,
				     PTHREAD_CREATE_DETACHED);
  pthread_attr_setscope(&connection_attrib, PTHREAD_SCOPE_SYSTEM);
2449 2450
  if (!(opt_specialflag & SPECIAL_NO_PRIOR))
    my_pthread_attr_setprio(&connection_attrib,WAIT_PRIOR);
unknown's avatar
unknown committed
2451

unknown's avatar
unknown committed
2452 2453 2454 2455 2456 2457 2458 2459 2460
  if (pthread_key_create(&THR_THD,NULL) ||
      pthread_key_create(&THR_MALLOC,NULL))
  {
    sql_print_error("Can't create thread-keys");
    return 1;
  }
  return 0;
}

2461

unknown's avatar
unknown committed
2462 2463
static void init_ssl()
{
unknown's avatar
unknown committed
2464 2465 2466
#ifdef HAVE_OPENSSL
  if (opt_use_ssl)
  {
2467 2468 2469 2470
    /* having ssl_acceptor_fd != 0 signals the use of SSL */
    ssl_acceptor_fd= new_VioSSLAcceptorFd(opt_ssl_key, opt_ssl_cert,
					  opt_ssl_ca, opt_ssl_capath,
					  opt_ssl_cipher);
unknown's avatar
unknown committed
2471
    DBUG_PRINT("info",("ssl_acceptor_fd: %lx", (long) ssl_acceptor_fd));
unknown's avatar
unknown committed
2472
    if (!ssl_acceptor_fd)
unknown's avatar
unknown committed
2473
      opt_use_ssl = 0;
unknown's avatar
unknown committed
2474
  }
unknown's avatar
unknown committed
2475 2476
  if (des_key_file)
    load_des_key_file(des_key_file);
unknown's avatar
unknown committed
2477
#endif /* HAVE_OPENSSL */
unknown's avatar
unknown committed
2478
}
unknown's avatar
unknown committed
2479

2480

unknown's avatar
unknown committed
2481 2482
static int init_server_components()
{
2483
  DBUG_ENTER("init_server_components");
2484 2485
  if (table_cache_init() || hostname_cache_init())
    unireg_abort(1);
unknown's avatar
unknown committed
2486

unknown's avatar
unknown committed
2487
  query_cache_result_size_limit(query_cache_limit);
2488
  query_cache_set_min_res_unit(query_cache_min_res_unit);
unknown's avatar
unknown committed
2489
  query_cache_resize(query_cache_size);
unknown's avatar
unknown committed
2490 2491 2492
  randominit(&sql_rand,(ulong) start_time,(ulong) start_time/2);
  reset_floating_point_exceptions();
  init_thr_lock();
unknown's avatar
SCRUM  
unknown committed
2493
#ifdef HAVE_REPLICATION
2494
  init_slave_list();
2495
#endif
unknown's avatar
unknown committed
2496 2497
  /* Setup log files */
  if (opt_log)
2498
    open_log(&mysql_log, glob_hostname, opt_logname, ".log", NullS,
2499
	     LOG_NORMAL, 0, 0, 0);
unknown's avatar
unknown committed
2500
  if (opt_update_log)
unknown's avatar
unknown committed
2501
  {
unknown's avatar
unknown committed
2502
    open_log(&mysql_update_log, glob_hostname, opt_update_logname, "",
unknown's avatar
unknown committed
2503
	     NullS, LOG_NEW, 0, 0, 0);
unknown's avatar
unknown committed
2504 2505
    using_update_log=1;
  }
unknown's avatar
unknown committed
2506
  if (opt_slow_log)
unknown's avatar
unknown committed
2507
    open_log(&mysql_slow_log, glob_hostname, opt_slow_logname, "-slow.log",
unknown's avatar
unknown committed
2508
 	     NullS, LOG_NORMAL, 0, 0, 0);
2509 2510 2511 2512

  if (opt_bin_log)
  {
    open_log(&mysql_bin_log, glob_hostname, opt_bin_logname, "-bin",
unknown's avatar
unknown committed
2513
	     opt_binlog_index_name, LOG_BIN, 0, 0, max_binlog_size);
2514
    using_update_log=1;
unknown's avatar
unknown committed
2515
#ifdef HAVE_REPLICATION
unknown's avatar
unknown committed
2516 2517 2518 2519
    if (expire_logs_days)
    {
      long purge_time= time(0) - expire_logs_days*24*60*60;
      if (purge_time >= 0)
2520
	mysql_bin_log.purge_logs_before_date(purge_time);
unknown's avatar
unknown committed
2521
    }
unknown's avatar
unknown committed
2522
#endif
2523
  }
unknown's avatar
unknown committed
2524 2525 2526 2527 2528 2529
  else if (opt_log_slave_updates)
  {
      sql_print_error("\
Warning: you need to use --log-bin to make --log-slave-updates work. \
Now disabling --log-slave-updates.");
  }
2530

unknown's avatar
unknown committed
2531
#ifdef HAVE_REPLICATION
unknown's avatar
unknown committed
2532 2533 2534 2535 2536 2537 2538 2539
  if (opt_log_slave_updates && replicate_same_server_id)
  {
    sql_print_error("\
Error: using --replicate-same-server-id in conjunction with \
--log-slave-updates is impossible, it would lead to infinite loops in this \
server.");
    unireg_abort(1);
  }
unknown's avatar
unknown committed
2540
#endif
2541 2542

  if (opt_error_log)
2543
  {
2544
    if (!log_error_file_ptr[0])
2545 2546
      fn_format(log_error_file, glob_hostname, mysql_data_home, ".err",
                MY_REPLACE_EXT); /* replace '.<domain>' by '.err', bug#4997 */
2547 2548 2549 2550 2551
    else
      fn_format(log_error_file, log_error_file_ptr, mysql_data_home, ".err",
		MY_UNPACK_FILENAME | MY_SAFE_PATH);
    if (!log_error_file[0])
      opt_error_log= 1;				// Too long file name
unknown's avatar
unknown committed
2552 2553
    else
    {
unknown's avatar
unknown committed
2554
#ifndef EMBEDDED_LIBRARY
unknown's avatar
unknown committed
2555
      if (freopen(log_error_file, "a+", stdout))
unknown's avatar
unknown committed
2556
#endif
2557 2558
	freopen(log_error_file, "a+", stderr);
    }
2559
  }
unknown's avatar
unknown committed
2560

unknown's avatar
unknown committed
2561 2562
  if (opt_innodb_safe_binlog)
  {
2563
    if (have_innodb != SHOW_OPTION_YES)
2564
      sql_print_error("Warning: --innodb-safe-binlog is meaningful only if "
2565
                      "the InnoDB storage engine is enabled in the server.");
unknown's avatar
unknown committed
2566
#ifdef HAVE_INNOBASE_DB
unknown's avatar
unknown committed
2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592
    if (innobase_flush_log_at_trx_commit != 1)
    {
      sql_print_error("Warning: --innodb-safe-binlog is meaningful only if "
                      "innodb_flush_log_at_trx_commit is 1; now setting it "
                      "to 1.");
      innobase_flush_log_at_trx_commit= 1;
    }
    if (innobase_unix_file_flush_method)
    {
      /*
        This option has so many values that it's hard to know which value is
        good (especially "littlesync", and on Windows... see
        srv/srv0start.c).
      */
      sql_print_error("Warning: --innodb-safe-binlog requires that "
                      "the innodb_flush_method actually synchronizes the "
                      "InnoDB log to disk; it is your responsibility "
                      "to verify that the method you chose does it.");
    }
    if (sync_binlog_period != 1)
    {
      sql_print_error("Warning: --innodb-safe-binlog is meaningful only if "
                      "the global sync_binlog variable is 1; now setting it "
                      "to 1.");
      sync_binlog_period= 1;
    }
unknown's avatar
unknown committed
2593
#endif
unknown's avatar
unknown committed
2594 2595
  }

unknown's avatar
unknown committed
2596 2597 2598
  if (ha_init())
  {
    sql_print_error("Can't init databases");
unknown's avatar
unknown committed
2599
    unireg_abort(1);
unknown's avatar
unknown committed
2600
  }
2601 2602
  if (opt_myisam_log)
    (void) mi_log(1);
unknown's avatar
unknown committed
2603

unknown's avatar
unknown committed
2604 2605 2606 2607 2608 2609
  /*
    Now that InnoDB is initialized, we can know the last good binlog position
    and cut the binlog if needed. This function does nothing if there was no
    crash recovery by InnoDB.
  */
  if (opt_innodb_safe_binlog)
unknown's avatar
unknown committed
2610
  {
unknown's avatar
unknown committed
2611 2612
    /* not fatal if fails (but print errors) */
    mysql_bin_log.cut_spurious_tail();
unknown's avatar
unknown committed
2613
  }
unknown's avatar
unknown committed
2614 2615
  mysql_bin_log.report_pos_in_innodb();

2616 2617 2618
  /* call ha_init_key_cache() on all key caches to init them */
  process_key_caches(&ha_init_key_cache);
  /* We must set dflt_key_cache in case we are using ISAM tables */
unknown's avatar
unknown committed
2619
  dflt_key_cache= sql_key_cache;
unknown's avatar
unknown committed
2620

unknown's avatar
unknown committed
2621
#if defined(HAVE_MLOCKALL) && defined(MCL_CURRENT)
2622 2623 2624 2625
  if (locked_in_memory && !geteuid())
  {
    if (mlockall(MCL_CURRENT))
    {
2626 2627
      if (global_system_variables.log_warnings)
	sql_print_error("Warning: Failed to lock memory. Errno: %d\n",errno);
unknown's avatar
unknown committed
2628
      locked_in_memory= 0;
2629 2630 2631 2632
    }
  }
#else
  locked_in_memory=0;
2633
#endif
2634

2635
  ft_init_stopwords();
unknown's avatar
unknown committed
2636

unknown's avatar
unknown committed
2637
  init_max_user_conn();
2638
  init_update_queries();
2639
  DBUG_RETURN(0);
unknown's avatar
unknown committed
2640
}
unknown's avatar
unknown committed
2641

2642

unknown's avatar
unknown committed
2643 2644 2645 2646
static void create_maintenance_thread()
{
  if (
#ifdef HAVE_BERKELEY_DB
2647
      (have_berkeley_db == SHOW_OPTION_YES) ||
unknown's avatar
unknown committed
2648 2649
#endif
      (flush_time && flush_time != ~(ulong) 0L))
unknown's avatar
unknown committed
2650
  {
unknown's avatar
unknown committed
2651 2652 2653
    pthread_t hThread;
    if (pthread_create(&hThread,&connection_attrib,handle_manager,0))
      sql_print_error("Warning: Can't create thread to manage maintenance");
unknown's avatar
unknown committed
2654
  }
unknown's avatar
unknown committed
2655 2656
}

2657

unknown's avatar
unknown committed
2658 2659
static void create_shutdown_thread()
{
2660
#if !defined(EMBEDDED_LIBRARY)
unknown's avatar
unknown committed
2661
#ifdef __WIN__
2662 2663 2664 2665
  hEventShutdown=CreateEvent(0, FALSE, FALSE, shutdown_event_name);
  pthread_t hThread;
  if (pthread_create(&hThread,&connection_attrib,handle_shutdown,0))
    sql_print_error("Warning: Can't create thread to handle shutdown requests");
unknown's avatar
unknown committed
2666

2667 2668
  // On "Stop Service" we have to do regular shutdown
  Service.SetShutdownEvent(hEventShutdown);
unknown's avatar
unknown committed
2669
#endif
unknown's avatar
unknown committed
2670
#ifdef OS2
2671 2672 2673 2674
  pthread_cond_init(&eventShutdown, NULL);
  pthread_t hThread;
  if (pthread_create(&hThread,&connection_attrib,handle_shutdown,0))
    sql_print_error("Warning: Can't create thread to handle shutdown requests");
unknown's avatar
unknown committed
2675
#endif
2676
#endif // EMBEDDED_LIBRARY 
unknown's avatar
unknown committed
2677
}
unknown's avatar
unknown committed
2678

2679 2680 2681

#if defined(__NT__) || defined(HAVE_SMEM)
static void handle_connections_methods()
unknown's avatar
unknown committed
2682
{
2683 2684 2685
  pthread_t hThread;
  DBUG_ENTER("handle_connections_methods");
#ifdef __NT__
unknown's avatar
unknown committed
2686
  if (hPipe == INVALID_HANDLE_VALUE &&
2687 2688
      (!have_tcpip || opt_disable_networking) &&
      !opt_enable_shared_memory)
unknown's avatar
unknown committed
2689
  {
2690 2691
    sql_print_error("TCP/IP,--shared-memory or --named-pipe should be configured on NT OS");
    unireg_abort(1);				// Will not return
unknown's avatar
unknown committed
2692
  }
2693 2694 2695 2696 2697 2698 2699
#endif

  pthread_mutex_lock(&LOCK_thread_count);
  (void) pthread_cond_init(&COND_handler_count,NULL);
  handler_count=0;
#ifdef __NT__
  if (hPipe != INVALID_HANDLE_VALUE)
unknown's avatar
unknown committed
2700
  {
2701 2702 2703
    handler_count++;
    if (pthread_create(&hThread,&connection_attrib,
		       handle_connections_namedpipes, 0))
unknown's avatar
unknown committed
2704
    {
2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728
      sql_print_error("Warning: Can't create thread to handle named pipes");
      handler_count--;
    }
  }
#endif /* __NT__ */
  if (have_tcpip && !opt_disable_networking)
  {
    handler_count++;
    if (pthread_create(&hThread,&connection_attrib,
		       handle_connections_sockets, 0))
    {
      sql_print_error("Warning: Can't create thread to handle TCP/IP");
      handler_count--;
    }
  }
#ifdef HAVE_SMEM
  if (opt_enable_shared_memory)
  {
    handler_count++;
    if (pthread_create(&hThread,&connection_attrib,
		       handle_connections_shared_memory, 0))
    {
      sql_print_error("Warning: Can't create thread to handle shared memory");
      handler_count--;
unknown's avatar
unknown committed
2729 2730
    }
  }
2731
#endif 
unknown's avatar
unknown committed
2732

2733 2734 2735 2736 2737
  while (handler_count > 0)
    pthread_cond_wait(&COND_handler_count,&LOCK_thread_count);
  pthread_mutex_unlock(&LOCK_thread_count);
  DBUG_VOID_RETURN;
}
2738 2739 2740 2741 2742 2743 2744 2745 2746 2747

void decrement_handler_count()
{
  pthread_mutex_lock(&LOCK_thread_count);
  handler_count--;
  pthread_mutex_unlock(&LOCK_thread_count);
  pthread_cond_signal(&COND_handler_count);
}
#else
#define decrement_handler_count()
2748 2749 2750
#endif /* defined(__NT__) || defined(HAVE_SMEM) */


2751
#ifndef EMBEDDED_LIBRARY
unknown's avatar
unknown committed
2752 2753 2754 2755 2756 2757 2758 2759
#ifdef __WIN__
int win_main(int argc, char **argv)
#else
int main(int argc, char **argv)
#endif
{
  DEBUGGER_OFF;

2760 2761
  MY_INIT(argv[0]);		// init my_sys library & pthreads

unknown's avatar
unknown committed
2762
#ifdef _CUSTOMSTARTUPCONFIG_
unknown's avatar
unknown committed
2763 2764 2765 2766 2767 2768
  if (_cust_check_startup())
  {
    / * _cust_check_startup will report startup failure error * /
    exit( 1 );
  }
#endif
unknown's avatar
unknown committed
2769

2770 2771 2772
  if (init_common_variables(MYSQL_CONFIG_NAME,
			    argc, argv, load_default_groups))
    unireg_abort(1);				// Will do exit
unknown's avatar
unknown committed
2773 2774 2775 2776

  init_signals();
  if (!(opt_specialflag & SPECIAL_NO_PRIOR))
    my_pthread_setprio(pthread_self(),CONNECT_PRIOR);
2777
  pthread_attr_setstacksize(&connection_attrib,thread_stack);
2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792
#ifdef HAVE_PTHREAD_ATTR_GETSTACKSIZE
  {
    /* Retrieve used stack size;  Needed for checking stack overflows */
    size_t stack_size= 0;
    pthread_attr_getstacksize(&connection_attrib, &stack_size);
    /* We must check if stack_size = 0 as Solaris 2.9 can return 0 here */
    if (stack_size && stack_size < thread_stack)
    {
      if (global_system_variables.log_warnings)
	sql_print_error("Warning: Asked for %ld thread stack, but got %ld",
			thread_stack, stack_size);
      thread_stack= stack_size;
    }
  }
#endif
unknown's avatar
unknown committed
2793 2794
  thread_stack_min=thread_stack - STACK_MIN_SIZE;

2795
  (void) thr_setconcurrency(concurrency);	// 10 by default
unknown's avatar
unknown committed
2796

unknown's avatar
unknown committed
2797 2798 2799 2800 2801
  /*
    Ensure that lower_case_table_names is set on system where we have case
    insensitive names.  If this is not done the users MyISAM tables will
    get corrupted if accesses with names of different case.
  */
unknown's avatar
unknown committed
2802
  DBUG_PRINT("info", ("lower_case_table_names: %d", lower_case_table_names));
unknown's avatar
unknown committed
2803
  if (!lower_case_table_names &&
unknown's avatar
unknown committed
2804 2805
      (lower_case_file_system=
       (test_if_case_insensitive(mysql_real_data_home) == 1)))
unknown's avatar
unknown committed
2806
  {
unknown's avatar
unknown committed
2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822
    if (lower_case_table_names_used)
    {
      if (global_system_variables.log_warnings)
	sql_print_error("\
Warning: You have forced lower_case_table_names to 0 through a command-line \
option, even though your file system '%s' is case insensitive.  This means \
that you can corrupt a MyISAM table by accessing it with different cases. \
You should consider changing lower_case_table_names to 1 or 2",
			mysql_real_data_home);
    }
    else
    {
      if (global_system_variables.log_warnings)
	sql_print_error("Warning: Setting lower_case_table_names=2 because file system for %s is case insensitive", mysql_real_data_home);
      lower_case_table_names= 2;
    }
unknown's avatar
unknown committed
2823 2824
  }

2825 2826
  select_thread=pthread_self();
  select_thread_in_use=1;
unknown's avatar
unknown committed
2827 2828 2829 2830 2831 2832 2833 2834 2835 2836
  init_ssl();

#ifdef HAVE_LIBWRAP
  libwrapName= my_progname+dirname_length(my_progname);
  openlog(libwrapName, LOG_PID, LOG_AUTH);
#endif

  /*
    We have enough space for fiddling with the argv, continue
  */
unknown's avatar
unknown committed
2837
  check_data_home(mysql_real_data_home);
unknown's avatar
unknown committed
2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850
  if (my_setwd(mysql_real_data_home,MYF(MY_WME)))
  {
    unireg_abort(1);				/* purecov: inspected */
  }
  mysql_data_home= mysql_data_home_buff;
  mysql_data_home[0]=FN_CURLIB;		// all paths are relative from here
  mysql_data_home[1]=0;
  server_init();

  if (opt_bin_log && !server_id)
  {
    server_id= !master_host ? 1 : 2;
#ifdef EXTRA_DEBUG
2851
    switch (server_id) {
unknown's avatar
unknown committed
2852 2853
    case 1:
      sql_print_error("\
2854 2855 2856
Warning: You have enabled the binary log, but you haven't set server-id to \
a non-zero value: we force server id to 1; updates will be logged to the \
binary log, but connections from slaves will not be accepted.");
unknown's avatar
unknown committed
2857 2858 2859
      break;
    case 2:
      sql_print_error("\
2860 2861
Warning: You should set server-id to a non-0 value if master_host is set; \
we force server id to 2, but this MySQL server will not act as a slave.");
unknown's avatar
unknown committed
2862 2863
      break;
    }
2864
#endif
unknown's avatar
unknown committed
2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876
  }

  if (init_server_components())
    exit(1);

#ifdef __WIN__
#define MYSQL_ERR_FILE "mysql.err"
  if (!opt_console)
  {
    freopen(MYSQL_ERR_FILE,"a+",stdout);
    freopen(MYSQL_ERR_FILE,"a+",stderr);
    FreeConsole();				// Remove window
2877
  }
unknown's avatar
unknown committed
2878 2879 2880 2881 2882 2883 2884 2885
#endif

  /*
    init signals & alarm
    After this we can't quit by a simple unireg_abort
  */
  error_handler_hook = my_message_sql;
  start_signal_handler();				// Creates pidfile
2886 2887
  if (acl_init((THD *)0, opt_noacl) || 
      my_tz_init((THD *)0, default_tz_name, opt_bootstrap))
unknown's avatar
unknown committed
2888 2889 2890
  {
    abort_loop=1;
    select_thread_in_use=0;
unknown's avatar
unknown committed
2891 2892 2893
#ifndef __NETWARE__
    (void) pthread_kill(signal_thread, MYSQL_KILL_SIGNAL);
#endif /* __NETWARE__ */
unknown's avatar
unknown committed
2894 2895 2896 2897
#ifndef __WIN__
    if (!opt_bootstrap)
      (void) my_delete(pidfile_name,MYF(MY_WME));	// Not needed anymore
#endif
2898
    if (unix_sock != INVALID_SOCKET)
2899
      unlink(mysqld_unix_port);
unknown's avatar
unknown committed
2900 2901 2902
    exit(1);
  }
  if (!opt_noacl)
unknown's avatar
unknown committed
2903
    (void) grant_init((THD *)0);
unknown's avatar
unknown committed
2904 2905 2906 2907 2908

#ifdef HAVE_DLOPEN
  if (!opt_noacl)
    udf_init();
#endif
unknown's avatar
unknown committed
2909 2910
  if (opt_bootstrap) /* If running with bootstrap, do not start replication. */
    opt_skip_slave_start= 1;
unknown's avatar
unknown committed
2911 2912
  /* init_slave() must be called after the thread keys are created */
  init_slave();
2913

unknown's avatar
unknown committed
2914 2915 2916
  if (opt_bootstrap)
  {
    int error=bootstrap(stdin);
2917
    end_thr_alarm(1);				// Don't allow alarms
unknown's avatar
unknown committed
2918 2919 2920 2921 2922 2923
    unireg_abort(error ? 1 : 0);
  }
  if (opt_init_file)
  {
    if (read_init_file(opt_init_file))
    {
2924
      end_thr_alarm(1);				// Don't allow alarms
unknown's avatar
unknown committed
2925 2926 2927
      unireg_abort(1);
    }
  }
unknown's avatar
unknown committed
2928

unknown's avatar
unknown committed
2929
  create_shutdown_thread();
unknown's avatar
unknown committed
2930 2931
  create_maintenance_thread();

2932
  printf(ER(ER_READY),my_progname,server_version,
2933 2934
	 ((unix_sock == INVALID_SOCKET) ? (char*) "" : mysqld_unix_port),
	 mysqld_port);
2935 2936 2937
  if (MYSQL_COMPILATION_COMMENT[0] != '\0')
    fputs("  " MYSQL_COMPILATION_COMMENT, stdout);
  putchar('\n');
unknown's avatar
unknown committed
2938 2939
  fflush(stdout);

2940 2941
#if defined(__NT__) || defined(HAVE_SMEM)
  handle_connections_methods();
unknown's avatar
unknown committed
2942 2943 2944 2945 2946 2947 2948 2949 2950
#else
  handle_connections_sockets(0);
#endif /* __NT__ */

  /* (void) pthread_attr_destroy(&connection_attrib); */

  DBUG_PRINT("quit",("Exiting main thread"));

#ifndef __WIN__
unknown's avatar
unknown committed
2951
#ifdef EXTRA_DEBUG2
unknown's avatar
unknown committed
2952 2953 2954
  sql_print_error("Before Lock_thread_count");
#endif
  (void) pthread_mutex_lock(&LOCK_thread_count);
unknown's avatar
unknown committed
2955
  DBUG_PRINT("quit", ("Got thread_count mutex"));
unknown's avatar
unknown committed
2956 2957
  select_thread_in_use=0;			// For close_connections
  (void) pthread_mutex_unlock(&LOCK_thread_count);
2958
  (void) pthread_cond_broadcast(&COND_thread_count);
unknown's avatar
unknown committed
2959
#ifdef EXTRA_DEBUG2
unknown's avatar
unknown committed
2960 2961
  sql_print_error("After lock_thread_count");
#endif
unknown's avatar
merge  
unknown committed
2962
#endif /* __WIN__ */
2963

unknown's avatar
unknown committed
2964 2965 2966 2967 2968
  /* Wait until cleanup is done */
  (void) pthread_mutex_lock(&LOCK_thread_count);
  while (!ready_to_exit)
    pthread_cond_wait(&COND_thread_count,&LOCK_thread_count);
  (void) pthread_mutex_unlock(&LOCK_thread_count);
unknown's avatar
merge  
unknown committed
2969 2970

#if defined(__WIN__) && !defined(EMBEDDED_LIBRARY)
unknown's avatar
merge  
unknown committed
2971 2972 2973 2974
  if (Service.IsNT() && start_mode)
    Service.Stop();
  else
  {
unknown's avatar
Cleanup  
unknown committed
2975
    Service.SetShutdownEvent(0);
unknown's avatar
merge  
unknown committed
2976 2977 2978
    if (hEventShutdown)
      CloseHandle(hEventShutdown);
  }
unknown's avatar
unknown committed
2979
#endif
unknown's avatar
unknown committed
2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995
#ifndef __NETWARE__
  {
    uint i;
    /*
      Wait up to 10 seconds for signal thread to die. We use this mainly to
      avoid getting warnings that my_thread_end has not been called
    */
    for (i= 0 ; i < 100 && signal_thread_in_use; i++)
    {
      if (pthread_kill(signal_thread, MYSQL_KILL_SIGNAL))
	break;
      my_sleep(100);				// Give it time to die
    }
  }
#endif
  clean_up_mutexes();
unknown's avatar
unknown committed
2996
  my_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
unknown's avatar
unknown committed
2997 2998 2999 3000
  exit(0);
  return(0);					/* purecov: deadcode */
}

3001
#endif /* EMBEDDED_LIBRARY */
unknown's avatar
unknown committed
3002

unknown's avatar
SCRUM  
unknown committed
3003

3004 3005 3006 3007 3008
/****************************************************************************
  Main and thread entry function for Win32
  (all this is needed only to run mysqld as a service on WinNT)
****************************************************************************/

unknown's avatar
unknown committed
3009
#if defined(__WIN__) && !defined(EMBEDDED_LIBRARY)
unknown's avatar
unknown committed
3010 3011
int mysql_service(void *p)
{
3012 3013 3014 3015
  if (use_opt_args)
    win_main(opt_argc, opt_argv);
  else
    win_main(Service.my_argc, Service.my_argv);
unknown's avatar
unknown committed
3016 3017 3018
  return 0;
}

3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031

/* Quote string if it contains space, else copy */

static char *add_quoted_string(char *to, const char *from, char *to_end)
{
  uint length= (uint) (to_end-to);

  if (!strchr(from, ' '))
    return strnmov(to, from, length);
  return strxnmov(to, length, "\"", from, "\"", NullS);
}


3032 3033 3034 3035 3036
/*
  Handle basic handling of services, like installation and removal

  SYNOPSIS
    default_service_handling()
3037
    argv		Pointer to argument list
3038 3039 3040
    servicename		Internal name of service
    displayname		Display name of service (in taskbar ?)
    file_path		Path to this program
3041
    startup_option	Startup option to mysqld
3042 3043 3044 3045 3046 3047

  RETURN VALUES
    0		option handled
    1		Could not handle option
 */

3048 3049 3050 3051 3052 3053
static bool
default_service_handling(char **argv,
			 const char *servicename,
			 const char *displayname,
			 const char *file_path,
			 const char *extra_opt)
3054
{
3055
  char path_and_service[FN_REFLEN+FN_REFLEN+32], *pos, *end;
3056
  end= path_and_service + sizeof(path_and_service)-3;
3057 3058 3059 3060 3061 3062 3063 3064 3065

  /* We have to quote filename if it contains spaces */
  pos= add_quoted_string(path_and_service, file_path, end);
  if (*extra_opt)
  {
    /* Add (possible quoted) option after file_path */
    *pos++= ' ';
    pos= add_quoted_string(pos, extra_opt, end);
  }
3066 3067
  /* We must have servicename last */
  *pos++= ' ';
unknown's avatar
unknown committed
3068
  (void) add_quoted_string(pos, servicename, end);
3069

3070 3071
  if (Service.got_service_option(argv, "install"))
  {
3072
    Service.Install(1, servicename, displayname, path_and_service);
3073 3074 3075 3076
    return 0;
  }
  if (Service.got_service_option(argv, "install-manual"))
  {
3077
    Service.Install(0, servicename, displayname, path_and_service);
3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088
    return 0;
  }
  if (Service.got_service_option(argv, "remove"))
  {
    Service.Remove(servicename);
    return 0;
  }
  return 1;
}


unknown's avatar
unknown committed
3089 3090
int main(int argc, char **argv)
{
3091 3092 3093 3094 3095

  /* When several instances are running on the same machine, we
     need to have an  unique  named  hEventShudown  through the
     application PID e.g.: MySQLShutdown1890; MySQLShutdown2342
  */ 
3096
  int10_to_str((int) GetCurrentProcessId(),strmov(shutdown_event_name,
3097 3098
          "MySQLShutdown"), 10);
  
3099 3100 3101
  /* Must be initialized early for comparison of service name */
  system_charset_info= &my_charset_utf8_general_ci;

unknown's avatar
unknown committed
3102
  if (Service.GetOS())	/* true NT family */
unknown's avatar
unknown committed
3103
  {
unknown's avatar
unknown committed
3104
    char file_path[FN_REFLEN];
3105
    my_path(file_path, argv[0], "");		      /* Find name in path */
unknown's avatar
unknown committed
3106 3107
    fn_format(file_path,argv[0],file_path,"",
	      MY_REPLACE_DIR | MY_UNPACK_FILENAME | MY_RESOLVE_SYMLINKS);
unknown's avatar
unknown committed
3108

unknown's avatar
unknown committed
3109
    if (argc == 2)
3110
    {
3111 3112
      if (!default_service_handling(argv, MYSQL_SERVICENAME, MYSQL_SERVICENAME,
				   file_path, ""))
3113
	return 0;
unknown's avatar
unknown committed
3114
      if (Service.IsService(argv[1]))        /* Start an optional service */
unknown's avatar
unknown committed
3115
      {
unknown's avatar
unknown committed
3116 3117 3118 3119 3120 3121
	/*
	  Only add the service name to the groups read from the config file
	  if it's not "MySQL". (The default service name should be 'mysqld'
	  but we started a bad tradition by calling it MySQL from the start
	  and we are now stuck with it.
	*/
3122
	if (my_strcasecmp(system_charset_info, argv[1],"mysql"))
unknown's avatar
unknown committed
3123
	  load_default_groups[3]= argv[1];
unknown's avatar
unknown committed
3124
        start_mode= 1;
3125
        Service.Init(argv[1], mysql_service);
unknown's avatar
unknown committed
3126 3127 3128 3129
        return 0;
      }
    }
    else if (argc == 3) /* install or remove any optional service */
unknown's avatar
unknown committed
3130
    {
3131
      if (!default_service_handling(argv, argv[2], argv[2], file_path, ""))
3132 3133
	return 0;
      if (Service.IsService(argv[2]))
unknown's avatar
unknown committed
3134
      {
3135 3136 3137 3138
	/*
	  mysqld was started as
	  mysqld --defaults-file=my_path\my.ini service-name
	*/
3139
	use_opt_args=1;
3140
	opt_argc= 2;				// Skip service-name
3141 3142
	opt_argv=argv;
	start_mode= 1;
3143
	if (my_strcasecmp(system_charset_info, argv[2],"mysql"))
3144
	  load_default_groups[3]= argv[2];
3145
	Service.Init(argv[2], mysql_service);
3146
	return 0;
unknown's avatar
unknown committed
3147 3148
      }
    }
3149 3150 3151 3152 3153 3154
    else if (argc == 4)
    {
      /*
	Install an optional service with optional config file
	mysqld --install-manual mysqldopt --defaults-file=c:\miguel\my.ini
      */
3155 3156
      if (!default_service_handling(argv, argv[2], argv[2], file_path,
				    argv[3]))
3157 3158
	return 0;
    }
unknown's avatar
unknown committed
3159
    else if (argc == 1 && Service.IsService(MYSQL_SERVICENAME))
unknown's avatar
unknown committed
3160
    {
unknown's avatar
unknown committed
3161 3162 3163
      /* start the default service */
      start_mode= 1;
      Service.Init(MYSQL_SERVICENAME, mysql_service);
unknown's avatar
unknown committed
3164 3165 3166
      return 0;
    }
  }
unknown's avatar
unknown committed
3167
  /* Start as standalone server */
unknown's avatar
unknown committed
3168 3169 3170 3171 3172 3173 3174 3175
  Service.my_argc=argc;
  Service.my_argv=argv;
  mysql_service(NULL);
  return 0;
}
#endif


3176 3177 3178 3179
/*
  Execute all commands from a file. Used by the mysql_install_db script to
  create MySQL privilege tables without having to start a full MySQL server.
*/
3180

unknown's avatar
unknown committed
3181 3182
static int bootstrap(FILE *file)
{
3183
  int error= 0;
3184
  DBUG_ENTER("bootstrap");
3185

3186
  THD *thd= new THD;
unknown's avatar
unknown committed
3187 3188
  thd->bootstrap=1;
  thd->client_capabilities=0;
unknown's avatar
unknown committed
3189
  my_net_init(&thd->net,(st_vio*) 0);
unknown's avatar
unknown committed
3190
  thd->max_client_packet_length= thd->net.max_packet;
unknown's avatar
unknown committed
3191
  thd->master_access= ~0;
3192
  thd->thread_id=thread_id++;
unknown's avatar
unknown committed
3193
  thread_count++;
3194 3195

  bootstrap_file=file;
unknown's avatar
unknown committed
3196
#ifndef EMBEDDED_LIBRARY			// TODO:  Enable this
3197 3198 3199
  if (pthread_create(&thd->real_id,&connection_attrib,handle_bootstrap,
		     (void*) thd))
  {
3200
    sql_print_error("Warning: Can't create thread to handle bootstrap");
3201
    DBUG_RETURN(-1);
3202 3203 3204 3205 3206 3207 3208 3209 3210
  }
  /* Wait for thread to die */
  (void) pthread_mutex_lock(&LOCK_thread_count);
  while (thread_count)
  {
    (void) pthread_cond_wait(&COND_thread_count,&LOCK_thread_count);
    DBUG_PRINT("quit",("One thread died (count=%u)",thread_count));
  }
  (void) pthread_mutex_unlock(&LOCK_thread_count);
unknown's avatar
unknown committed
3211 3212 3213 3214 3215
#else
  thd->mysql= 0;
  handle_bootstrap((void *)thd);
#endif

3216
  error= thd->is_fatal_error;
unknown's avatar
unknown committed
3217
#ifndef EMBEDDED_LIBRARY
unknown's avatar
unknown committed
3218
  net_end(&thd->net);
unknown's avatar
unknown committed
3219
#endif
unknown's avatar
unknown committed
3220
  thd->cleanup();
unknown's avatar
unknown committed
3221
  delete thd;
3222
  DBUG_RETURN(error);
unknown's avatar
unknown committed
3223 3224
}

3225

unknown's avatar
unknown committed
3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238
static bool read_init_file(char *file_name)
{
  FILE *file;
  DBUG_ENTER("read_init_file");
  DBUG_PRINT("enter",("name: %s",file_name));
  if (!(file=my_fopen(file_name,O_RDONLY,MYF(MY_WME))))
    return(1);
  bootstrap(file);				/* Ignore errors from this */
  (void) my_fclose(file,MYF(MY_WME));
  return 0;
}


3239
#ifndef EMBEDDED_LIBRARY
unknown's avatar
unknown committed
3240 3241 3242 3243 3244
static void create_new_thread(THD *thd)
{
  DBUG_ENTER("create_new_thread");

  NET *net=&thd->net;				// For easy ref
unknown's avatar
unknown committed
3245
  net->read_timeout = (uint) connect_timeout;
unknown's avatar
unknown committed
3246 3247 3248 3249 3250 3251
  if (protocol_version > 9)
    net->return_errno=1;

  /* don't allow too many connections */
  if (thread_count - delayed_insert_threads >= max_connections+1 || abort_loop)
  {
unknown's avatar
unknown committed
3252
    DBUG_PRINT("error",("Too many connections"));
3253
    close_connection(thd, ER_CON_COUNT_ERROR, 1);
unknown's avatar
unknown committed
3254 3255 3256
    delete thd;
    DBUG_VOID_RETURN;
  }
3257
  pthread_mutex_lock(&LOCK_thread_count);
unknown's avatar
unknown committed
3258
  thd->thread_id=thread_id++;
3259

unknown's avatar
unknown committed
3260 3261 3262
  thd->real_id=pthread_self();			// Keep purify happy

  /* Start a new thread to handle connection */
3263
#ifdef ONE_THREAD
unknown's avatar
unknown committed
3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283
  if (test_flags & TEST_NO_THREADS)		// For debugging under Linux
  {
    thread_cache_size=0;			// Safety
    thread_count++;
    threads.append(thd);
    thd->real_id=pthread_self();
    (void) pthread_mutex_unlock(&LOCK_thread_count);
    handle_one_connection((void*) thd);
  }
  else
#endif
  {
    if (cached_thread_count > wake_thread)
    {
      start_cached_thread(thd);
    }
    else
    {
      int error;
      thread_count++;
3284
      thread_created++;
unknown's avatar
unknown committed
3285
      threads.append(thd);
3286 3287
      if (thread_count-delayed_insert_threads > max_used_connections)
        max_used_connections=thread_count-delayed_insert_threads;
unknown's avatar
unknown committed
3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299
      DBUG_PRINT("info",(("creating thread %d"), thd->thread_id));
      thd->connect_time = time(NULL);
      if ((error=pthread_create(&thd->real_id,&connection_attrib,
				handle_one_connection,
				(void*) thd)))
      {
	DBUG_PRINT("error",
		   ("Can't create thread to handle request (error %d)",
		    error));
	thread_count--;
	thd->killed=1;				// Safety
	(void) pthread_mutex_unlock(&LOCK_thread_count);
3300
	statistic_increment(aborted_connects,&LOCK_status);
3301
	net_printf(thd,ER_CANT_CREATE_THREAD,error);
unknown's avatar
unknown committed
3302
	(void) pthread_mutex_lock(&LOCK_thread_count);
3303
	close_connection(thd,0,0);
unknown's avatar
unknown committed
3304 3305 3306 3307 3308
	delete thd;
	(void) pthread_mutex_unlock(&LOCK_thread_count);
	DBUG_VOID_RETURN;
      }
    }
3309 3310
    (void) pthread_mutex_unlock(&LOCK_thread_count);

unknown's avatar
unknown committed
3311
  }
3312
  DBUG_PRINT("info",("Thread created"));
unknown's avatar
unknown committed
3313 3314
  DBUG_VOID_RETURN;
}
3315 3316
#endif /* EMBEDDED_LIBRARY */

unknown's avatar
unknown committed
3317

unknown's avatar
unknown committed
3318 3319 3320 3321
#ifdef SIGNALS_DONT_BREAK_READ
inline void kill_broken_server()
{
  /* hack to get around signals ignored in syscalls for problem OS's */
unknown's avatar
unknown committed
3322 3323 3324 3325
  if (
#if !defined(__NETWARE__)
      unix_sock == INVALID_SOCKET ||
#endif
3326
      (!opt_disable_networking && ip_sock == INVALID_SOCKET))
unknown's avatar
unknown committed
3327 3328
  {
    select_thread_in_use = 0;
3329 3330 3331
#ifdef __NETWARE__
    kill_server(MYSQL_KILL_SIGNAL); /* never returns */
#else
unknown's avatar
unknown committed
3332
    kill_server((void*)MYSQL_KILL_SIGNAL); /* never returns */
3333
#endif /* __NETWARE__ */
unknown's avatar
unknown committed
3334 3335 3336 3337 3338 3339
  }
}
#define MAYBE_BROKEN_SYSCALL kill_broken_server();
#else
#define MAYBE_BROKEN_SYSCALL
#endif
unknown's avatar
unknown committed
3340 3341 3342

	/* Handle new connections and spawn new process to handle them */

3343 3344 3345
#ifndef EMBEDDED_LIBRARY
extern "C" pthread_handler_decl(handle_connections_sockets,
				arg __attribute__((unused)))
unknown's avatar
unknown committed
3346 3347 3348 3349 3350 3351 3352 3353
{
  my_socket sock,new_sock;
  uint error_count=0;
  uint max_used_connection= (uint) (max(ip_sock,unix_sock)+1);
  fd_set readFDs,clientFDs;
  THD *thd;
  struct sockaddr_in cAddr;
  int ip_flags=0,socket_flags=0,flags;
unknown's avatar
unknown committed
3354
  st_vio *vio_tmp;
unknown's avatar
unknown committed
3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370
  DBUG_ENTER("handle_connections_sockets");

  LINT_INIT(new_sock);

  (void) my_pthread_getprio(pthread_self());		// For debugging

  FD_ZERO(&clientFDs);
  if (ip_sock != INVALID_SOCKET)
  {
    FD_SET(ip_sock,&clientFDs);
#ifdef HAVE_FCNTL
    ip_flags = fcntl(ip_sock, F_GETFL, 0);
#endif
  }
#ifdef HAVE_SYS_UN_H
  FD_SET(unix_sock,&clientFDs);
unknown's avatar
unknown committed
3371
#ifdef HAVE_FCNTL
unknown's avatar
unknown committed
3372
  socket_flags=fcntl(unix_sock, F_GETFL, 0);
unknown's avatar
unknown committed
3373
#endif
unknown's avatar
unknown committed
3374 3375 3376
#endif

  DBUG_PRINT("general",("Waiting for connections."));
unknown's avatar
unknown committed
3377
  MAYBE_BROKEN_SYSCALL;
unknown's avatar
unknown committed
3378 3379 3380
  while (!abort_loop)
  {
    readFDs=clientFDs;
3381
#ifdef HPUX10
unknown's avatar
unknown committed
3382 3383 3384 3385 3386
    if (select(max_used_connection,(int*) &readFDs,0,0,0) < 0)
      continue;
#else
    if (select((int) max_used_connection,&readFDs,0,0,0) < 0)
    {
unknown's avatar
unknown committed
3387
      if (socket_errno != SOCKET_EINTR)
unknown's avatar
unknown committed
3388 3389
      {
	if (!select_errors++ && !abort_loop)	/* purecov: inspected */
unknown's avatar
unknown committed
3390
	  sql_print_error("mysqld: Got error %d from select",socket_errno); /* purecov: inspected */
unknown's avatar
unknown committed
3391
      }
unknown's avatar
unknown committed
3392
      MAYBE_BROKEN_SYSCALL
unknown's avatar
unknown committed
3393 3394
      continue;
    }
3395
#endif	/* HPUX10 */
unknown's avatar
unknown committed
3396
    if (abort_loop)
unknown's avatar
unknown committed
3397 3398
    {
      MAYBE_BROKEN_SYSCALL;
unknown's avatar
unknown committed
3399
      break;
unknown's avatar
unknown committed
3400
    }
unknown's avatar
unknown committed
3401

3402
    /* Is this a new connection request ? */
unknown's avatar
unknown committed
3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430
#ifdef HAVE_SYS_UN_H
    if (FD_ISSET(unix_sock,&readFDs))
    {
      sock = unix_sock;
      flags= socket_flags;
    }
    else
#endif
    {
      sock = ip_sock;
      flags= ip_flags;
    }

#if !defined(NO_FCNTL_NONBLOCK)
    if (!(test_flags & TEST_BLOCKING))
    {
#if defined(O_NONBLOCK)
      fcntl(sock, F_SETFL, flags | O_NONBLOCK);
#elif defined(O_NDELAY)
      fcntl(sock, F_SETFL, flags | O_NDELAY);
#endif
    }
#endif /* NO_FCNTL_NONBLOCK */
    for (uint retry=0; retry < MAX_ACCEPT_RETRY; retry++)
    {
      size_socket length=sizeof(struct sockaddr_in);
      new_sock = accept(sock, my_reinterpret_cast(struct sockaddr *) (&cAddr),
			&length);
unknown's avatar
unknown committed
3431 3432 3433 3434 3435 3436 3437
#ifdef __NETWARE__ 
      // TODO: temporary fix, waiting for TCP/IP fix - DEFECT000303149
      if ((new_sock == INVALID_SOCKET) && (socket_errno == EINVAL))
      {
        kill_server(SIGTERM);
      }
#endif
unknown's avatar
unknown committed
3438 3439
      if (new_sock != INVALID_SOCKET ||
	  (socket_errno != SOCKET_EINTR && socket_errno != SOCKET_EAGAIN))
unknown's avatar
unknown committed
3440
	break;
unknown's avatar
unknown committed
3441
      MAYBE_BROKEN_SYSCALL;
unknown's avatar
unknown committed
3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453
#if !defined(NO_FCNTL_NONBLOCK)
      if (!(test_flags & TEST_BLOCKING))
      {
	if (retry == MAX_ACCEPT_RETRY - 1)
	  fcntl(sock, F_SETFL, flags);		// Try without O_NONBLOCK
      }
#endif
    }
#if !defined(NO_FCNTL_NONBLOCK)
    if (!(test_flags & TEST_BLOCKING))
      fcntl(sock, F_SETFL, flags);
#endif
unknown's avatar
unknown committed
3454
    if (new_sock == INVALID_SOCKET)
unknown's avatar
unknown committed
3455 3456 3457
    {
      if ((error_count++ & 255) == 0)		// This can happen often
	sql_perror("Error in accept");
unknown's avatar
unknown committed
3458
      MAYBE_BROKEN_SYSCALL;
unknown's avatar
unknown committed
3459
      if (socket_errno == SOCKET_ENFILE || socket_errno == SOCKET_EMFILE)
unknown's avatar
unknown committed
3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470
	sleep(1);				// Give other threads some time
      continue;
    }

#ifdef HAVE_LIBWRAP
    {
      if (sock == ip_sock)
      {
	struct request_info req;
	signal(SIGCHLD, SIG_DFL);
	request_init(&req, RQ_DAEMON, libwrapName, RQ_FILE, new_sock, NULL);
3471 3472
	my_fromhost(&req);
	if (!my_hosts_access(&req))
unknown's avatar
unknown committed
3473
	{
unknown's avatar
unknown committed
3474 3475 3476 3477 3478
	  /*
	    This may be stupid but refuse() includes an exit(0)
	    which we surely don't want...
	    clean_exit() - same stupid thing ...
	  */
3479 3480
	  syslog(deny_severity, "refused connect from %s",
		 my_eval_client(&req));
unknown's avatar
unknown committed
3481

unknown's avatar
unknown committed
3482 3483 3484 3485 3486 3487
	  /*
	    C++ sucks (the gibberish in front just translates the supplied
	    sink function pointer in the req structure from a void (*sink)();
	    to a void(*sink)(int) if you omit the cast, the C++ compiler
	    will cry...
	  */
unknown's avatar
unknown committed
3488 3489 3490
	  if (req.sink)
	    ((void (*)(int))req.sink)(req.fd);

3491
	  (void) shutdown(new_sock,2);
unknown's avatar
unknown committed
3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517
	  (void) closesocket(new_sock);
	  continue;
	}
      }
    }
#endif /* HAVE_LIBWRAP */

    {
      size_socket dummyLen;
      struct sockaddr dummy;
      dummyLen = sizeof(struct sockaddr);
      if (getsockname(new_sock,&dummy, &dummyLen) < 0)
      {
	sql_perror("Error on new connection socket");
	(void) shutdown(new_sock,2);
	(void) closesocket(new_sock);
	continue;
      }
    }

    /*
    ** Don't allow too many connections
    */

    if (!(thd= new THD))
    {
unknown's avatar
unknown committed
3518 3519
      (void) shutdown(new_sock,2);
      VOID(closesocket(new_sock));
unknown's avatar
unknown committed
3520 3521 3522
      continue;
    }
    if (!(vio_tmp=vio_new(new_sock,
3523
			  sock == unix_sock ? VIO_TYPE_SOCKET :
unknown's avatar
unknown committed
3524
			  VIO_TYPE_TCPIP,
3525
			  sock == unix_sock)) ||
unknown's avatar
unknown committed
3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538
	my_net_init(&thd->net,vio_tmp))
    {
      if (vio_tmp)
	vio_delete(vio_tmp);
      else
      {
	(void) shutdown(new_sock,2);
	(void) closesocket(new_sock);
      }
      delete thd;
      continue;
    }
    if (sock == unix_sock)
unknown's avatar
SCRUM:  
unknown committed
3539
      thd->host=(char*) my_localhost;
3540 3541 3542 3543 3544 3545
#ifdef __WIN__
    /* Set default wait_timeout */
    ulong wait_timeout= global_system_variables.net_wait_timeout * 1000;
    (void) setsockopt(new_sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&wait_timeout,
                    sizeof(wait_timeout));
#endif
unknown's avatar
unknown committed
3546 3547 3548
    create_new_thread(thd);
  }

unknown's avatar
unknown committed
3549 3550 3551 3552
#ifdef OS2
  // kill server must be invoked from thread 1!
  kill_server(MYSQL_KILL_SIGNAL);
#endif
3553
  decrement_handler_count();
unknown's avatar
unknown committed
3554 3555 3556 3557 3558
  DBUG_RETURN(0);
}


#ifdef __NT__
3559
extern "C" pthread_handler_decl(handle_connections_namedpipes,arg)
unknown's avatar
unknown committed
3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574
{
  HANDLE hConnectedPipe;
  BOOL fConnected;
  THD *thd;
  my_thread_init();
  DBUG_ENTER("handle_connections_namedpipes");
  (void) my_pthread_getprio(pthread_self());		// For debugging

  DBUG_PRINT("general",("Waiting for named pipe connections."));
  while (!abort_loop)
  {
    /* wait for named pipe connection */
    fConnected = ConnectNamedPipe( hPipe, NULL );
    if (abort_loop)
      break;
unknown's avatar
unknown committed
3575
    if (!fConnected)
unknown's avatar
unknown committed
3576
      fConnected = GetLastError() == ERROR_PIPE_CONNECTED;
unknown's avatar
unknown committed
3577
    if (!fConnected)
unknown's avatar
unknown committed
3578 3579
    {
      CloseHandle( hPipe );
3580
      if ((hPipe = CreateNamedPipe(pipe_name,
unknown's avatar
unknown committed
3581 3582 3583 3584 3585
				   PIPE_ACCESS_DUPLEX,
				   PIPE_TYPE_BYTE |
				   PIPE_READMODE_BYTE |
				   PIPE_WAIT,
				   PIPE_UNLIMITED_INSTANCES,
3586
				   (int) global_system_variables.net_buffer_length,
unknown's avatar
unknown committed
3587
				   (int) global_system_variables.net_buffer_length,
unknown's avatar
unknown committed
3588 3589 3590 3591 3592 3593 3594 3595 3596 3597
				   NMPWAIT_USE_DEFAULT_WAIT,
				   &saPipeSecurity )) ==
	  INVALID_HANDLE_VALUE )
      {
	sql_perror("Can't create new named pipe!");
	break;					// Abort
      }
    }
    hConnectedPipe = hPipe;
    /* create new pipe for new connection */
3598
    if ((hPipe = CreateNamedPipe(pipe_name,
unknown's avatar
unknown committed
3599 3600 3601 3602 3603
				 PIPE_ACCESS_DUPLEX,
				 PIPE_TYPE_BYTE |
				 PIPE_READMODE_BYTE |
				 PIPE_WAIT,
				 PIPE_UNLIMITED_INSTANCES,
3604 3605
				 (int) global_system_variables.net_buffer_length,
				 (int) global_system_variables.net_buffer_length,
unknown's avatar
unknown committed
3606 3607 3608 3609 3610 3611 3612 3613 3614
				 NMPWAIT_USE_DEFAULT_WAIT,
				 &saPipeSecurity)) ==
	INVALID_HANDLE_VALUE)
    {
      sql_perror("Can't create new named pipe!");
      hPipe=hConnectedPipe;
      continue;					// We have to try again
    }

unknown's avatar
unknown committed
3615
    if (!(thd = new THD))
unknown's avatar
unknown committed
3616 3617 3618 3619 3620 3621 3622 3623
    {
      DisconnectNamedPipe( hConnectedPipe );
      CloseHandle( hConnectedPipe );
      continue;
    }
    if (!(thd->net.vio = vio_new_win32pipe(hConnectedPipe)) ||
	my_net_init(&thd->net, thd->net.vio))
    {
3624
      close_connection(thd, ER_OUT_OF_RESOURCES, 1);
unknown's avatar
unknown committed
3625 3626 3627 3628
      delete thd;
      continue;
    }
    /* host name is unknown */
unknown's avatar
SCRUM:  
unknown committed
3629
    thd->host = my_strdup(my_localhost,MYF(0)); /* Host is unknown */
unknown's avatar
unknown committed
3630 3631 3632
    create_new_thread(thd);
  }

3633
  decrement_handler_count();
unknown's avatar
unknown committed
3634 3635 3636 3637
  DBUG_RETURN(0);
}
#endif /* __NT__ */

3638

3639
/*
3640 3641 3642 3643 3644 3645 3646
  Thread of shared memory's service

  SYNOPSIS
    pthread_handler_decl()
    handle_connections_shared_memory Thread handle
    arg                              Arguments of thread
*/
3647

3648 3649 3650
#ifdef HAVE_SMEM
pthread_handler_decl(handle_connections_shared_memory,arg)
{
3651 3652 3653 3654 3655 3656 3657
  /* file-mapping object, use for create shared memory */
  HANDLE handle_connect_file_map= 0;
  char  *handle_connect_map= 0;  		// pointer on shared memory
  HANDLE event_connect_request= 0;		// for start connection actions
  HANDLE event_connect_answer= 0;
  ulong smem_buffer_length= shared_memory_buffer_length + 4;
  ulong connect_number= 1;
3658 3659 3660
  char tmp[63];
  char *suffix_pos;
  char connect_number_char[22], *p;
3661
  const char *errmsg= 0;
3662 3663 3664 3665
  my_thread_init();
  DBUG_ENTER("handle_connections_shared_memorys");
  DBUG_PRINT("general",("Waiting for allocated shared memory."));

3666 3667 3668 3669 3670 3671 3672
  /*
    The name of event and file-mapping events create agree next rule:
      shared_memory_base_name+unique_part
    Where:
      shared_memory_base_name is unique value for each server
      unique_part is unique value for each object (events and file-mapping)
  */
3673
  suffix_pos= strxmov(tmp,shared_memory_base_name,"_",NullS);
3674
  strmov(suffix_pos, "CONNECT_REQUEST");
3675
  if ((event_connect_request= CreateEvent(0,FALSE,FALSE,tmp)) == 0)
3676
  {
3677
    errmsg= "Could not create request event";
3678 3679
    goto error;
  }
3680
  strmov(suffix_pos, "CONNECT_ANSWER");
3681
  if ((event_connect_answer= CreateEvent(0,FALSE,FALSE,tmp)) == 0)
3682
  {
3683
    errmsg="Could not create answer event";
3684 3685
    goto error;
  }
3686
  strmov(suffix_pos, "CONNECT_DATA");
3687 3688 3689 3690
  if ((handle_connect_file_map= CreateFileMapping(INVALID_HANDLE_VALUE,0,
						   PAGE_READWRITE,
						   0,sizeof(connect_number),
						   tmp)) == 0)
3691
  {
3692
    errmsg= "Could not create file mapping";
3693 3694
    goto error;
  }
3695 3696 3697
  if ((handle_connect_map= (char *)MapViewOfFile(handle_connect_file_map,
						  FILE_MAP_WRITE,0,0,
						  sizeof(DWORD))) == 0)
3698
  {
3699
    errmsg= "Could not create shared memory service";
3700 3701 3702 3703 3704
    goto error;
  }

  while (!abort_loop)
  {
3705
    /* Wait a request from client */
3706
    WaitForSingleObject(event_connect_request,INFINITE);
3707

3708 3709 3710 3711 3712 3713 3714
    HANDLE handle_client_file_map= 0;
    char  *handle_client_map= 0;
    HANDLE event_client_wrote= 0;
    HANDLE event_client_read= 0;    // for transfer data server <-> client
    HANDLE event_server_wrote= 0;
    HANDLE event_server_read= 0;
    THD *thd= 0;
3715

3716
    p= int10_to_str(connect_number, connect_number_char, 10);
3717 3718 3719 3720 3721 3722 3723 3724 3725 3726
    /*
      The name of event and file-mapping events create agree next rule:
        shared_memory_base_name+unique_part+number_of_connection
        Where:
	  shared_memory_base_name is uniquel value for each server
	  unique_part is unique value for each object (events and file-mapping)
	  number_of_connection is connection-number between server and client
    */
    suffix_pos= strxmov(tmp,shared_memory_base_name,"_",connect_number_char,
			 "_",NullS);
3727
    strmov(suffix_pos, "DATA");
3728 3729 3730 3731
    if ((handle_client_file_map= CreateFileMapping(INVALID_HANDLE_VALUE,0,
						    PAGE_READWRITE,0,
						    smem_buffer_length,
						    tmp)) == 0)
3732
    {
3733
      errmsg= "Could not create file mapping";
3734 3735
      goto errorconn;
    }
3736 3737 3738
    if ((handle_client_map= (char*)MapViewOfFile(handle_client_file_map,
						  FILE_MAP_WRITE,0,0,
						  smem_buffer_length)) == 0)
3739
    {
3740
      errmsg= "Could not create memory map";
3741 3742 3743
      goto errorconn;
    }
    strmov(suffix_pos, "CLIENT_WROTE");
3744
    if ((event_client_wrote= CreateEvent(0,FALSE,FALSE,tmp)) == 0)
3745
    {
3746
      errmsg= "Could not create client write event";
3747 3748 3749
      goto errorconn;
    }
    strmov(suffix_pos, "CLIENT_READ");
3750
    if ((event_client_read= CreateEvent(0,FALSE,FALSE,tmp)) == 0)
3751
    {
3752
      errmsg= "Could not create client read event";
3753 3754 3755
      goto errorconn;
    }
    strmov(suffix_pos, "SERVER_READ");
3756
    if ((event_server_read= CreateEvent(0,FALSE,FALSE,tmp)) == 0)
3757
    {
3758
      errmsg= "Could not create server read event";
3759 3760 3761
      goto errorconn;
    }
    strmov(suffix_pos, "SERVER_WROTE");
3762
    if ((event_server_wrote= CreateEvent(0,FALSE,FALSE,tmp)) == 0)
3763
    {
3764
      errmsg= "Could not create server write event";
3765 3766
      goto errorconn;
    }
3767
    if (abort_loop)
3768
      goto errorconn;
3769 3770 3771
    if (!(thd= new THD))
      goto errorconn;
    /* Send number of connection to client */
3772
    int4store(handle_connect_map, connect_number);
3773
    if (!SetEvent(event_connect_answer))
3774
    {
3775
      errmsg= "Could not send answer event";
3776 3777
      goto errorconn;
    }
3778
    /* Set event that client should receive data */
3779 3780
    if (!SetEvent(event_client_read))
    {
3781
      errmsg= "Could not set client to read mode";
3782 3783
      goto errorconn;
    }
3784 3785 3786 3787 3788 3789 3790 3791
    if (!(thd->net.vio= vio_new_win32shared_memory(&thd->net,
						   handle_client_file_map,
						   handle_client_map,
						   event_client_wrote,
						   event_client_read,
						   event_server_wrote,
						   event_server_read)) ||
	my_net_init(&thd->net, thd->net.vio))
3792
    {
3793
      close_connection(thd, ER_OUT_OF_RESOURCES, 1);
3794 3795
      errmsg= 0;
      goto errorconn;
3796
    }
3797
    thd->host= my_strdup(my_localhost,MYF(0)); /* Host is unknown */
3798
    create_new_thread(thd);
3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817
    connect_number++;
    continue;

errorconn:
    /* Could not form connection;  Free used handlers/memort and retry */
    if (errmsg)
    {
      char buff[180];
      strxmov(buff, "Can't create shared memory connection: ", errmsg, ".",
	      NullS);
      sql_perror(buff);
    }
    if (handle_client_file_map) CloseHandle(handle_client_file_map);
    if (handle_client_map)	UnmapViewOfFile(handle_client_map);
    if (event_server_wrote)	CloseHandle(event_server_wrote);
    if (event_server_read)	CloseHandle(event_server_read);
    if (event_client_wrote)	CloseHandle(event_client_wrote);
    if (event_client_read)	CloseHandle(event_client_read);
    delete thd;
3818
  }
3819 3820

  /* End shared memory handling */
3821
error:
3822 3823 3824 3825 3826 3827 3828 3829 3830 3831
  if (errmsg)
  {
    char buff[180];
    strxmov(buff, "Can't create shared memory service: ", errmsg, ".", NullS);
    sql_perror(buff);
  }
  if (handle_connect_map)	UnmapViewOfFile(handle_connect_map);
  if (handle_connect_file_map)	CloseHandle(handle_connect_file_map);
  if (event_connect_answer)	CloseHandle(event_connect_answer);
  if (event_connect_request)	CloseHandle(event_connect_request);
3832 3833

  decrement_handler_count();
3834 3835 3836
  DBUG_RETURN(0);
}
#endif /* HAVE_SMEM */
3837
#endif /* EMBEDDED_LIBRARY */
unknown's avatar
unknown committed
3838

3839 3840 3841

/****************************************************************************
  Handle start options
unknown's avatar
unknown committed
3842 3843
******************************************************************************/

unknown's avatar
unknown committed
3844
enum options_mysqld
3845
{
3846 3847 3848
  OPT_ISAM_LOG=256,            OPT_SKIP_NEW, 
  OPT_SKIP_GRANT,              OPT_SKIP_LOCK, 
  OPT_ENABLE_LOCK,             OPT_USE_LOCKING,
3849 3850
  OPT_SOCKET,                  OPT_UPDATE_LOG,
  OPT_BIN_LOG,                 OPT_SKIP_RESOLVE,
3851 3852
  OPT_SKIP_NETWORKING,         OPT_BIN_LOG_INDEX,
  OPT_BIND_ADDRESS,            OPT_PID_FILE,
3853
  OPT_SKIP_PRIOR,              OPT_BIG_TABLES,
3854 3855
  OPT_STANDALONE,              OPT_ONE_THREAD,
  OPT_CONSOLE,                 OPT_LOW_PRIORITY_UPDATES,
3856
  OPT_SKIP_HOST_CACHE,         OPT_SHORT_LOG_FORMAT,
3857
  OPT_FLUSH,                   OPT_SAFE,
3858
  OPT_BOOTSTRAP,               OPT_SKIP_SHOW_DB,
unknown's avatar
unknown committed
3859
  OPT_STORAGE_ENGINE,          OPT_INIT_FILE,
3860
  OPT_DELAY_KEY_WRITE_ALL,     OPT_SLOW_QUERY_LOG,
3861
  OPT_DELAY_KEY_WRITE,	       OPT_CHARSETS_DIR,
3862
  OPT_BDB_HOME,                OPT_BDB_LOG,
3863
  OPT_BDB_TMP,                 OPT_BDB_SYNC,
3864
  OPT_BDB_LOCK,                OPT_BDB,
3865 3866 3867 3868 3869
  OPT_BDB_NO_RECOVER,	    OPT_BDB_SHARED,
  OPT_MASTER_HOST,             OPT_MASTER_USER,
  OPT_MASTER_PASSWORD,         OPT_MASTER_PORT,
  OPT_MASTER_INFO_FILE,        OPT_MASTER_CONNECT_RETRY,
  OPT_MASTER_RETRY_COUNT,
unknown's avatar
unknown committed
3870 3871
  OPT_MASTER_SSL,              OPT_MASTER_SSL_KEY,
  OPT_MASTER_SSL_CERT,         OPT_MASTER_SSL_CAPATH,
unknown's avatar
unknown committed
3872
  OPT_MASTER_SSL_CIPHER,       OPT_MASTER_SSL_CA,
3873
  OPT_SQL_BIN_UPDATE_SAME,     OPT_REPLICATE_DO_DB,
3874 3875 3876 3877
  OPT_REPLICATE_IGNORE_DB,     OPT_LOG_SLAVE_UPDATES,
  OPT_BINLOG_DO_DB,            OPT_BINLOG_IGNORE_DB,
  OPT_WANT_CORE,               OPT_CONCURRENT_INSERT,
  OPT_MEMLOCK,                 OPT_MYISAM_RECOVER,
3878
  OPT_REPLICATE_REWRITE_DB,    OPT_SERVER_ID,
3879
  OPT_SKIP_SLAVE_START,        OPT_SKIP_INNOBASE,
3880 3881
  OPT_SAFEMALLOC_MEM_LIMIT,    OPT_REPLICATE_DO_TABLE,
  OPT_REPLICATE_IGNORE_TABLE,  OPT_REPLICATE_WILD_DO_TABLE,
3882
  OPT_REPLICATE_WILD_IGNORE_TABLE, OPT_REPLICATE_SAME_SERVER_ID,
3883
  OPT_DISCONNECT_SLAVE_EVENT_COUNT,
3884 3885 3886
  OPT_ABORT_SLAVE_EVENT_COUNT,
  OPT_INNODB_DATA_HOME_DIR,
  OPT_INNODB_DATA_FILE_PATH,
3887 3888 3889 3890 3891 3892
  OPT_INNODB_LOG_GROUP_HOME_DIR,
  OPT_INNODB_LOG_ARCH_DIR,
  OPT_INNODB_LOG_ARCHIVE,
  OPT_INNODB_FLUSH_LOG_AT_TRX_COMMIT,
  OPT_INNODB_FLUSH_METHOD,
  OPT_INNODB_FAST_SHUTDOWN,
unknown's avatar
unknown committed
3893
  OPT_INNODB_FILE_PER_TABLE, OPT_CRASH_BINLOG_INNODB,
3894
  OPT_INNODB_LOCKS_UNSAFE_FOR_BINLOG,
unknown's avatar
unknown committed
3895
  OPT_SAFE_SHOW_DB, OPT_INNODB_SAFE_BINLOG,
3896
  OPT_INNODB, OPT_ISAM, OPT_NDBCLUSTER, OPT_NDB_CONNECTSTRING, OPT_SKIP_SAFEMALLOC,
3897 3898 3899 3900 3901 3902 3903
  OPT_TEMP_POOL, OPT_TX_ISOLATION,
  OPT_SKIP_STACK_TRACE, OPT_SKIP_SYMLINKS,
  OPT_MAX_BINLOG_DUMP_EVENTS, OPT_SPORADIC_BINLOG_DUMP_FAIL,
  OPT_SAFE_USER_CREATE, OPT_SQL_MODE,
  OPT_HAVE_NAMED_PIPE,
  OPT_DO_PSTACK, OPT_REPORT_HOST,
  OPT_REPORT_USER, OPT_REPORT_PASSWORD, OPT_REPORT_PORT,
3904
  OPT_SHOW_SLAVE_AUTH_INFO,
3905 3906 3907 3908 3909 3910 3911 3912 3913
  OPT_SLAVE_LOAD_TMPDIR, OPT_NO_MIX_TYPE,
  OPT_RPL_RECOVERY_RANK,OPT_INIT_RPL_ROLE,
  OPT_RELAY_LOG, OPT_RELAY_LOG_INDEX, OPT_RELAY_LOG_INFO_FILE,
  OPT_SLAVE_SKIP_ERRORS, OPT_DES_KEY_FILE, OPT_LOCAL_INFILE,
  OPT_SSL_SSL, OPT_SSL_KEY, OPT_SSL_CERT, OPT_SSL_CA,
  OPT_SSL_CAPATH, OPT_SSL_CIPHER,
  OPT_BACK_LOG, OPT_BINLOG_CACHE_SIZE,
  OPT_CONNECT_TIMEOUT, OPT_DELAYED_INSERT_TIMEOUT,
  OPT_DELAYED_INSERT_LIMIT, OPT_DELAYED_QUEUE_SIZE,
unknown's avatar
unknown committed
3914
  OPT_FLUSH_TIME, OPT_FT_MIN_WORD_LEN, OPT_FT_BOOLEAN_SYNTAX,
unknown's avatar
unknown committed
3915
  OPT_FT_MAX_WORD_LEN, OPT_FT_QUERY_EXPANSION_LIMIT, OPT_FT_STOPWORD_FILE,
3916
  OPT_INTERACTIVE_TIMEOUT, OPT_JOIN_BUFF_SIZE,
3917 3918 3919
  OPT_KEY_BUFFER_SIZE, OPT_KEY_CACHE_BLOCK_SIZE,
  OPT_KEY_CACHE_DIVISION_LIMIT, OPT_KEY_CACHE_AGE_THRESHOLD,
  OPT_LONG_QUERY_TIME,
3920 3921 3922 3923
  OPT_LOWER_CASE_TABLE_NAMES, OPT_MAX_ALLOWED_PACKET,
  OPT_MAX_BINLOG_CACHE_SIZE, OPT_MAX_BINLOG_SIZE,
  OPT_MAX_CONNECTIONS, OPT_MAX_CONNECT_ERRORS,
  OPT_MAX_DELAYED_THREADS, OPT_MAX_HEP_TABLE_SIZE,
3924 3925
  OPT_MAX_JOIN_SIZE, OPT_MAX_RELAY_LOG_SIZE, OPT_MAX_SORT_LENGTH, 
  OPT_MAX_SEEKS_FOR_KEY, OPT_MAX_TMP_TABLES, OPT_MAX_USER_CONNECTIONS,
unknown's avatar
unknown committed
3926
  OPT_MAX_LENGTH_FOR_SORT_DATA,
unknown's avatar
unknown committed
3927
  OPT_MAX_WRITE_LOCK_COUNT, OPT_BULK_INSERT_BUFFER_SIZE,
unknown's avatar
unknown committed
3928
  OPT_MAX_ERROR_COUNT, OPT_MYISAM_DATA_POINTER_SIZE,
3929 3930 3931 3932
  OPT_MYISAM_BLOCK_SIZE, OPT_MYISAM_MAX_EXTRA_SORT_FILE_SIZE,
  OPT_MYISAM_MAX_SORT_FILE_SIZE, OPT_MYISAM_SORT_BUFFER_SIZE,
  OPT_NET_BUFFER_LENGTH, OPT_NET_RETRY_COUNT,
  OPT_NET_READ_TIMEOUT, OPT_NET_WRITE_TIMEOUT,
3933
  OPT_OPEN_FILES_LIMIT,
unknown's avatar
unknown committed
3934
  OPT_PRELOAD_BUFFER_SIZE,
3935
  OPT_QUERY_CACHE_LIMIT, OPT_QUERY_CACHE_MIN_RES_UNIT, OPT_QUERY_CACHE_SIZE,
3936
  OPT_QUERY_CACHE_TYPE, OPT_QUERY_CACHE_WLOCK_INVALIDATE, OPT_RECORD_BUFFER,
3937
  OPT_RECORD_RND_BUFFER, OPT_RELAY_LOG_SPACE_LIMIT, OPT_RELAY_LOG_PURGE,
3938
  OPT_SLAVE_NET_TIMEOUT, OPT_SLAVE_COMPRESSED_PROTOCOL, OPT_SLOW_LAUNCH_TIME,
3939
  OPT_READONLY, OPT_DEBUGGING,
3940 3941 3942
  OPT_SORT_BUFFER, OPT_TABLE_CACHE,
  OPT_THREAD_CONCURRENCY, OPT_THREAD_CACHE_SIZE,
  OPT_TMP_TABLE_SIZE, OPT_THREAD_STACK,
unknown's avatar
unknown committed
3943
  OPT_WAIT_TIMEOUT, OPT_MYISAM_REPAIR_THREADS,
3944 3945 3946 3947 3948
  OPT_INNODB_MIRRORED_LOG_GROUPS,
  OPT_INNODB_LOG_FILES_IN_GROUP,
  OPT_INNODB_LOG_FILE_SIZE,
  OPT_INNODB_LOG_BUFFER_SIZE,
  OPT_INNODB_BUFFER_POOL_SIZE,
unknown's avatar
unknown committed
3949
  OPT_INNODB_BUFFER_POOL_AWE_MEM_MB,
3950 3951 3952 3953 3954
  OPT_INNODB_ADDITIONAL_MEM_POOL_SIZE,
  OPT_INNODB_FILE_IO_THREADS,
  OPT_INNODB_LOCK_WAIT_TIMEOUT,
  OPT_INNODB_THREAD_CONCURRENCY,
  OPT_INNODB_FORCE_RECOVERY,
3955
  OPT_INNODB_STATUS_FILE,
3956
  OPT_INNODB_MAX_DIRTY_PAGES_PCT,
unknown's avatar
unknown committed
3957
  OPT_INNODB_OPEN_FILES,
3958 3959
  OPT_BDB_CACHE_SIZE,
  OPT_BDB_LOG_BUFFER_SIZE,
3960
  OPT_BDB_MAX_LOCK,
unknown's avatar
merge  
unknown committed
3961
  OPT_ERROR_LOG_FILE,
3962 3963 3964
  OPT_DEFAULT_WEEK_FORMAT,
  OPT_RANGE_ALLOC_BLOCK_SIZE,
  OPT_QUERY_ALLOC_BLOCK_SIZE, OPT_QUERY_PREALLOC_SIZE,
3965
  OPT_TRANS_ALLOC_BLOCK_SIZE, OPT_TRANS_PREALLOC_SIZE,
3966
  OPT_SYNC_FRM, OPT_SYNC_BINLOG, OPT_BDB_NOSYNC,
3967
  OPT_ENABLE_SHARED_MEMORY,
unknown's avatar
unknown committed
3968
  OPT_SHARED_MEMORY_BASE_NAME,
3969
  OPT_OLD_PASSWORDS,
unknown's avatar
unknown committed
3970
  OPT_EXPIRE_LOGS_DAYS,
3971
  OPT_GROUP_CONCAT_MAX_LEN,
3972
  OPT_DEFAULT_COLLATION,
unknown's avatar
SCRUM:  
unknown committed
3973
  OPT_INIT_CONNECT,
unknown's avatar
unknown committed
3974
  OPT_INIT_SLAVE,
3975
  OPT_SECURE_AUTH,
3976 3977
  OPT_DATE_FORMAT,
  OPT_TIME_FORMAT,
unknown's avatar
unknown committed
3978
  OPT_DATETIME_FORMAT,
3979 3980
  OPT_LOG_QUERIES_NOT_USING_INDEXES,
  OPT_DEFAULT_TIME_ZONE
unknown's avatar
unknown committed
3981
};
3982

3983 3984 3985

#define LONG_TIMEOUT ((ulong) 3600L*24L*365L)

unknown's avatar
unknown committed
3986
struct my_option my_long_options[] =
3987
{
unknown's avatar
unknown committed
3988 3989 3990 3991 3992 3993 3994 3995 3996
  {"help", '?', "Display this help and exit.", 
   (gptr*) &opt_help, (gptr*) &opt_help, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
   0, 0},
#ifdef HAVE_REPLICATION
  {"abort-slave-event-count", OPT_ABORT_SLAVE_EVENT_COUNT,
   "Option used by mysql-test for debugging and testing of replication.",
   (gptr*) &abort_slave_event_count,  (gptr*) &abort_slave_event_count,
   0, GET_INT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#endif /* HAVE_REPLICATION */
3997
  {"ansi", 'a', "Use ANSI SQL syntax instead of MySQL syntax.", 0, 0, 0,
3998 3999 4000 4001 4002
   GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
  {"basedir", 'b',
   "Path to installation directory. All paths are usually resolved relative to this.",
   (gptr*) &mysql_home_ptr, (gptr*) &mysql_home_ptr, 0, GET_STR, REQUIRED_ARG,
   0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4003 4004 4005 4006
  {"bdb", OPT_BDB, "Enable Berkeley DB (if this version of MySQL supports it). \
Disable with --skip-bdb (will save memory).",
   (gptr*) &opt_bdb, (gptr*) &opt_bdb, 0, GET_BOOL, NO_ARG, 1, 0, 0,
   0, 0, 0},
unknown's avatar
unknown committed
4007
#ifdef HAVE_BERKELEY_DB
4008
  {"bdb-home", OPT_BDB_HOME, "Berkeley home directory.", (gptr*) &berkeley_home,
4009 4010
   (gptr*) &berkeley_home, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  {"bdb-lock-detect", OPT_BDB_LOCK,
4011
   "Berkeley lock detect (DEFAULT, OLDEST, RANDOM or YOUNGEST, # sec).",
4012
   0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
4013
  {"bdb-logdir", OPT_BDB_LOG, "Berkeley DB log file directory.",
4014 4015 4016
   (gptr*) &berkeley_logdir, (gptr*) &berkeley_logdir, 0, GET_STR,
   REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  {"bdb-no-recover", OPT_BDB_NO_RECOVER,
4017
   "Don't try to recover Berkeley DB tables on start.", 0, 0, 0, GET_NO_ARG,
4018
   NO_ARG, 0, 0, 0, 0, 0, 0},
4019 4020 4021 4022
  {"bdb-no-sync", OPT_BDB_NOSYNC,
   "Disable synchronously flushing logs. This option is deprecated, use --skip-sync-bdb-logs or sync-bdb-logs=0 instead",
   //   (gptr*) &opt_sync_bdb_logs, (gptr*) &opt_sync_bdb_logs, 0, GET_BOOL,
   0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
4023
  {"bdb-shared-data", OPT_BDB_SHARED,
4024
   "Start Berkeley DB in multi-process mode.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0,
4025
   0, 0, 0, 0, 0},
4026
  {"bdb-tmpdir", OPT_BDB_TMP, "Berkeley DB tempfile name.",
4027 4028 4029
   (gptr*) &berkeley_tmpdir, (gptr*) &berkeley_tmpdir, 0, GET_STR,
   REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#endif /* HAVE_BERKELEY_DB */
unknown's avatar
unknown committed
4030
  {"big-tables", OPT_BIG_TABLES,
4031
   "Allow big result sets by saving all temporary sets on file (Solves most 'table full' errors).",
4032
   0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4033 4034 4035
  {"bind-address", OPT_BIND_ADDRESS, "IP address to bind to.",
   (gptr*) &my_bind_addr_str, (gptr*) &my_bind_addr_str, 0, GET_STR,
   REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
4036 4037 4038
  {"binlog-do-db", OPT_BINLOG_DO_DB,
   "Tells the master it should log updates for the specified database, and exclude all others not explicitly mentioned.",
   0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4039
  {"binlog-ignore-db", OPT_BINLOG_IGNORE_DB,
4040
   "Tells the master that updates to the given database should not be logged tothe binary log.",
4041
   0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
4042
  {"bootstrap", OPT_BOOTSTRAP, "Used by mysql installation scripts.", 0, 0, 0,
4043
   GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4044
  {"character-set-server", 'C', "Set the default character set.",
unknown's avatar
unknown committed
4045 4046
   (gptr*) &default_character_set_name, (gptr*) &default_character_set_name,
   0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
unknown's avatar
unknown committed
4047 4048 4049 4050 4051 4052 4053
  {"character-sets-dir", OPT_CHARSETS_DIR,
   "Directory where character sets are.", (gptr*) &charsets_dir,
   (gptr*) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  {"chroot", 'r', "Chroot mysqld daemon during startup.",
   (gptr*) &mysqld_chroot, (gptr*) &mysqld_chroot, 0, GET_STR, REQUIRED_ARG,
   0, 0, 0, 0, 0, 0},
  {"collation-server", OPT_DEFAULT_COLLATION, "Set the default collation.",
unknown's avatar
unknown committed
4054 4055
   (gptr*) &default_collation_name, (gptr*) &default_collation_name,
   0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
unknown's avatar
unknown committed
4056 4057 4058 4059
  {"concurrent-insert", OPT_CONCURRENT_INSERT,
   "Use concurrent insert with MyISAM. Disable with --skip-concurrent-insert.",
   (gptr*) &myisam_concurrent_insert, (gptr*) &myisam_concurrent_insert,
   0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
4060
  {"console", OPT_CONSOLE, "Write error output on screen; Don't remove the console window on windows.",
4061 4062
   (gptr*) &opt_console, (gptr*) &opt_console, 0, GET_BOOL, NO_ARG, 0, 0, 0,
   0, 0, 0},
4063
  {"core-file", OPT_WANT_CORE, "Write core on errors.", 0, 0, 0, GET_NO_ARG,
4064
   NO_ARG, 0, 0, 0, 0, 0, 0},
4065
  {"datadir", 'h', "Path to the database root.", (gptr*) &mysql_data_home,
4066 4067 4068 4069 4070
   (gptr*) &mysql_data_home, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#ifndef DBUG_OFF
  {"debug", '#', "Debug log.", (gptr*) &default_dbug_option,
   (gptr*) &default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
#endif
unknown's avatar
unknown committed
4071
  {"default-character-set", 'C', "Set the default character set (deprecated option, use --character-set-server instead).",
4072
   (gptr*) &default_character_set_name, (gptr*) &default_character_set_name,
4073
   0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
unknown's avatar
unknown committed
4074
  {"default-collation", OPT_DEFAULT_COLLATION, "Set the default collation (deprecated option, use --collation-server instead).",
4075 4076
   (gptr*) &default_collation_name, (gptr*) &default_collation_name,
   0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
unknown's avatar
unknown committed
4077 4078 4079 4080
  {"default-storage-engine", OPT_STORAGE_ENGINE,
   "Set the default storage engine (table tyoe) for tables.", 0, 0,
   0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  {"default-table-type", OPT_STORAGE_ENGINE,
unknown's avatar
unknown committed
4081
   "(deprecated) Use --default-storage-engine.", 0, 0,
4082
   0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
4083 4084 4085
  {"default-time-zone", OPT_DEFAULT_TIME_ZONE, "Set the default time zone.",
   (gptr*) &default_tz_name, (gptr*) &default_tz_name,
   0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
4086
  {"delay-key-write", OPT_DELAY_KEY_WRITE, "Type of DELAY_KEY_WRITE.",
4087 4088
   0,0,0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
  {"delay-key-write-for-all-tables", OPT_DELAY_KEY_WRITE_ALL,
4089
   "Don't flush key buffers between writes for any MyISAM table (Deprecated option, use --delay-key-write=all instead).",
4090
   0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103
#ifdef HAVE_OPENSSL
  {"des-key-file", OPT_DES_KEY_FILE,
   "Load keys for des_encrypt() and des_encrypt from given file.",
   (gptr*) &des_key_file, (gptr*) &des_key_file, 0, GET_STR, REQUIRED_ARG,
   0, 0, 0, 0, 0, 0},
#endif /* HAVE_OPENSSL */
#ifdef HAVE_REPLICATION
  {"disconnect-slave-event-count", OPT_DISCONNECT_SLAVE_EVENT_COUNT,
   "Option used by mysql-test for debugging and testing of replication.",
   (gptr*) &disconnect_slave_event_count,
   (gptr*) &disconnect_slave_event_count, 0, GET_INT, REQUIRED_ARG, 0, 0, 0,
   0, 0, 0},
#endif /* HAVE_REPLICATION */
4104
  {"enable-locking", OPT_ENABLE_LOCK,
4105
   "Deprecated option, use --external-locking instead.",
4106 4107
   (gptr*) &opt_external_locking, (gptr*) &opt_external_locking,
   0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
4108
#ifdef __NT__
4109
  {"enable-named-pipe", OPT_HAVE_NAMED_PIPE, "Enable the named pipe (NT).",
4110 4111 4112
   (gptr*) &opt_enable_named_pipe, (gptr*) &opt_enable_named_pipe, 0, GET_BOOL,
   NO_ARG, 0, 0, 0, 0, 0, 0},
#endif
4113
  {"enable-pstack", OPT_DO_PSTACK, "Print a symbolic stack trace on failure.",
4114 4115 4116 4117
   (gptr*) &opt_do_pstack, (gptr*) &opt_do_pstack, 0, GET_BOOL, NO_ARG, 0, 0,
   0, 0, 0, 0},
  {"exit-info", 'T', "Used for debugging;  Use at your own risk!", 0, 0, 0,
   GET_LONG, OPT_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4118 4119 4120
  {"external-locking", OPT_USE_LOCKING, "Use system (external) locking.  With this option enabled you can run myisamchk to test (not repair) tables while the MySQL server is running.",
   (gptr*) &opt_external_locking, (gptr*) &opt_external_locking,
   0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
4121
  {"flush", OPT_FLUSH, "Flush tables to disk between SQL commands.", 0, 0, 0,
4122 4123 4124
   GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
  /* We must always support the next option to make scripts like mysqltest
     easier to do */
4125 4126 4127 4128
  {"gdb", OPT_DEBUGGING,
   "Set up signals usable for debugging",
   (gptr*) &opt_debugging, (gptr*) &opt_debugging,
   0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4129 4130 4131 4132 4133 4134
  {"init-connect", OPT_INIT_CONNECT, "Command(s) that are executed for each new connection",
   (gptr*) &opt_init_connect, (gptr*) &opt_init_connect, 0, GET_STR_ALLOC,
   REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  {"init-file", OPT_INIT_FILE, "Read SQL commands from this file at startup.",
   (gptr*) &opt_init_file, (gptr*) &opt_init_file, 0, GET_STR, REQUIRED_ARG,
   0, 0, 0, 0, 0, 0},
4135
  {"init-rpl-role", OPT_INIT_RPL_ROLE, "Set the replication role.", 0, 0, 0,
4136
   GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4137 4138 4139 4140 4141 4142 4143
  {"init-slave", OPT_INIT_SLAVE, "Command(s) that are executed when a slave connects to this master",
   (gptr*) &opt_init_slave, (gptr*) &opt_init_slave, 0, GET_STR_ALLOC,
   REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  {"innodb", OPT_INNODB, "Enable InnoDB (if this version of MySQL supports it). \
Disable with --skip-innodb (will save memory).",
   (gptr*) &opt_innodb, (gptr*) &opt_innodb, 0, GET_BOOL, NO_ARG, 1, 0, 0,
   0, 0, 0},
4144
  {"innodb_data_file_path", OPT_INNODB_DATA_FILE_PATH,
4145
   "Path to individual files and their sizes.",
4146
   0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4147
#ifdef HAVE_INNOBASE_DB
4148
  {"innodb_data_home_dir", OPT_INNODB_DATA_HOME_DIR,
unknown's avatar
unknown committed
4149
   "The common part for InnoDB table spaces.", (gptr*) &innobase_data_home_dir,
4150 4151
   (gptr*) &innobase_data_home_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0,
   0},
unknown's avatar
unknown committed
4152 4153 4154 4155 4156 4157 4158
  {"innodb_fast_shutdown", OPT_INNODB_FAST_SHUTDOWN,
   "Speeds up server shutdown process.", (gptr*) &innobase_fast_shutdown,
   (gptr*) &innobase_fast_shutdown, 0, GET_BOOL, OPT_ARG, 1, 0, 0, 0, 0, 0},
  {"innodb_file_per_table", OPT_INNODB_FILE_PER_TABLE,
   "Stores each InnoDB table to an .ibd file in the database dir.",
   (gptr*) &innobase_file_per_table,
   (gptr*) &innobase_file_per_table, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
4159
  {"innodb_flush_log_at_trx_commit", OPT_INNODB_FLUSH_LOG_AT_TRX_COMMIT,
4160
   "Set to 0 (write and flush once per second), 1 (write and flush at each commit) or 2 (write at commit, flush once per second).",
4161 4162
   (gptr*) &innobase_flush_log_at_trx_commit,
   (gptr*) &innobase_flush_log_at_trx_commit,
unknown's avatar
unknown committed
4163
   0, GET_UINT, OPT_ARG,  1, 0, 2, 0, 0, 0},
4164
  {"innodb_flush_method", OPT_INNODB_FLUSH_METHOD,
4165
   "With which method to flush data.", (gptr*) &innobase_unix_file_flush_method,
4166 4167
   (gptr*) &innobase_unix_file_flush_method, 0, GET_STR, REQUIRED_ARG, 0, 0, 0,
   0, 0, 0},
4168
  {"innodb_locks_unsafe_for_binlog", OPT_INNODB_LOCKS_UNSAFE_FOR_BINLOG,
unknown's avatar
unknown committed
4169
   "Force InnoDB not to use next-key locking. Instead use only row-level locking",
4170 4171
   (gptr*) &innobase_locks_unsafe_for_binlog,
   (gptr*) &innobase_locks_unsafe_for_binlog, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4172 4173 4174 4175 4176
  {"innodb_log_arch_dir", OPT_INNODB_LOG_ARCH_DIR,
   "Where full logs should be archived.", (gptr*) &innobase_log_arch_dir,
   (gptr*) &innobase_log_arch_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  {"innodb_log_archive", OPT_INNODB_LOG_ARCHIVE,
   "Set to 1 if you want to have logs archived.", 0, 0, 0, GET_LONG, OPT_ARG,
4177
   0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4178 4179 4180 4181 4182 4183 4184
  {"innodb_log_group_home_dir", OPT_INNODB_LOG_GROUP_HOME_DIR,
   "Path to InnoDB log files.", (gptr*) &innobase_log_group_home_dir,
   (gptr*) &innobase_log_group_home_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0,
   0, 0},
  {"innodb_max_dirty_pages_pct", OPT_INNODB_MAX_DIRTY_PAGES_PCT,
   "Percentage of dirty pages allowed in bufferpool.", (gptr*) &srv_max_buf_pool_modified_pct,
   (gptr*) &srv_max_buf_pool_modified_pct, 0, GET_ULONG, REQUIRED_ARG, 90, 0, 100, 0, 0, 0},
4185 4186 4187 4188
  {"innodb_status_file", OPT_INNODB_STATUS_FILE,
   "Enable SHOW INNODB STATUS output in the innodb_status.<pid> file",
   (gptr*) &innobase_create_status_file, (gptr*) &innobase_create_status_file,
   0, GET_BOOL, OPT_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4189 4190 4191 4192 4193
#endif /* End HAVE_INNOBASE_DB */
  {"isam", OPT_ISAM, "Enable ISAM (if this version of MySQL supports it). \
Disable with --skip-isam.",
   (gptr*) &opt_isam, (gptr*) &opt_isam, 0, GET_BOOL, NO_ARG, 1, 0, 0,
   0, 0, 0},
4194
  {"language", 'L',
4195
   "Client error messages in given language. May be given as a full path.",
4196 4197 4198
   (gptr*) &language_ptr, (gptr*) &language_ptr, 0, GET_STR, REQUIRED_ARG,
   0, 0, 0, 0, 0, 0},
  {"local-infile", OPT_LOCAL_INFILE,
4199
   "Enable/disable LOAD DATA LOCAL INFILE (takes values 1|0).",
unknown's avatar
unknown committed
4200 4201
   (gptr*) &opt_local_infile,
   (gptr*) &opt_local_infile, 0, GET_BOOL, OPT_ARG,
4202
   1, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4203 4204
  {"log", 'l', "Log connections and queries to file.", (gptr*) &opt_logname,
   (gptr*) &opt_logname, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
4205
  {"log-bin", OPT_BIN_LOG,
4206
   "Log update queries in binary format.",
unknown's avatar
unknown committed
4207
   (gptr*) &opt_bin_logname, (gptr*) &opt_bin_logname, 0, GET_STR_ALLOC,
unknown's avatar
unknown committed
4208
   OPT_ARG, 0, 0, 0, 0, 0, 0},
4209
  {"log-bin-index", OPT_BIN_LOG_INDEX,
4210
   "File that holds the names for last binary log files.",
4211 4212
   (gptr*) &opt_binlog_index_name, (gptr*) &opt_binlog_index_name, 0, GET_STR,
   REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4213 4214 4215
  {"log-error", OPT_ERROR_LOG_FILE, "Log error file.",
   (gptr*) &log_error_file_ptr, (gptr*) &log_error_file_ptr, 0, GET_STR,
   OPT_ARG, 0, 0, 0, 0, 0, 0},
4216
  {"log-isam", OPT_ISAM_LOG, "Log all MyISAM changes to file.",
4217 4218
   (gptr*) &myisam_log_filename, (gptr*) &myisam_log_filename, 0, GET_STR,
   OPT_ARG, 0, 0, 0, 0, 0, 0},
4219 4220 4221 4222 4223 4224 4225
  {"log-long-format", '0',
   "Log some extra information to update log. Please note that this option is deprecated; see --log-short-format option.", 
   0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
  {"log-queries-not-using-indexes", OPT_LOG_QUERIES_NOT_USING_INDEXES,
   "Log queries that are executed without benefit of any index.",
   (gptr*) &opt_log_queries_not_using_indexes, (gptr*) &opt_log_queries_not_using_indexes,
   0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4226 4227 4228 4229
  {"log-short-format", OPT_SHORT_LOG_FORMAT,
   "Don't log extra information to update and slow-query logs.",
   (gptr*) &opt_short_log_format, (gptr*) &opt_short_log_format,
   0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
4230
  {"log-slave-updates", OPT_LOG_SLAVE_UPDATES,
unknown's avatar
unknown committed
4231
   "Tells the slave to log the updates from the slave thread to the binary log. You will need to turn it on if you plan to daisy-chain the slaves.",
4232 4233
   (gptr*) &opt_log_slave_updates, (gptr*) &opt_log_slave_updates, 0, GET_BOOL,
   NO_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4234 4235 4236 4237 4238 4239 4240 4241
  {"log-slow-queries", OPT_SLOW_QUERY_LOG,
   "Log slow queries to this log file. Defaults logging to hostname-slow.log file.",
   (gptr*) &opt_slow_logname, (gptr*) &opt_slow_logname, 0, GET_STR, OPT_ARG,
   0, 0, 0, 0, 0, 0},
  {"log-update", OPT_UPDATE_LOG,
   "Log updates to file.# where # is a unique number if not given.",
   (gptr*) &opt_update_logname, (gptr*) &opt_update_logname, 0, GET_STR,
   OPT_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4242
  {"log-warnings", 'W', "Log some non-critical warnings to the error log file. Use this option twice or --log-warnings=2 if you also want 'Aborted connections' warnings.",
unknown's avatar
unknown committed
4243
   (gptr*) &global_system_variables.log_warnings,
unknown's avatar
unknown committed
4244
   (gptr*) &max_system_variables.log_warnings, 0, GET_ULONG, OPT_ARG, 1, 0, ~0L,
unknown's avatar
unknown committed
4245
   0, 0, 0},
4246
  {"low-priority-updates", OPT_LOW_PRIORITY_UPDATES,
4247
   "INSERT/DELETE/UPDATE has lower priority than selects.",
unknown's avatar
unknown committed
4248 4249 4250
   (gptr*) &global_system_variables.low_priority_updates,
   (gptr*) &max_system_variables.low_priority_updates,
   0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4251 4252 4253 4254
  {"master-connect-retry", OPT_MASTER_CONNECT_RETRY,
   "The number of seconds the slave thread will sleep before retrying to connect to the master in case the master goes down or the connection is lost.",
   (gptr*) &master_connect_retry, (gptr*) &master_connect_retry, 0, GET_UINT,
   REQUIRED_ARG, 60, 0, 0, 0, 0, 0},
4255
  {"master-host", OPT_MASTER_HOST,
4256 4257 4258
   "Master hostname or IP address for replication. If not set, the slave thread will not be started. Note that the setting of master-host will be ignored if there exists a valid master.info file.",
   (gptr*) &master_host, (gptr*) &master_host, 0, GET_STR, REQUIRED_ARG, 0, 0,
   0, 0, 0, 0},
unknown's avatar
unknown committed
4259 4260 4261 4262 4263
  {"master-info-file", OPT_MASTER_INFO_FILE,
   "The location and name of the file that remembers the master and where the I/O replication \
thread is in the master's binlogs.",
   (gptr*) &master_info_file, (gptr*) &master_info_file, 0, GET_STR,
   REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
4264 4265
  {"master-password", OPT_MASTER_PASSWORD,
   "The password the slave thread will authenticate with when connecting to the master. If not set, an empty password is assumed.The value in master.info will take precedence if it can be read.",
unknown's avatar
unknown committed
4266 4267
   (gptr*)&master_password, (gptr*)&master_password, 0,
   GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
4268
  {"master-port", OPT_MASTER_PORT,
4269
   "The port the master is listening on. If not set, the compiled setting of MYSQL_PORT is assumed. If you have not tinkered with configure options, this should be 3306. The value in master.info will take precedence if it can be read.",
4270 4271 4272 4273 4274
   (gptr*) &master_port, (gptr*) &master_port, 0, GET_UINT, REQUIRED_ARG,
   MYSQL_PORT, 0, 0, 0, 0, 0},
  {"master-retry-count", OPT_MASTER_RETRY_COUNT,
   "The number of tries the slave will make to connect to the master before giving up.",
   (gptr*) &master_retry_count, (gptr*) &master_retry_count, 0, GET_ULONG,
4275
   REQUIRED_ARG, 3600*24, 0, 0, 0, 0, 0},
4276
  {"master-ssl", OPT_MASTER_SSL,
unknown's avatar
unknown committed
4277
   "Enable the slave to connect to the master using SSL.",
4278 4279
   (gptr*) &master_ssl, (gptr*) &master_ssl, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
   0, 0},
unknown's avatar
unknown committed
4280 4281 4282 4283
  {"master-ssl-ca", OPT_MASTER_SSL_CA,
   "Master SSL CA file. Only applies if you have enabled master-ssl.",
   (gptr*) &master_ssl_ca, (gptr*) &master_ssl_ca, 0, GET_STR, OPT_ARG,
   0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4284
  {"master-ssl-capath", OPT_MASTER_SSL_CAPATH,
unknown's avatar
unknown committed
4285
   "Master SSL CA path. Only applies if you have enabled master-ssl.",
unknown's avatar
unknown committed
4286 4287
   (gptr*) &master_ssl_capath, (gptr*) &master_ssl_capath, 0, GET_STR, OPT_ARG,
   0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4288 4289 4290 4291 4292
  {"master-ssl-cert", OPT_MASTER_SSL_CERT,
   "Master SSL certificate file name. Only applies if you have enabled \
master-ssl",
   (gptr*) &master_ssl_cert, (gptr*) &master_ssl_cert, 0, GET_STR, OPT_ARG,
   0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4293
  {"master-ssl-cipher", OPT_MASTER_SSL_CIPHER,
unknown's avatar
unknown committed
4294
   "Master SSL cipher. Only applies if you have enabled master-ssl.",
unknown's avatar
unknown committed
4295
   (gptr*) &master_ssl_cipher, (gptr*) &master_ssl_capath, 0, GET_STR, OPT_ARG,
4296
   0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4297 4298 4299 4300 4301 4302 4303 4304
  {"master-ssl-key", OPT_MASTER_SSL_KEY,
   "Master SSL keyfile name. Only applies if you have enabled master-ssl.",
   (gptr*) &master_ssl_key, (gptr*) &master_ssl_key, 0, GET_STR, OPT_ARG,
   0, 0, 0, 0, 0, 0},
  {"master-user", OPT_MASTER_USER,
   "The username the slave thread will use for authentication when connecting to the master. The user must have FILE privilege. If the master user is not set, user test is assumed. The value in master.info will take precedence if it can be read.",
   (gptr*) &master_user, (gptr*) &master_user, 0, GET_STR, REQUIRED_ARG, 0, 0,
   0, 0, 0, 0},
unknown's avatar
SCRUM  
unknown committed
4305
#ifdef HAVE_REPLICATION
4306
  {"max-binlog-dump-events", OPT_MAX_BINLOG_DUMP_EVENTS,
4307
   "Option used by mysql-test for debugging and testing of replication.",
4308 4309
   (gptr*) &max_binlog_dump_events, (gptr*) &max_binlog_dump_events, 0,
   GET_INT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
SCRUM  
unknown committed
4310
#endif /* HAVE_REPLICATION */
unknown's avatar
unknown committed
4311 4312 4313 4314 4315 4316 4317 4318 4319 4320
  {"memlock", OPT_MEMLOCK, "Lock mysqld in memory.", (gptr*) &locked_in_memory,
   (gptr*) &locked_in_memory, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
  {"myisam-recover", OPT_MYISAM_RECOVER,
   "Syntax: myisam-recover[=option[,option...]], where option can be DEFAULT, BACKUP, FORCE or QUICK.",
   (gptr*) &myisam_recover_options_str, (gptr*) &myisam_recover_options_str, 0,
   GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
  {"ndbcluster", OPT_NDBCLUSTER, "Enable NDB Cluster (if this version of MySQL supports it). \
Disable with --skip-ndbcluster (will save memory).",
   (gptr*) &opt_ndbcluster, (gptr*) &opt_ndbcluster, 0, GET_BOOL, NO_ARG, 1, 0, 0,
   0, 0, 0},
4321 4322 4323 4324 4325
#ifdef HAVE_NDBCLUSTER_DB
  {"ndb-connectstring", OPT_NDB_CONNECTSTRING, "Connect string for ndbcluster.",
   (gptr*) &ndbcluster_connectstring, (gptr*) &ndbcluster_connectstring, 0, GET_STR,
   REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#endif
4326
  {"new", 'n', "Use very new possible 'unsafe' functions.",
4327 4328 4329
   (gptr*) &global_system_variables.new_mode,
   (gptr*) &max_system_variables.new_mode,
   0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4330
#ifdef NOT_YET
4331
  {"no-mix-table-types", OPT_NO_MIX_TYPE, "Don't allow commands with uses two different table types.",
4332 4333 4334
   (gptr*) &opt_no_mix_types, (gptr*) &opt_no_mix_types, 0, GET_BOOL, NO_ARG,
   0, 0, 0, 0, 0, 0},
#endif
4335 4336 4337 4338
  {"old-passwords", OPT_OLD_PASSWORDS, "Use old password encryption method (needed for 4.0 and older clients).",
   (gptr*) &global_system_variables.old_passwords,
   (gptr*) &max_system_variables.old_passwords, 0, GET_BOOL, NO_ARG,
   0, 0, 0, 0, 0, 0},
4339
#ifdef ONE_THREAD
4340
  {"one-thread", OPT_ONE_THREAD,
4341
   "Only use one thread (for debugging under Linux).", 0, 0, 0, GET_NO_ARG,
4342 4343
   NO_ARG, 0, 0, 0, 0, 0, 0},
#endif
4344
  {"pid-file", OPT_PID_FILE, "Pid file used by safe_mysqld.",
4345 4346
   (gptr*) &pidfile_name_ptr, (gptr*) &pidfile_name_ptr, 0, GET_STR,
   REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
4347 4348
  {"port", 'P', "Port number to use for connection.", (gptr*) &mysqld_port,
   (gptr*) &mysqld_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362
  {"relay-log", OPT_RELAY_LOG,
   "The location and name to use for relay logs.",
   (gptr*) &opt_relay_logname, (gptr*) &opt_relay_logname, 0,
   GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  {"relay-log-index", OPT_RELAY_LOG_INDEX,
   "The location and name to use for the file that keeps a list of the last \
relay logs.",
   (gptr*) &opt_relaylog_index_name, (gptr*) &opt_relaylog_index_name, 0,
   GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  {"relay-log-info-file", OPT_RELAY_LOG_INFO_FILE,
   "The location and name of the file that remembers where the SQL replication \
thread is in the relay logs.",
   (gptr*) &relay_log_info_file, (gptr*) &relay_log_info_file, 0, GET_STR,
   REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375
  {"replicate-do-db", OPT_REPLICATE_DO_DB,
   "Tells the slave thread to restrict replication to the specified database. To specify more than one database, use the directive multiple times, once for each database. Note that this will only work if you do not use cross-database queries such as UPDATE some_db.some_table SET foo='bar' while having selected a different or no database. If you need cross database updates to work, make sure you have 3.23.28 or later, and use replicate-wild-do-table=db_name.%.",
   0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  {"replicate-do-table", OPT_REPLICATE_DO_TABLE,
   "Tells the slave thread to restrict replication to the specified table. To specify more than one table, use the directive multiple times, once for each table. This will work for cross-database updates, in contrast to replicate-do-db.",
   0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  {"replicate-ignore-db", OPT_REPLICATE_IGNORE_DB,
   "Tells the slave thread to not replicate to the specified database. To specify more than one database to ignore, use the directive multiple times, once for each database. This option will not work if you use cross database updates. If you need cross database updates to work, make sure you have 3.23.28 or later, and use replicate-wild-ignore-table=db_name.%. ",
   0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  {"replicate-ignore-table", OPT_REPLICATE_IGNORE_TABLE,
   "Tells the slave thread to not replicate to the specified table. To specify more than one table to ignore, use the directive multiple times, once for each table. This will work for cross-datbase updates, in contrast to replicate-ignore-db.",
   0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  {"replicate-rewrite-db", OPT_REPLICATE_REWRITE_DB,
4376
   "Updates to a database with a different name than the original. Example: replicate-rewrite-db=master_db_name->slave_db_name.",
4377
   0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4378 4379 4380 4381 4382 4383
  {"replicate-wild-do-table", OPT_REPLICATE_WILD_DO_TABLE,
   "Tells the slave thread to restrict replication to the tables that match the specified wildcard pattern. To specify more than one table, use the directive multiple times, once for each table. This will work for cross-database updates. Example: replicate-wild-do-table=foo%.bar% will replicate only updates to tables in all databases that start with foo and whose table names start with bar.",
   0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  {"replicate-wild-ignore-table", OPT_REPLICATE_WILD_IGNORE_TABLE,
   "Tells the slave thread to not replicate to the tables that match the given wildcard pattern. To specify more than one table to ignore, use the directive multiple times, once for each table. This will work for cross-database updates. Example: replicate-wild-ignore-table=foo%.bar% will not do updates to tables in databases that start with foo and whose table names start with bar.",
   0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4384
#ifdef HAVE_REPLICATION
4385 4386 4387 4388 4389 4390 4391
  {"replicate-same-server-id", OPT_REPLICATE_SAME_SERVER_ID,
   "In replication, if set to 1, do not skip events having our server id. \
Default value is 0 (to break infinite loops in circular replication). \
Can't be set to 1 if --log-slave-updates is used.",
   (gptr*) &replicate_same_server_id,
   (gptr*) &replicate_same_server_id,
   0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4392
#endif
4393
  // In replication, we may need to tell the other servers how to connect
4394 4395 4396 4397
  {"report-host", OPT_REPORT_HOST,
   "Hostname or IP of the slave to be reported to to the master during slave registration. Will appear in the output of SHOW SLAVE HOSTS. Leave unset if you do not want the slave to register itself with the master. Note that it is not sufficient for the master to simply read the IP of the slave off the socket once the slave connects. Due to NAT and other routing issues, that IP may not be valid for connecting to the slave from the master or other hosts.",
   (gptr*) &report_host, (gptr*) &report_host, 0, GET_STR, REQUIRED_ARG, 0, 0,
   0, 0, 0, 0},
4398
  {"report-password", OPT_REPORT_PASSWORD, "Undocumented.",
4399 4400 4401 4402 4403 4404
   (gptr*) &report_password, (gptr*) &report_password, 0, GET_STR,
   REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  {"report-port", OPT_REPORT_PORT,
   "Port for connecting to slave reported to the master during slave registration. Set it only if the slave is listening on a non-default port or if you have a special tunnel from the master or other clients to the slave. If not sure, leave this option unset.",
   (gptr*) &report_port, (gptr*) &report_port, 0, GET_UINT, REQUIRED_ARG,
   MYSQL_PORT, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4405 4406
  {"report-user", OPT_REPORT_USER, "Undocumented.", (gptr*) &report_user,
   (gptr*) &report_user, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
4407
  {"rpl-recovery-rank", OPT_RPL_RECOVERY_RANK, "Undocumented.",
4408
   (gptr*) &rpl_recovery_rank, (gptr*) &rpl_recovery_rank, 0, GET_ULONG,
4409 4410 4411
   REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  {"safe-mode", OPT_SAFE, "Skip some optimize stages (for testing).",
   0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4412
#ifndef TO_BE_DELETED
4413
  {"safe-show-database", OPT_SAFE_SHOW_DB,
unknown's avatar
unknown committed
4414
   "Deprecated option; use GRANT SHOW DATABASES instead...",
unknown's avatar
unknown committed
4415
   0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4416
#endif
4417
  {"safe-user-create", OPT_SAFE_USER_CREATE,
4418
   "Don't allow new user creation by the user who has no write privileges to the mysql.user table.",
4419 4420
   (gptr*) &opt_safe_user_create, (gptr*) &opt_safe_user_create, 0, GET_BOOL,
   NO_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4421 4422 4423
  {"safemalloc-mem-limit", OPT_SAFEMALLOC_MEM_LIMIT,
   "Simulate memory shortage when compiled with the --with-debug=full option.",
   0, 0, 0, GET_ULL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
4424 4425 4426
  {"secure-auth", OPT_SECURE_AUTH, "Disallow authentication for accounts that have old (pre-4.1) passwords.",
   (gptr*) &opt_secure_auth, (gptr*) &opt_secure_auth, 0, GET_BOOL, NO_ARG,
   my_bool(0), 0, 0, 0, 0, 0},
4427
  {"server-id",	OPT_SERVER_ID,
4428
   "Uniquely identifies the server instance in the community of replication partners.",
unknown's avatar
unknown committed
4429
   (gptr*) &server_id, (gptr*) &server_id, 0, GET_ULONG, REQUIRED_ARG, 0, 0, 0,
4430 4431 4432 4433
   0, 0, 0},
  {"set-variable", 'O',
   "Change the value of a variable. Please note that this option is deprecated;you can set variables directly with --variable-name=value.",
   0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
4434
#ifdef HAVE_SMEM
unknown's avatar
unknown committed
4435 4436 4437 4438 4439 4440
  {"shared-memory", OPT_ENABLE_SHARED_MEMORY,
   "Enable the shared memory.",(gptr*) &opt_enable_shared_memory, (gptr*) &opt_enable_shared_memory,
   0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
#endif
#ifdef HAVE_SMEM
  {"shared-memory-base-name",OPT_SHARED_MEMORY_BASE_NAME,
4441
   "Base name of shared memory.", (gptr*) &shared_memory_base_name, (gptr*) &shared_memory_base_name,
4442 4443
   0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#endif
unknown's avatar
unknown committed
4444
  {"show-slave-auth-info", OPT_SHOW_SLAVE_AUTH_INFO,
4445
   "Show user and password in SHOW SLAVE HOSTS on this master",
4446 4447 4448 4449 4450 4451
   (gptr*) &opt_show_slave_auth_info, (gptr*) &opt_show_slave_auth_info, 0,
   GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
  {"skip-grant-tables", OPT_SKIP_GRANT,
   "Start without grant tables. This gives all users FULL ACCESS to all tables!",
   (gptr*) &opt_noacl, (gptr*) &opt_noacl, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0,
   0},
unknown's avatar
unknown committed
4452 4453
  {"skip-host-cache", OPT_SKIP_HOST_CACHE, "Don't cache host names.", 0, 0, 0,
   GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
4454
  {"skip-locking", OPT_SKIP_LOCK,
4455
   "Deprecated option, use --skip-external-locking instead.",
4456 4457
   0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
  {"skip-name-resolve", OPT_SKIP_RESOLVE,
4458
   "Don't resolve hostnames. All hostnames are IP's or 'localhost'.",
4459 4460 4461 4462 4463 4464
   0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
  {"skip-networking", OPT_SKIP_NETWORKING,
   "Don't allow connection with TCP/IP.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0,
   0, 0, 0},
  {"skip-new", OPT_SKIP_NEW, "Don't use new, possible wrong routines.",
   0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4465 4466 4467 4468 4469 4470 4471
#ifndef DBUG_OFF
#ifdef SAFEMALLOC
  {"skip-safemalloc", OPT_SKIP_SAFEMALLOC,
   "Don't use the memory allocation checking.", 0, 0, 0, GET_NO_ARG, NO_ARG,
   0, 0, 0, 0, 0, 0},
#endif
#endif
4472
  {"skip-show-database", OPT_SKIP_SHOW_DB,
4473
   "Don't allow 'SHOW DATABASE' commands.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0,
4474 4475 4476 4477 4478
   0, 0, 0, 0},
  {"skip-slave-start", OPT_SKIP_SLAVE_START,
   "If set, slave is not autostarted.", (gptr*) &opt_skip_slave_start,
   (gptr*) &opt_skip_slave_start, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
  {"skip-stack-trace", OPT_SKIP_STACK_TRACE,
4479
   "Don't print a stack trace on failure.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0,
4480
   0, 0, 0, 0},
unknown's avatar
unknown committed
4481
  {"skip-symlink", OPT_SKIP_SYMLINKS, "Don't allow symlinking of tables. Deprecated option.  Use --skip-symbolic-links instead.",
4482 4483 4484 4485
   0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
  {"skip-thread-priority", OPT_SKIP_PRIOR,
   "Don't give threads different priorities.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0,
   0, 0, 0, 0, 0},
unknown's avatar
SCRUM  
unknown committed
4486
#ifdef HAVE_REPLICATION
4487
  {"slave-load-tmpdir", OPT_SLAVE_LOAD_TMPDIR,
4488
   "The location where the slave should put its temporary files when \
4489
replicating a LOAD DATA INFILE command.",
unknown's avatar
unknown committed
4490
   (gptr*) &slave_load_tmpdir, (gptr*) &slave_load_tmpdir, 0, GET_STR_ALLOC,
4491 4492
   REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  {"slave-skip-errors", OPT_SLAVE_SKIP_ERRORS,
4493
   "Tells the slave thread to continue replication when a query returns an error from the provided list.",
4494
   0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
4495
#endif
4496
  {"socket", OPT_SOCKET, "Socket file to use for connection.",
4497
   (gptr*) &mysqld_unix_port, (gptr*) &mysqld_unix_port, 0, GET_STR,
4498
   REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4499 4500 4501 4502 4503 4504 4505
#ifdef HAVE_REPLICATION
  {"sporadic-binlog-dump-fail", OPT_SPORADIC_BINLOG_DUMP_FAIL,
   "Option used by mysql-test for debugging and testing of replication.",
   (gptr*) &opt_sporadic_binlog_dump_fail,
   (gptr*) &opt_sporadic_binlog_dump_fail, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0,
   0},
#endif /* HAVE_REPLICATION */
4506 4507 4508 4509 4510
  {"sql-bin-update-same", OPT_SQL_BIN_UPDATE_SAME,
   "If set, setting SQL_LOG_BIN to a value will automatically set SQL_LOG_UPDATE to the same value and vice versa.",
   (gptr*) &opt_sql_bin_update, (gptr*) &opt_sql_bin_update, 0, GET_BOOL,
   NO_ARG, 0, 0, 0, 0, 0, 0},
  {"sql-mode", OPT_SQL_MODE,
4511
   "Syntax: sql-mode=option[,option[,option...]] where option can be one of: REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, ONLY_FULL_GROUP_BY, NO_UNSIGNED_SUBTRACTION.",
4512 4513
   (gptr*) &sql_mode_str, (gptr*) &sql_mode_str, 0, GET_STR, REQUIRED_ARG, 0,
   0, 0, 0, 0, 0},
4514
#ifdef HAVE_OPENSSL
4515 4516
#include "sslopt-longopts.h"
#endif
unknown's avatar
unknown committed
4517 4518 4519 4520 4521 4522 4523 4524
#ifdef __WIN__
  {"standalone", OPT_STANDALONE,
  "Dummy option to start as a standalone program (NT).", 0, 0, 0, GET_NO_ARG,
   NO_ARG, 0, 0, 0, 0, 0, 0},
#endif
  {"symbolic-links", 's', "Enable symbolic link support.",
   (gptr*) &my_use_symdir, (gptr*) &my_use_symdir, 0, GET_BOOL, NO_ARG,
   IF_PURIFY(0,1), 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4525
  {"temp-pool", OPT_TEMP_POOL,
4526
   "Using this option will cause most temporary files created to use a small set of names, rather than a unique name for each new file.",
unknown's avatar
unknown committed
4527 4528
   (gptr*) &use_temp_pool, (gptr*) &use_temp_pool, 0, GET_BOOL, NO_ARG, 1,
   0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4529 4530
  {"tmpdir", 't',
   "Path for temporary files. Several paths may be specified, separated by a "
4531
#if defined( __WIN__) || defined(OS2) || defined(__NETWARE__)
unknown's avatar
unknown committed
4532 4533 4534 4535 4536 4537
   "semicolon (;)"
#else
   "colon (:)"
#endif
   ", in this case they are used in a round-robin fashion.",
   (gptr*) &opt_mysql_tmpdir,
unknown's avatar
unknown committed
4538
   (gptr*) &opt_mysql_tmpdir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
4539
  {"transaction-isolation", OPT_TX_ISOLATION,
4540
   "Default transaction isolation level.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0,
unknown's avatar
unknown committed
4541
   0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4542
  {"use-symbolic-links", 's', "Enable symbolic link support. Deprecated option; use --symbolic-links instead.",
4543
   (gptr*) &my_use_symdir, (gptr*) &my_use_symdir, 0, GET_BOOL, NO_ARG,
unknown's avatar
unknown committed
4544
   IF_PURIFY(0,1), 0, 0, 0, 0, 0},
4545
  {"user", 'u', "Run mysqld daemon as user.", 0, 0, 0, GET_STR, REQUIRED_ARG,
unknown's avatar
unknown committed
4546
   0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4547 4548 4549
  {"verbose", 'v', "Used with --help option for detailed help",
   (gptr*) &opt_verbose, (gptr*) &opt_verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
   0, 0},
4550
  {"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG,
4551
   NO_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4552
  {"warnings", 'W', "Deprecated; use --log-warnings instead.",
unknown's avatar
unknown committed
4553
   (gptr*) &global_system_variables.log_warnings,
4554
   (gptr*) &max_system_variables.log_warnings, 0, GET_ULONG, OPT_ARG, 1, 0, ~0L,
4555 4556
   0, 0, 0},
  { "back_log", OPT_BACK_LOG,
4557 4558
    "The number of outstanding connection requests MySQL can have. This comes into play when the main MySQL thread gets very many connection requests in a very short time.",
    (gptr*) &back_log, (gptr*) &back_log, 0, GET_ULONG,
4559
    REQUIRED_ARG, 50, 1, 65535, 0, 1, 0 },
unknown's avatar
unknown committed
4560
#ifdef HAVE_BERKELEY_DB
4561
  { "bdb_cache_size", OPT_BDB_CACHE_SIZE,
4562
    "The buffer that is allocated to cache index and rows for BDB tables.",
4563 4564
    (gptr*) &berkeley_cache_size, (gptr*) &berkeley_cache_size, 0, GET_ULONG,
    REQUIRED_ARG, KEY_CACHE_SIZE, 20*1024, (long) ~0, 0, IO_SIZE, 0},
unknown's avatar
unknown committed
4565 4566 4567 4568
  /* QQ: The following should be removed soon! (bdb_max_lock preferred) */
  {"bdb_lock_max", OPT_BDB_MAX_LOCK, "Synonym for bdb_max_lock.",
   (gptr*) &berkeley_max_lock, (gptr*) &berkeley_max_lock, 0, GET_ULONG,
   REQUIRED_ARG, 10000, 0, (long) ~0, 0, 1, 0},
4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581
  {"bdb_log_buffer_size", OPT_BDB_LOG_BUFFER_SIZE,
   "The buffer that is allocated to cache index and rows for BDB tables.",
   (gptr*) &berkeley_log_buffer_size, (gptr*) &berkeley_log_buffer_size, 0,
   GET_ULONG, REQUIRED_ARG, 0, 256*1024L, ~0L, 0, 1024, 0},
  {"bdb_max_lock", OPT_BDB_MAX_LOCK,
   "The maximum number of locks you can have active on a BDB table.",
   (gptr*) &berkeley_max_lock, (gptr*) &berkeley_max_lock, 0, GET_ULONG,
   REQUIRED_ARG, 10000, 0, (long) ~0, 0, 1, 0},
#endif /* HAVE_BERKELEY_DB */
  {"binlog_cache_size", OPT_BINLOG_CACHE_SIZE,
   "The size of the cache to hold the SQL statements for the binary log during a transaction. If you often use big, multi-statement transactions you can increase this to get more performance.",
   (gptr*) &binlog_cache_size, (gptr*) &binlog_cache_size, 0, GET_ULONG,
   REQUIRED_ARG, 32*1024L, IO_SIZE, ~0L, 0, IO_SIZE, 0},
unknown's avatar
unknown committed
4582 4583 4584 4585 4586
  {"bulk_insert_buffer_size", OPT_BULK_INSERT_BUFFER_SIZE,
   "Size of tree cache used in bulk insert optimisation. Note that this is a limit per thread!",
   (gptr*) &global_system_variables.bulk_insert_buff_size,
   (gptr*) &max_system_variables.bulk_insert_buff_size,
   0, GET_ULONG, REQUIRED_ARG, 8192*1024, 0, ~0L, 0, 1, 0},
4587
  {"connect_timeout", OPT_CONNECT_TIMEOUT,
4588
   "The number of seconds the mysqld server is waiting for a connect packet before responding with 'Bad handshake'.",
unknown's avatar
unknown committed
4589 4590
    (gptr*) &connect_timeout, (gptr*) &connect_timeout,
   0, GET_ULONG, REQUIRED_ARG, CONNECT_TIMEOUT, 2, LONG_TIMEOUT, 0, 1, 0 },
unknown's avatar
unknown committed
4591 4592 4593 4594 4595 4596
#ifdef HAVE_REPLICATION
  {"crash_binlog_innodb", OPT_CRASH_BINLOG_INNODB,
   "Used only for testing, to crash when writing Nth event to binlog.",
   (gptr*) &opt_crash_binlog_innodb, (gptr*) &opt_crash_binlog_innodb,
   0, GET_UINT, REQUIRED_ARG, 0, 0, ~(uint)0, 0, 1, 0},
#endif
unknown's avatar
unknown committed
4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611
  { "date_format", OPT_DATE_FORMAT,
    "The DATE format (For future).",
    (gptr*) &opt_date_time_formats[MYSQL_TIMESTAMP_DATE],
    (gptr*) &opt_date_time_formats[MYSQL_TIMESTAMP_DATE],
    0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  { "datetime_format", OPT_DATETIME_FORMAT,
    "The DATETIME/TIMESTAMP format (for future).",
    (gptr*) &opt_date_time_formats[MYSQL_TIMESTAMP_DATETIME],
    (gptr*) &opt_date_time_formats[MYSQL_TIMESTAMP_DATETIME],
    0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
  { "default_week_format", OPT_DEFAULT_WEEK_FORMAT,
    "The default week format used by WEEK() functions.",
    (gptr*) &global_system_variables.default_week_format,
    (gptr*) &max_system_variables.default_week_format,
    0, GET_ULONG, REQUIRED_ARG, 0, 0, 7L, 0, 1, 0},
4612 4613 4614 4615
  {"delayed_insert_limit", OPT_DELAYED_INSERT_LIMIT,
   "After inserting delayed_insert_limit rows, the INSERT DELAYED handler will check if there are any SELECT statements pending. If so, it allows these to execute before continuing.",
    (gptr*) &delayed_insert_limit, (gptr*) &delayed_insert_limit, 0, GET_ULONG,
    REQUIRED_ARG, DELAYED_LIMIT, 1, ~0L, 0, 1, 0},
unknown's avatar
unknown committed
4616 4617 4618 4619
  {"delayed_insert_timeout", OPT_DELAYED_INSERT_TIMEOUT,
   "How long a INSERT DELAYED thread should wait for INSERT statements before terminating.",
   (gptr*) &delayed_insert_timeout, (gptr*) &delayed_insert_timeout, 0,
   GET_ULONG, REQUIRED_ARG, DELAYED_WAIT_TIMEOUT, 1, LONG_TIMEOUT, 0, 1, 0},
4620 4621 4622 4623
  { "delayed_queue_size", OPT_DELAYED_QUEUE_SIZE,
    "What size queue (in rows) should be allocated for handling INSERT DELAYED. If the queue becomes full, any client that does INSERT DELAYED will wait until there is room in the queue again.",
    (gptr*) &delayed_queue_size, (gptr*) &delayed_queue_size, 0, GET_ULONG,
    REQUIRED_ARG, DELAYED_QUEUE_SIZE, 1, ~0L, 0, 1, 0},
unknown's avatar
unknown committed
4624 4625 4626 4627 4628
  {"expire_logs_days", OPT_EXPIRE_LOGS_DAYS,
   "Binary logs will be rotated after expire-log-days days ",
   (gptr*) &expire_logs_days,
   (gptr*) &expire_logs_days, 0, GET_ULONG,
   REQUIRED_ARG, 0, 0, 99, 0, 1, 0},
4629 4630 4631 4632
  { "flush_time", OPT_FLUSH_TIME,
    "A dedicated thread is created to flush all tables at the given interval.",
    (gptr*) &flush_time, (gptr*) &flush_time, 0, GET_ULONG, REQUIRED_ARG,
    FLUSH_TIME, 0, LONG_TIMEOUT, 0, 1, 0},
unknown's avatar
unknown committed
4633 4634 4635 4636
  { "ft_boolean_syntax", OPT_FT_BOOLEAN_SYNTAX,
    "List of operators for MATCH ... AGAINST ( ... IN BOOLEAN MODE)",
    0, 0, 0, GET_STR,
    REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
4637 4638 4639
  { "ft_max_word_len", OPT_FT_MAX_WORD_LEN,
    "The maximum length of the word to be included in a FULLTEXT index. Note: FULLTEXT indexes must be rebuilt after changing this variable.",
    (gptr*) &ft_max_word_len, (gptr*) &ft_max_word_len, 0, GET_ULONG,
4640
    REQUIRED_ARG, HA_FT_MAXCHARLEN, 10, HA_FT_MAXCHARLEN, 0, 1, 0},
unknown's avatar
unknown committed
4641 4642 4643 4644
  { "ft_min_word_len", OPT_FT_MIN_WORD_LEN,
    "The minimum length of the word to be included in a FULLTEXT index. Note: FULLTEXT indexes must be rebuilt after changing this variable.",
    (gptr*) &ft_min_word_len, (gptr*) &ft_min_word_len, 0, GET_ULONG,
    REQUIRED_ARG, 4, 1, HA_FT_MAXCHARLEN, 0, 1, 0},
unknown's avatar
unknown committed
4645 4646 4647 4648
  { "ft_query_expansion_limit", OPT_FT_QUERY_EXPANSION_LIMIT,
    "Number of best matches to use for query expansion",
    (gptr*) &ft_query_expansion_limit, (gptr*) &ft_query_expansion_limit, 0, GET_ULONG,
    REQUIRED_ARG, 20, 0, 1000, 0, 1, 0},
4649 4650 4651 4652
  { "ft_stopword_file", OPT_FT_STOPWORD_FILE,
    "Use stopwords from this file instead of built-in list.",
    (gptr*) &ft_stopword_file, (gptr*) &ft_stopword_file, 0, GET_STR,
    REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
unknown's avatar
unknown committed
4653 4654 4655 4656 4657
  { "group_concat_max_len", OPT_GROUP_CONCAT_MAX_LEN,
    "The maximum length of the result of function  group_concat.",
    (gptr*) &global_system_variables.group_concat_max_len,
    (gptr*) &max_system_variables.group_concat_max_len, 0, GET_ULONG,
    REQUIRED_ARG, 1024, 4, (long) ~0, 0, 1, 0},
unknown's avatar
unknown committed
4658
#ifdef HAVE_INNOBASE_DB
4659 4660 4661 4662 4663
  {"innodb_additional_mem_pool_size", OPT_INNODB_ADDITIONAL_MEM_POOL_SIZE,
   "Size of a memory pool InnoDB uses to store data dictionary information and other internal data structures.",
   (gptr*) &innobase_additional_mem_pool_size,
   (gptr*) &innobase_additional_mem_pool_size, 0, GET_LONG, REQUIRED_ARG,
   1*1024*1024L, 512*1024L, ~0L, 0, 1024, 0},
unknown's avatar
unknown committed
4664 4665 4666 4667 4668 4669 4670 4671
  {"innodb_buffer_pool_awe_mem_mb", OPT_INNODB_BUFFER_POOL_AWE_MEM_MB,
   "If Windows AWE is used, the size of InnoDB buffer pool allocated from the AWE memory.",
   (gptr*) &innobase_buffer_pool_awe_mem_mb, (gptr*) &innobase_buffer_pool_awe_mem_mb, 0,
   GET_LONG, REQUIRED_ARG, 0, 0, 63000, 0, 1, 0},
  {"innodb_buffer_pool_size", OPT_INNODB_BUFFER_POOL_SIZE,
   "The size of the memory buffer InnoDB uses to cache data and indexes of its tables.",
   (gptr*) &innobase_buffer_pool_size, (gptr*) &innobase_buffer_pool_size, 0,
   GET_LONG, REQUIRED_ARG, 8*1024*1024L, 1024*1024L, ~0L, 0, 1024*1024L, 0},
4672 4673 4674 4675
  {"innodb_file_io_threads", OPT_INNODB_FILE_IO_THREADS,
   "Number of file I/O threads in InnoDB.", (gptr*) &innobase_file_io_threads,
   (gptr*) &innobase_file_io_threads, 0, GET_LONG, REQUIRED_ARG, 4, 4, 64, 0,
   1, 0},
unknown's avatar
unknown committed
4676 4677 4678 4679
  {"innodb_force_recovery", OPT_INNODB_FORCE_RECOVERY,
   "Helps to save your data in case the disk image of the database becomes corrupt.",
   (gptr*) &innobase_force_recovery, (gptr*) &innobase_force_recovery, 0,
   GET_LONG, REQUIRED_ARG, 0, 0, 6, 0, 1, 0},
4680 4681 4682 4683
  {"innodb_lock_wait_timeout", OPT_INNODB_LOCK_WAIT_TIMEOUT,
   "Timeout in seconds an InnoDB transaction may wait for a lock before being rolled back.",
   (gptr*) &innobase_lock_wait_timeout, (gptr*) &innobase_lock_wait_timeout,
   0, GET_LONG, REQUIRED_ARG, 50, 1, 1024 * 1024 * 1024, 0, 1, 0},
unknown's avatar
unknown committed
4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704
  {"innodb_log_buffer_size", OPT_INNODB_LOG_BUFFER_SIZE,
   "The size of the buffer which InnoDB uses to write log to the log files on disk.",
   (gptr*) &innobase_log_buffer_size, (gptr*) &innobase_log_buffer_size, 0,
   GET_LONG, REQUIRED_ARG, 1024*1024L, 256*1024L, ~0L, 0, 1024, 0},
  {"innodb_log_file_size", OPT_INNODB_LOG_FILE_SIZE,
   "Size of each log file in a log group in megabytes.",
   (gptr*) &innobase_log_file_size, (gptr*) &innobase_log_file_size, 0,
   GET_LONG, REQUIRED_ARG, 5*1024*1024L, 1*1024*1024L, ~0L, 0, 1024*1024L, 0},
  {"innodb_log_files_in_group", OPT_INNODB_LOG_FILES_IN_GROUP,
   "Number of log files in the log group. InnoDB writes to the files in a circular fashion. Value 3 is recommended here.",
   (gptr*) &innobase_log_files_in_group, (gptr*) &innobase_log_files_in_group,
   0, GET_LONG, REQUIRED_ARG, 2, 2, 100, 0, 1, 0},
  {"innodb_mirrored_log_groups", OPT_INNODB_MIRRORED_LOG_GROUPS,
   "Number of identical copies of log groups we keep for the database. Currently this should be set to 1.",
   (gptr*) &innobase_mirrored_log_groups,
   (gptr*) &innobase_mirrored_log_groups, 0, GET_LONG, REQUIRED_ARG, 1, 1, 10,
   0, 1, 0},
  {"innodb_open_files", OPT_INNODB_OPEN_FILES,
   "How many files at the maximum InnoDB keeps open at the same time.",
   (gptr*) &innobase_open_files, (gptr*) &innobase_open_files, 0,
   GET_LONG, REQUIRED_ARG, 300L, 10L, ~0L, 0, 1L, 0},
unknown's avatar
unknown committed
4705
#ifdef HAVE_REPLICATION
4706 4707 4708 4709 4710
  /*
    Disabled for the 4.1.3 release. Disabling just this paragraph of code is
    enough, as then user can't set it to 1 so it will always be ignored in the
    rest of code.
  */
4711
#if MYSQL_VERSION_ID >= 40103
unknown's avatar
unknown committed
4712 4713 4714 4715 4716 4717 4718
  /*
    innodb_safe_binlog is not a variable, just an option. Does not make
    sense to make it a variable, as it is only used at startup (and so the
    value would be lost at next startup, so setting it on the fly would have no
    effect).
  */
  {"innodb_safe_binlog", OPT_INNODB_SAFE_BINLOG,
4719 4720
   "After a crash recovery by InnoDB, truncate the binary log after the last "
   "not-rolled-back statement/transaction.",
unknown's avatar
unknown committed
4721 4722
   (gptr*) &opt_innodb_safe_binlog, (gptr*) &opt_innodb_safe_binlog,
   0, GET_BOOL, NO_ARG, 0, 0, 1, 0, 1, 0},
4723
#endif
unknown's avatar
unknown committed
4724
#endif
4725 4726 4727 4728 4729 4730 4731
  {"innodb_thread_concurrency", OPT_INNODB_THREAD_CONCURRENCY,
   "Helps in performance tuning in heavily concurrent environments.",
   (gptr*) &innobase_thread_concurrency, (gptr*) &innobase_thread_concurrency,
   0, GET_LONG, REQUIRED_ARG, 8, 1, 1000, 0, 1, 0},
#endif /* HAVE_INNOBASE_DB */
  {"interactive_timeout", OPT_INTERACTIVE_TIMEOUT,
   "The number of seconds the server waits for activity on an interactive connection before closing it.",
4732 4733
   (gptr*) &global_system_variables.net_interactive_timeout,
   (gptr*) &max_system_variables.net_interactive_timeout, 0,
4734 4735 4736
   GET_ULONG, REQUIRED_ARG, NET_WAIT_TIMEOUT, 1, LONG_TIMEOUT, 0, 1, 0},
  {"join_buffer_size", OPT_JOIN_BUFF_SIZE,
   "The size of the buffer that is used for full joins.",
4737 4738
   (gptr*) &global_system_variables.join_buff_size,
   (gptr*) &max_system_variables.join_buff_size, 0, GET_ULONG,
4739 4740 4741
   REQUIRED_ARG, 128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, ~0L, MALLOC_OVERHEAD,
   IO_SIZE, 0},
  {"key_buffer_size", OPT_KEY_BUFFER_SIZE,
4742
   "The size of the buffer used for index blocks for MyISAM tables. Increase this to get better index handling (for all reads and multiple writes) to as much as you can afford; 64M on a 256M machine that mainly runs MySQL is quite common.",
unknown's avatar
unknown committed
4743
   (gptr*) &dflt_key_cache_var.param_buff_size,
4744
   (gptr*) 0,
unknown's avatar
unknown committed
4745
   0, (GET_ULL | GET_ASK_ADDR),
4746 4747
   REQUIRED_ARG, KEY_CACHE_SIZE, MALLOC_OVERHEAD, (long) ~0, MALLOC_OVERHEAD,
   IO_SIZE, 0},
unknown's avatar
unknown committed
4748 4749 4750 4751 4752 4753
  {"key_cache_age_threshold", OPT_KEY_CACHE_AGE_THRESHOLD,
   "This characterizes the number of hits a hot block has to be untouched until it is considered aged enough to be downgraded to a warm block. This specifies the percentage ratio of that number of hits to the total number of blocks in key cache",
   (gptr*) &dflt_key_cache_var.param_age_threshold,
   (gptr*) 0,
   0, (GET_ULONG | GET_ASK_ADDR), REQUIRED_ARG, 
   300, 100, ~0L, 0, 100, 0},
unknown's avatar
unknown committed
4754 4755
  {"key_cache_block_size", OPT_KEY_CACHE_BLOCK_SIZE,
   "The default size of key cache blocks",
unknown's avatar
unknown committed
4756
   (gptr*) &dflt_key_cache_var.param_block_size,
4757
   (gptr*) 0,
unknown's avatar
unknown committed
4758
   0, (GET_ULONG | GET_ASK_ADDR), REQUIRED_ARG,
4759
   KEY_CACHE_BLOCK_SIZE , 512, 1024*16, MALLOC_OVERHEAD, 512, 0},
4760 4761
  {"key_cache_division_limit", OPT_KEY_CACHE_DIVISION_LIMIT,
   "The minimum percentage of warm blocks in key cache",
unknown's avatar
unknown committed
4762
   (gptr*) &dflt_key_cache_var.param_division_limit,
4763
   (gptr*) 0,
unknown's avatar
unknown committed
4764
   0, (GET_ULONG | GET_ASK_ADDR) , REQUIRED_ARG, 100,
4765
   1, 100, 0, 1, 0},
4766 4767
  {"long_query_time", OPT_LONG_QUERY_TIME,
   "Log all queries that have taken more than long_query_time seconds to execute to file.",
4768 4769
   (gptr*) &global_system_variables.long_query_time,
   (gptr*) &max_system_variables.long_query_time, 0, GET_ULONG,
4770 4771
   REQUIRED_ARG, 10, 1, LONG_TIMEOUT, 0, 1, 0},
  {"lower_case_table_names", OPT_LOWER_CASE_TABLE_NAMES,
unknown's avatar
unknown committed
4772
   "If set to 1 table names are stored in lowercase on disk and table names will be case-insensitive.  Should be set to 2 if you are using a case insensitive file system",
4773
   (gptr*) &lower_case_table_names,
unknown's avatar
unknown committed
4774
   (gptr*) &lower_case_table_names, 0, GET_UINT, OPT_ARG,
4775 4776 4777 4778 4779
#ifdef FN_NO_CASE_SENCE
    1
#else
    0
#endif
unknown's avatar
unknown committed
4780
   , 0, 2, 0, 1, 0},
4781 4782
  {"max_allowed_packet", OPT_MAX_ALLOWED_PACKET,
   "Max packetlength to send/receive from to server.",
unknown's avatar
unknown committed
4783 4784
   (gptr*) &global_system_variables.max_allowed_packet,
   (gptr*) &max_system_variables.max_allowed_packet, 0, GET_ULONG,
unknown's avatar
unknown committed
4785
   REQUIRED_ARG, 1024*1024L, 1024, 1024L*1024L*1024L, MALLOC_OVERHEAD, 1024, 0},
4786 4787 4788 4789 4790
  {"max_binlog_cache_size", OPT_MAX_BINLOG_CACHE_SIZE,
   "Can be used to restrict the total size used to cache a multi-transaction query.",
   (gptr*) &max_binlog_cache_size, (gptr*) &max_binlog_cache_size, 0,
   GET_ULONG, REQUIRED_ARG, ~0L, IO_SIZE, ~0L, 0, IO_SIZE, 0},
  {"max_binlog_size", OPT_MAX_BINLOG_SIZE,
4791 4792 4793
   "Binary log will be rotated automatically when the size exceeds this \
value. Will also apply to relay logs if max_relay_log_size is 0. \
The minimum value for this variable is 4096.",
4794
   (gptr*) &max_binlog_size, (gptr*) &max_binlog_size, 0, GET_ULONG,
4795
   REQUIRED_ARG, 1024*1024L*1024L, IO_SIZE, 1024*1024L*1024L, 0, IO_SIZE, 0},
4796 4797 4798 4799
  {"max_connect_errors", OPT_MAX_CONNECT_ERRORS,
   "If there is more than this number of interrupted connections from a host this host will be blocked from further connections.",
   (gptr*) &max_connect_errors, (gptr*) &max_connect_errors, 0, GET_ULONG,
    REQUIRED_ARG, MAX_CONNECT_ERRORS, 1, ~0L, 0, 1, 0},
unknown's avatar
unknown committed
4800 4801 4802 4803
  {"max_connections", OPT_MAX_CONNECTIONS,
   "The number of simultaneous clients allowed.", (gptr*) &max_connections,
   (gptr*) &max_connections, 0, GET_ULONG, REQUIRED_ARG, 100, 1, 16384, 0, 1,
   0},
4804
  {"max_delayed_threads", OPT_MAX_DELAYED_THREADS,
4805
   "Don't start more than this number of threads to handle INSERT DELAYED statements. If set to zero, which means INSERT DELAYED is not used.",
4806 4807
   (gptr*) &global_system_variables.max_insert_delayed_threads,
   (gptr*) &max_system_variables.max_insert_delayed_threads,
4808
   0, GET_ULONG, REQUIRED_ARG, 20, 0, 16384, 0, 1, 0},
4809
  {"max_error_count", OPT_MAX_ERROR_COUNT,
4810
   "Max number of errors/warnings to store for a statement.",
4811 4812 4813
   (gptr*) &global_system_variables.max_error_count,
   (gptr*) &max_system_variables.max_error_count,
   0, GET_ULONG, REQUIRED_ARG, DEFAULT_ERROR_COUNT, 1, 65535, 0, 1, 0},
4814 4815
  {"max_heap_table_size", OPT_MAX_HEP_TABLE_SIZE,
   "Don't allow creation of heap tables bigger than this.",
4816 4817
   (gptr*) &global_system_variables.max_heap_table_size,
   (gptr*) &max_system_variables.max_heap_table_size, 0, GET_ULONG,
4818 4819 4820
   REQUIRED_ARG, 16*1024*1024L, 16384, ~0L, MALLOC_OVERHEAD, 1024, 0},
  {"max_join_size", OPT_MAX_JOIN_SIZE,
   "Joins that are probably going to read more than max_join_size records return an error.",
4821
   (gptr*) &global_system_variables.max_join_size,
4822
   (gptr*) &max_system_variables.max_join_size, 0, GET_HA_ROWS, REQUIRED_ARG,
4823
   ~0L, 1, ~0L, 0, 1, 0},
unknown's avatar
unknown committed
4824
   {"max_length_for_sort_data", OPT_MAX_LENGTH_FOR_SORT_DATA,
4825
    "Max number of bytes in sorted records.",
unknown's avatar
unknown committed
4826 4827 4828
    (gptr*) &global_system_variables.max_length_for_sort_data,
    (gptr*) &max_system_variables.max_length_for_sort_data, 0, GET_ULONG,
    REQUIRED_ARG, 1024, 4, 8192*1024L, 0, 1, 0},
4829
  {"max_relay_log_size", OPT_MAX_RELAY_LOG_SIZE,
unknown's avatar
unknown committed
4830
   "If non-zero: relay log will be rotated automatically when the size exceeds this value; if zero (the default): when the size exceeds max_binlog_size. 0 expected, the minimum value for this variable is 4096.",
4831 4832
   (gptr*) &max_relay_log_size, (gptr*) &max_relay_log_size, 0, GET_ULONG,
   REQUIRED_ARG, 0L, 0L, 1024*1024L*1024L, 0, IO_SIZE, 0},
4833 4834 4835 4836 4837
  { "max_seeks_for_key", OPT_MAX_SEEKS_FOR_KEY,
    "Limit assumed max number of seeks when looking up rows based on a key",
    (gptr*) &global_system_variables.max_seeks_for_key,
    (gptr*) &max_system_variables.max_seeks_for_key, 0, GET_ULONG,
    REQUIRED_ARG, ~0L, 1, ~0L, 0, 1, 0 },
4838 4839
  {"max_sort_length", OPT_MAX_SORT_LENGTH,
   "The number of bytes to use when sorting BLOB or TEXT values (only the first max_sort_length bytes of each value are used; the rest are ignored).",
unknown's avatar
unknown committed
4840 4841
   (gptr*) &global_system_variables.max_sort_length,
   (gptr*) &max_system_variables.max_sort_length, 0, GET_ULONG,
4842 4843 4844
   REQUIRED_ARG, 1024, 4, 8192*1024L, 0, 1, 0},
  {"max_tmp_tables", OPT_MAX_TMP_TABLES,
   "Maximum number of temporary tables a client can keep open at a time.",
4845 4846
   (gptr*) &global_system_variables.max_tmp_tables,
   (gptr*) &max_system_variables.max_tmp_tables, 0, GET_ULONG,
4847 4848 4849 4850 4851 4852 4853 4854 4855 4856
   REQUIRED_ARG, 32, 1, ~0L, 0, 1, 0},
  {"max_user_connections", OPT_MAX_USER_CONNECTIONS,
   "The maximum number of active connections for a single user (0 = no limit).",
   (gptr*) &max_user_connections, (gptr*) &max_user_connections, 0, GET_ULONG,
   REQUIRED_ARG, 0, 1, ~0L, 0, 1, 0},
  {"max_write_lock_count", OPT_MAX_WRITE_LOCK_COUNT,
   "After this many write locks, allow some read locks to run in between.",
   (gptr*) &max_write_lock_count, (gptr*) &max_write_lock_count, 0, GET_ULONG,
   REQUIRED_ARG, ~0L, 1, ~0L, 0, 1, 0},
  {"myisam_block_size", OPT_MYISAM_BLOCK_SIZE,
4857
   "Block size to be used for MyISAM index pages.",
unknown's avatar
unknown committed
4858
   (gptr*) &opt_myisam_block_size,
4859 4860 4861
   (gptr*) &opt_myisam_block_size, 0, GET_ULONG, REQUIRED_ARG,
   MI_KEY_BLOCK_LENGTH, MI_MIN_KEY_BLOCK_LENGTH, MI_MAX_KEY_BLOCK_LENGTH,
   0, MI_MIN_KEY_BLOCK_LENGTH, 0},
unknown's avatar
unknown committed
4862 4863 4864 4865 4866
  {"myisam_data_pointer_size", OPT_MYISAM_DATA_POINTER_SIZE,
   "Default pointer size to be used for MyISAM tables.",
   (gptr*) &myisam_data_pointer_size,
   (gptr*) &myisam_data_pointer_size, 0, GET_ULONG, REQUIRED_ARG,
   4, 2, 7, 0, 1, 0},
4867
  {"myisam_max_extra_sort_file_size", OPT_MYISAM_MAX_EXTRA_SORT_FILE_SIZE,
4868
   "Used to help MySQL to decide when to use the slow but safe key cache index create method.",
4869 4870
   (gptr*) &global_system_variables.myisam_max_extra_sort_file_size,
   (gptr*) &max_system_variables.myisam_max_extra_sort_file_size,
unknown's avatar
unknown committed
4871
   0, GET_ULL, REQUIRED_ARG, (ulonglong) MI_MAX_TEMP_LENGTH,
4872
   0, (ulonglong) MAX_FILE_SIZE, 0, 1, 0},
4873
  {"myisam_max_sort_file_size", OPT_MYISAM_MAX_SORT_FILE_SIZE,
4874
   "Don't use the fast sort index method to created index if the temporary file would get bigger than this.",
4875 4876
   (gptr*) &global_system_variables.myisam_max_sort_file_size,
   (gptr*) &max_system_variables.myisam_max_sort_file_size, 0,
4877 4878
   GET_ULL, REQUIRED_ARG, (longlong) LONG_MAX, 0, (ulonglong) MAX_FILE_SIZE,
   0, 1024*1024, 0},
unknown's avatar
unknown committed
4879 4880 4881 4882 4883
  {"myisam_repair_threads", OPT_MYISAM_REPAIR_THREADS,
   "Number of threads to use when repairing MyISAM tables. The value of 1 disables parallel repair.",
   (gptr*) &global_system_variables.myisam_repair_threads,
   (gptr*) &max_system_variables.myisam_repair_threads, 0,
   GET_ULONG, REQUIRED_ARG, 1, 1, ~0L, 0, 1, 0},
4884 4885
  {"myisam_sort_buffer_size", OPT_MYISAM_SORT_BUFFER_SIZE,
   "The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE.",
unknown's avatar
unknown committed
4886 4887
   (gptr*) &global_system_variables.myisam_sort_buff_size,
   (gptr*) &max_system_variables.myisam_sort_buff_size, 0,
4888 4889
   GET_ULONG, REQUIRED_ARG, 8192*1024, 4, ~0L, 0, 1, 0},
  {"net_buffer_length", OPT_NET_BUFFER_LENGTH,
4890
   "Buffer length for TCP/IP and socket communication.",
unknown's avatar
unknown committed
4891 4892 4893
   (gptr*) &global_system_variables.net_buffer_length,
   (gptr*) &max_system_variables.net_buffer_length, 0, GET_ULONG,
   REQUIRED_ARG, 16384, 1024, 1024*1024L, 0, 1024, 0},
4894 4895
  {"net_read_timeout", OPT_NET_READ_TIMEOUT,
   "Number of seconds to wait for more data from a connection before aborting the read.",
unknown's avatar
unknown committed
4896 4897
   (gptr*) &global_system_variables.net_read_timeout,
   (gptr*) &max_system_variables.net_read_timeout, 0, GET_ULONG,
4898
   REQUIRED_ARG, NET_READ_TIMEOUT, 1, LONG_TIMEOUT, 0, 1, 0},
unknown's avatar
unknown committed
4899 4900 4901 4902 4903
  {"net_retry_count", OPT_NET_RETRY_COUNT,
   "If a read on a communication port is interrupted, retry this many times before giving up.",
   (gptr*) &global_system_variables.net_retry_count,
   (gptr*) &max_system_variables.net_retry_count,0,
   GET_ULONG, REQUIRED_ARG, MYSQLD_NET_RETRY_COUNT, 1, ~0L, 0, 1, 0},
4904 4905
  {"net_write_timeout", OPT_NET_WRITE_TIMEOUT,
   "Number of seconds to wait for a block to be written to a connection  before aborting the write.",
unknown's avatar
unknown committed
4906 4907
   (gptr*) &global_system_variables.net_write_timeout,
   (gptr*) &max_system_variables.net_write_timeout, 0, GET_ULONG,
4908 4909 4910 4911
   REQUIRED_ARG, NET_WRITE_TIMEOUT, 1, LONG_TIMEOUT, 0, 1, 0},
  {"open_files_limit", OPT_OPEN_FILES_LIMIT,
   "If this is not 0, then mysqld will use this value to reserve file descriptors to use with setrlimit(). If this value is 0 then mysqld will reserve max_connections*5 or max_connections + table_cache*2 (whichever is larger) number of files.",
   (gptr*) &open_files_limit, (gptr*) &open_files_limit, 0, GET_ULONG,
4912
   REQUIRED_ARG, 0, 0, OS_FILE_LIMIT, 0, 1, 0},
unknown's avatar
unknown committed
4913 4914 4915 4916 4917
   {"preload_buffer_size", OPT_PRELOAD_BUFFER_SIZE,
    "The size of the buffer that is allocated when preloading indexes",
    (gptr*) &global_system_variables.preload_buff_size,
    (gptr*) &max_system_variables.preload_buff_size, 0, GET_ULONG,
    REQUIRED_ARG, 32*1024L, 1024, 1024*1024*1024L, 0, 1, 0},
4918 4919 4920 4921 4922
  {"query_alloc_block_size", OPT_QUERY_ALLOC_BLOCK_SIZE,
   "Allocation block size for query parsing and execution",
   (gptr*) &global_system_variables.query_alloc_block_size,
   (gptr*) &max_system_variables.query_alloc_block_size, 0, GET_ULONG,
   REQUIRED_ARG, QUERY_ALLOC_BLOCK_SIZE, 1024, ~0L, 0, 1024, 0},
unknown's avatar
unknown committed
4923
#ifdef HAVE_QUERY_CACHE
4924 4925 4926
  {"query_cache_limit", OPT_QUERY_CACHE_LIMIT,
   "Don't cache results that are bigger than this.",
   (gptr*) &query_cache_limit, (gptr*) &query_cache_limit, 0, GET_ULONG,
4927
   REQUIRED_ARG, 1024*1024L, 0, (longlong) ULONG_MAX, 0, 1, 0},
4928 4929 4930 4931 4932
  {"query_cache_min_res_unit", OPT_QUERY_CACHE_MIN_RES_UNIT,
   "minimal size of unit in wich space for results is allocated (last unit will be trimed after writing all result data.",
   (gptr*) &query_cache_min_res_unit, (gptr*) &query_cache_min_res_unit,
   0, GET_ULONG, REQUIRED_ARG, QUERY_CACHE_MIN_RESULT_DATA_SIZE,
   0, (longlong) ULONG_MAX, 0, 1, 0},
4933
#endif /*HAVE_QUERY_CACHE*/
4934 4935 4936
  {"query_cache_size", OPT_QUERY_CACHE_SIZE,
   "The memory allocated to store results from old queries.",
   (gptr*) &query_cache_size, (gptr*) &query_cache_size, 0, GET_ULONG,
unknown's avatar
unknown committed
4937
   REQUIRED_ARG, 0, 0, (longlong) ULONG_MAX, 0, 1024, 0},
4938
#ifdef HAVE_QUERY_CACHE
unknown's avatar
unknown committed
4939
  {"query_cache_type", OPT_QUERY_CACHE_TYPE,
4940
   "0 = OFF = Don't cache or retrieve results. 1 = ON = Cache all results except SELECT SQL_NO_CACHE ... queries. 2 = DEMAND = Cache only SELECT SQL_CACHE ... queries.",
unknown's avatar
unknown committed
4941 4942 4943
   (gptr*) &global_system_variables.query_cache_type,
   (gptr*) &max_system_variables.query_cache_type,
   0, GET_ULONG, REQUIRED_ARG, 1, 0, 2, 0, 1, 0},
4944 4945 4946 4947 4948 4949
  {"query_cache_wlock_invalidate", OPT_QUERY_CACHE_WLOCK_INVALIDATE,
   "Invalidate queries in query cache on LOCK for write",
   (gptr*) &global_system_variables.query_cache_wlock_invalidate,
   (gptr*) &max_system_variables.query_cache_wlock_invalidate,
   0, GET_BOOL, NO_ARG, 0, 0, 1, 0, 1, 0},
#endif /*HAVE_QUERY_CACHE*/
4950 4951 4952 4953 4954
  {"query_prealloc_size", OPT_QUERY_PREALLOC_SIZE,
   "Persistent buffer for query parsing and execution",
   (gptr*) &global_system_variables.query_prealloc_size,
   (gptr*) &max_system_variables.query_prealloc_size, 0, GET_ULONG,
   REQUIRED_ARG, QUERY_ALLOC_PREALLOC_SIZE, 1024, ~0L, 0, 1024, 0},
unknown's avatar
unknown committed
4955 4956 4957 4958 4959
  {"range_alloc_block_size", OPT_RANGE_ALLOC_BLOCK_SIZE,
   "Allocation block size for storing ranges during optimization",
   (gptr*) &global_system_variables.range_alloc_block_size,
   (gptr*) &max_system_variables.range_alloc_block_size, 0, GET_ULONG,
   REQUIRED_ARG, RANGE_ALLOC_BLOCK_SIZE, 1024, ~0L, 0, 1024, 0},
unknown's avatar
unknown committed
4960
  {"read_buffer_size", OPT_RECORD_BUFFER,
4961
   "Each thread that does a sequential scan allocates a buffer of this size for each table it scans. If you do many sequential scans, you may want to increase this value.",
unknown's avatar
unknown committed
4962 4963
   (gptr*) &global_system_variables.read_buff_size,
   (gptr*) &max_system_variables.read_buff_size,0, GET_ULONG, REQUIRED_ARG,
4964
   128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, ~0L, MALLOC_OVERHEAD, IO_SIZE, 0},
unknown's avatar
unknown committed
4965 4966 4967 4968 4969
  {"read_only", OPT_READONLY,
   "Make all tables readonly, with the exception for replication (slave) threads and users with the SUPER privilege",
   (gptr*) &opt_readonly,
   (gptr*) &opt_readonly,
   0, GET_BOOL, NO_ARG, 0, 0, 1, 0, 1, 0},
unknown's avatar
unknown committed
4970
  {"read_rnd_buffer_size", OPT_RECORD_RND_BUFFER,
4971
   "When reading rows in sorted order after a sort, the rows are read through this buffer to avoid a disk seeks. If not set, then it's set to the value of record_buffer.",
unknown's avatar
unknown committed
4972 4973 4974
   (gptr*) &global_system_variables.read_rnd_buff_size,
   (gptr*) &max_system_variables.read_rnd_buff_size, 0,
   GET_ULONG, REQUIRED_ARG, 256*1024L, IO_SIZE*2+MALLOC_OVERHEAD,
4975
   ~0L, MALLOC_OVERHEAD, IO_SIZE, 0},
unknown's avatar
unknown committed
4976 4977 4978 4979 4980
  {"record_buffer", OPT_RECORD_BUFFER,
   "Alias for read_buffer_size",
   (gptr*) &global_system_variables.read_buff_size,
   (gptr*) &max_system_variables.read_buff_size,0, GET_ULONG, REQUIRED_ARG,
   128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, ~0L, MALLOC_OVERHEAD, IO_SIZE, 0},
unknown's avatar
SCRUM  
unknown committed
4981
#ifdef HAVE_REPLICATION
4982 4983 4984 4985 4986
  {"relay_log_purge", OPT_RELAY_LOG_PURGE,
   "0 = do not purge relay logs. 1 = purge them as soon as they are no more needed.",
   (gptr*) &relay_log_purge,
   (gptr*) &relay_log_purge, 0, GET_BOOL, NO_ARG,
   1, 0, 1, 0, 1, 0},
4987
  {"relay_log_space_limit", OPT_RELAY_LOG_SPACE_LIMIT,
4988
   "Maximum space to use for all relay logs.",
unknown's avatar
unknown committed
4989 4990
   (gptr*) &relay_log_space_limit,
   (gptr*) &relay_log_space_limit, 0, GET_ULL, REQUIRED_ARG, 0L, 0L,
4991
   (longlong) ULONG_MAX, 0, 1, 0},
4992
  {"slave_compressed_protocol", OPT_SLAVE_COMPRESSED_PROTOCOL,
4993
   "Use compression on master/slave protocol.",
4994 4995
   (gptr*) &opt_slave_compressed_protocol,
   (gptr*) &opt_slave_compressed_protocol,
4996
   0, GET_BOOL, NO_ARG, 0, 0, 1, 0, 1, 0},
4997
  {"slave_net_timeout", OPT_SLAVE_NET_TIMEOUT,
unknown's avatar
unknown committed
4998 4999
   "Number of seconds to wait for more data from a master/slave connection before aborting the read.",
   (gptr*) &slave_net_timeout, (gptr*) &slave_net_timeout, 0,
5000
   GET_ULONG, REQUIRED_ARG, SLAVE_NET_TIMEOUT, 1, LONG_TIMEOUT, 0, 1, 0},
5001
#endif /* HAVE_REPLICATION */
5002 5003 5004 5005
  {"slow_launch_time", OPT_SLOW_LAUNCH_TIME,
   "If creating the thread takes longer than this value (in seconds), the Slow_launch_threads counter will be incremented.",
   (gptr*) &slow_launch_time, (gptr*) &slow_launch_time, 0, GET_ULONG,
   REQUIRED_ARG, 2L, 0L, LONG_TIMEOUT, 0, 1, 0},
unknown's avatar
unknown committed
5006
  {"sort_buffer_size", OPT_SORT_BUFFER,
5007
   "Each thread that needs to do a sort allocates a buffer of this size.",
5008 5009
   (gptr*) &global_system_variables.sortbuff_size,
   (gptr*) &max_system_variables.sortbuff_size, 0, GET_ULONG, REQUIRED_ARG,
5010 5011
   MAX_SORT_MEMORY, MIN_SORT_MEMORY+MALLOC_OVERHEAD*2, ~0L, MALLOC_OVERHEAD,
   1, 0},
unknown's avatar
unknown committed
5012 5013 5014 5015 5016 5017
#ifdef HAVE_BERKELEY_DB
  {"sync-bdb-logs", OPT_BDB_SYNC,
   "Synchronously flush logs. Enabled by default",
   (gptr*) &opt_sync_bdb_logs, (gptr*) &opt_sync_bdb_logs, 0, GET_BOOL,
   NO_ARG, 1, 0, 0, 0, 0, 0},
#endif /* HAVE_BERKELEY_DB */
5018 5019 5020 5021 5022 5023
  {"sync-binlog", OPT_SYNC_BINLOG,
   "Sync the binlog to disk after every #th event. \
#=0 (the default) does no sync. Syncing slows MySQL down",
   (gptr*) &sync_binlog_period,
   (gptr*) &sync_binlog_period, 0, GET_ULONG, REQUIRED_ARG, 0, 0, ~0L, 0, 1,
   0},
unknown's avatar
unknown committed
5024 5025 5026
  {"sync-frm", OPT_SYNC_FRM, "Sync .frm to disk on create. Enabled by default",
   (gptr*) &opt_sync_frm, (gptr*) &opt_sync_frm, 0, GET_BOOL, NO_ARG, 1, 0,
   0, 0, 0, 0},
5027 5028
  {"table_cache", OPT_TABLE_CACHE,
   "The number of open tables for all threads.", (gptr*) &table_cache_size,
5029 5030
   (gptr*) &table_cache_size, 0, GET_ULONG, REQUIRED_ARG, 64, 1, 512*1024L,
   0, 1, 0},
5031 5032 5033 5034
  {"thread_cache_size", OPT_THREAD_CACHE_SIZE,
   "How many threads we should keep in a cache for reuse.",
   (gptr*) &thread_cache_size, (gptr*) &thread_cache_size, 0, GET_ULONG,
   REQUIRED_ARG, 0, 0, 16384, 0, 1, 0},
unknown's avatar
unknown committed
5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047
  {"thread_concurrency", OPT_THREAD_CONCURRENCY,
   "Permits the application to give the threads system a hint for the desired number of threads that should be run at the same time.",
   (gptr*) &concurrency, (gptr*) &concurrency, 0, GET_ULONG, REQUIRED_ARG,
   DEFAULT_CONCURRENCY, 1, 512, 0, 1, 0},
  {"thread_stack", OPT_THREAD_STACK,
   "The stack size for each thread.", (gptr*) &thread_stack,
   (gptr*) &thread_stack, 0, GET_ULONG, REQUIRED_ARG,DEFAULT_THREAD_STACK,
   1024L*128L, ~0L, 0, 1024, 0},
  { "time_format", OPT_TIME_FORMAT,
    "The TIME format (for future).",
    (gptr*) &opt_date_time_formats[MYSQL_TIMESTAMP_TIME],
    (gptr*) &opt_date_time_formats[MYSQL_TIMESTAMP_TIME],
    0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
5048 5049
  {"tmp_table_size", OPT_TMP_TABLE_SIZE,
   "If an in-memory temporary table exceeds this size, MySQL will automatically convert it to an on-disk MyISAM table.",
5050 5051
   (gptr*) &global_system_variables.tmp_table_size,
   (gptr*) &max_system_variables.tmp_table_size, 0, GET_ULONG,
5052
   REQUIRED_ARG, 32*1024*1024L, 1024, ~0L, 0, 1, 0},
5053 5054 5055 5056 5057 5058 5059 5060 5061 5062
  {"transaction_alloc_block_size", OPT_TRANS_ALLOC_BLOCK_SIZE,
   "Allocation block size for transactions to be stored in binary log",
   (gptr*) &global_system_variables.trans_alloc_block_size,
   (gptr*) &max_system_variables.trans_alloc_block_size, 0, GET_ULONG,
   REQUIRED_ARG, QUERY_ALLOC_BLOCK_SIZE, 1024, ~0L, 0, 1024, 0},
  {"transaction_prealloc_size", OPT_TRANS_PREALLOC_SIZE,
   "Persistent buffer for transactions to be stored in binary log",
   (gptr*) &global_system_variables.trans_prealloc_size,
   (gptr*) &max_system_variables.trans_prealloc_size, 0, GET_ULONG,
   REQUIRED_ARG, TRANS_ALLOC_PREALLOC_SIZE, 1024, ~0L, 0, 1024, 0},
5063
  {"wait_timeout", OPT_WAIT_TIMEOUT,
5064
   "The number of seconds the server waits for activity on a connection before closing it.",
5065 5066
   (gptr*) &global_system_variables.net_wait_timeout,
   (gptr*) &max_system_variables.net_wait_timeout, 0, GET_ULONG,
5067 5068
   REQUIRED_ARG, NET_WAIT_TIMEOUT, 1, IF_WIN(INT_MAX32/1000, LONG_TIMEOUT),
   0, 1, 0},
5069
  {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
5070
};
unknown's avatar
unknown committed
5071

5072

unknown's avatar
unknown committed
5073
struct show_var_st status_vars[]= {
5074 5075
  {"Aborted_clients",          (char*) &aborted_threads,        SHOW_LONG},
  {"Aborted_connects",         (char*) &aborted_connects,       SHOW_LONG},
5076 5077
  {"Binlog_cache_disk_use",    (char*) &binlog_cache_disk_use,  SHOW_LONG},
  {"Binlog_cache_use",         (char*) &binlog_cache_use,       SHOW_LONG},
5078 5079
  {"Bytes_received",           (char*) &bytes_received,         SHOW_LONG},
  {"Bytes_sent",               (char*) &bytes_sent,             SHOW_LONG},
5080
  {"Com_admin_commands",       (char*) &com_other,		SHOW_LONG},
5081
  {"Com_alter_db",	       (char*) (com_stat+(uint) SQLCOM_ALTER_DB),SHOW_LONG},
5082
  {"Com_alter_table",	       (char*) (com_stat+(uint) SQLCOM_ALTER_TABLE),SHOW_LONG},
5083 5084 5085 5086 5087 5088
  {"Com_analyze",	       (char*) (com_stat+(uint) SQLCOM_ANALYZE),SHOW_LONG},
  {"Com_backup_table",	       (char*) (com_stat+(uint) SQLCOM_BACKUP_TABLE),SHOW_LONG},
  {"Com_begin",		       (char*) (com_stat+(uint) SQLCOM_BEGIN),SHOW_LONG},
  {"Com_change_db",	       (char*) (com_stat+(uint) SQLCOM_CHANGE_DB),SHOW_LONG},
  {"Com_change_master",	       (char*) (com_stat+(uint) SQLCOM_CHANGE_MASTER),SHOW_LONG},
  {"Com_check",		       (char*) (com_stat+(uint) SQLCOM_CHECK),SHOW_LONG},
5089
  {"Com_checksum",	       (char*) (com_stat+(uint) SQLCOM_CHECKSUM),SHOW_LONG},
5090 5091 5092 5093 5094
  {"Com_commit",	       (char*) (com_stat+(uint) SQLCOM_COMMIT),SHOW_LONG},
  {"Com_create_db",	       (char*) (com_stat+(uint) SQLCOM_CREATE_DB),SHOW_LONG},
  {"Com_create_function",      (char*) (com_stat+(uint) SQLCOM_CREATE_FUNCTION),SHOW_LONG},
  {"Com_create_index",	       (char*) (com_stat+(uint) SQLCOM_CREATE_INDEX),SHOW_LONG},
  {"Com_create_table",	       (char*) (com_stat+(uint) SQLCOM_CREATE_TABLE),SHOW_LONG},
unknown's avatar
unknown committed
5095 5096
  {"Com_dealloc_sql",          (char*) (com_stat+(uint) 
                                        SQLCOM_DEALLOCATE_PREPARE), SHOW_LONG},
5097
  {"Com_delete",	       (char*) (com_stat+(uint) SQLCOM_DELETE),SHOW_LONG},
unknown's avatar
unknown committed
5098
  {"Com_delete_multi",	       (char*) (com_stat+(uint) SQLCOM_DELETE_MULTI),SHOW_LONG},
5099
  {"Com_do",                   (char*) (com_stat+(uint) SQLCOM_DO),SHOW_LONG},
5100 5101 5102 5103
  {"Com_drop_db",	       (char*) (com_stat+(uint) SQLCOM_DROP_DB),SHOW_LONG},
  {"Com_drop_function",	       (char*) (com_stat+(uint) SQLCOM_DROP_FUNCTION),SHOW_LONG},
  {"Com_drop_index",	       (char*) (com_stat+(uint) SQLCOM_DROP_INDEX),SHOW_LONG},
  {"Com_drop_table",	       (char*) (com_stat+(uint) SQLCOM_DROP_TABLE),SHOW_LONG},
5104
  {"Com_drop_user",	       (char*) (com_stat+(uint) SQLCOM_DROP_USER),SHOW_LONG},
unknown's avatar
unknown committed
5105 5106
  {"Com_execute_sql",          (char*) (com_stat+(uint) SQLCOM_EXECUTE), 
   SHOW_LONG},
5107 5108
  {"Com_flush",		       (char*) (com_stat+(uint) SQLCOM_FLUSH),SHOW_LONG},
  {"Com_grant",		       (char*) (com_stat+(uint) SQLCOM_GRANT),SHOW_LONG},
unknown's avatar
unknown committed
5109
  {"Com_ha_close",	       (char*) (com_stat+(uint) SQLCOM_HA_CLOSE),SHOW_LONG},
unknown's avatar
unknown committed
5110 5111
  {"Com_ha_open",	       (char*) (com_stat+(uint) SQLCOM_HA_OPEN),SHOW_LONG},
  {"Com_ha_read",	       (char*) (com_stat+(uint) SQLCOM_HA_READ),SHOW_LONG},
5112
  {"Com_help",                 (char*) (com_stat+(uint) SQLCOM_HELP),SHOW_LONG},
5113 5114 5115 5116
  {"Com_insert",	       (char*) (com_stat+(uint) SQLCOM_INSERT),SHOW_LONG},
  {"Com_insert_select",	       (char*) (com_stat+(uint) SQLCOM_INSERT_SELECT),SHOW_LONG},
  {"Com_kill",		       (char*) (com_stat+(uint) SQLCOM_KILL),SHOW_LONG},
  {"Com_load",		       (char*) (com_stat+(uint) SQLCOM_LOAD),SHOW_LONG},
5117
  {"Com_load_master_data",     (char*) (com_stat+(uint) SQLCOM_LOAD_MASTER_DATA),SHOW_LONG},
5118 5119 5120
  {"Com_load_master_table",    (char*) (com_stat+(uint) SQLCOM_LOAD_MASTER_TABLE),SHOW_LONG},
  {"Com_lock_tables",	       (char*) (com_stat+(uint) SQLCOM_LOCK_TABLES),SHOW_LONG},
  {"Com_optimize",	       (char*) (com_stat+(uint) SQLCOM_OPTIMIZE),SHOW_LONG},
5121
  {"Com_preload_keys",	       (char*) (com_stat+(uint) SQLCOM_PRELOAD_KEYS),SHOW_LONG},
unknown's avatar
unknown committed
5122 5123
  {"Com_prepare_sql",          (char*) (com_stat+(uint) SQLCOM_PREPARE),
   SHOW_LONG}, 
5124
  {"Com_purge",		       (char*) (com_stat+(uint) SQLCOM_PURGE),SHOW_LONG},
5125
  {"Com_purge_before_date",    (char*) (com_stat+(uint) SQLCOM_PURGE_BEFORE),SHOW_LONG},
5126 5127 5128 5129 5130 5131 5132
  {"Com_rename_table",	       (char*) (com_stat+(uint) SQLCOM_RENAME_TABLE),SHOW_LONG},
  {"Com_repair",	       (char*) (com_stat+(uint) SQLCOM_REPAIR),SHOW_LONG},
  {"Com_replace",	       (char*) (com_stat+(uint) SQLCOM_REPLACE),SHOW_LONG},
  {"Com_replace_select",       (char*) (com_stat+(uint) SQLCOM_REPLACE_SELECT),SHOW_LONG},
  {"Com_reset",		       (char*) (com_stat+(uint) SQLCOM_RESET),SHOW_LONG},
  {"Com_restore_table",	       (char*) (com_stat+(uint) SQLCOM_RESTORE_TABLE),SHOW_LONG},
  {"Com_revoke",	       (char*) (com_stat+(uint) SQLCOM_REVOKE),SHOW_LONG},
5133
  {"Com_revoke_all",	       (char*) (com_stat+(uint) SQLCOM_REVOKE_ALL),SHOW_LONG},
5134
  {"Com_rollback",	       (char*) (com_stat+(uint) SQLCOM_ROLLBACK),SHOW_LONG},
5135
  {"Com_savepoint",	       (char*) (com_stat+(uint) SQLCOM_SAVEPOINT),SHOW_LONG},
5136 5137
  {"Com_select",	       (char*) (com_stat+(uint) SQLCOM_SELECT),SHOW_LONG},
  {"Com_set_option",	       (char*) (com_stat+(uint) SQLCOM_SET_OPTION),SHOW_LONG},
5138
  {"Com_show_binlog_events",   (char*) (com_stat+(uint) SQLCOM_SHOW_BINLOG_EVENTS),SHOW_LONG},
5139
  {"Com_show_binlogs",	       (char*) (com_stat+(uint) SQLCOM_SHOW_BINLOGS),SHOW_LONG},
5140
  {"Com_show_charsets",	       (char*) (com_stat+(uint) SQLCOM_SHOW_CHARSETS),SHOW_LONG},
5141
  {"Com_show_collations",      (char*) (com_stat+(uint) SQLCOM_SHOW_COLLATIONS),SHOW_LONG},
5142 5143
  {"Com_show_column_types",    (char*) (com_stat+(uint) SQLCOM_SHOW_COLUMN_TYPES),SHOW_LONG},
  {"Com_show_create_db",       (char*) (com_stat+(uint) SQLCOM_SHOW_CREATE_DB),SHOW_LONG},
5144
  {"Com_show_create_table",    (char*) (com_stat+(uint) SQLCOM_SHOW_CREATE),SHOW_LONG},
5145
  {"Com_show_databases",       (char*) (com_stat+(uint) SQLCOM_SHOW_DATABASES),SHOW_LONG},
5146
  {"Com_show_errors",	       (char*) (com_stat+(uint) SQLCOM_SHOW_ERRORS),SHOW_LONG},
5147 5148
  {"Com_show_fields",	       (char*) (com_stat+(uint) SQLCOM_SHOW_FIELDS),SHOW_LONG},
  {"Com_show_grants",	       (char*) (com_stat+(uint) SQLCOM_SHOW_GRANTS),SHOW_LONG},
5149
  {"Com_show_innodb_status",   (char*) (com_stat+(uint) SQLCOM_SHOW_INNODB_STATUS),SHOW_LONG},
5150 5151
  {"Com_show_keys",	       (char*) (com_stat+(uint) SQLCOM_SHOW_KEYS),SHOW_LONG},
  {"Com_show_logs",	       (char*) (com_stat+(uint) SQLCOM_SHOW_LOGS),SHOW_LONG},
5152
  {"Com_show_master_status",   (char*) (com_stat+(uint) SQLCOM_SHOW_MASTER_STAT),SHOW_LONG},
unknown's avatar
unknown committed
5153
  {"Com_show_new_master",      (char*) (com_stat+(uint) SQLCOM_SHOW_NEW_MASTER),SHOW_LONG},
5154
  {"Com_show_open_tables",     (char*) (com_stat+(uint) SQLCOM_SHOW_OPEN_TABLES),SHOW_LONG},
5155
  {"Com_show_privileges",      (char*) (com_stat+(uint) SQLCOM_SHOW_PRIVILEGES),SHOW_LONG},
5156
  {"Com_show_processlist",     (char*) (com_stat+(uint) SQLCOM_SHOW_PROCESSLIST),SHOW_LONG},
unknown's avatar
unknown committed
5157
  {"Com_show_slave_hosts",     (char*) (com_stat+(uint) SQLCOM_SHOW_SLAVE_HOSTS),SHOW_LONG},
5158
  {"Com_show_slave_status",    (char*) (com_stat+(uint) SQLCOM_SHOW_SLAVE_STAT),SHOW_LONG},
5159
  {"Com_show_status",	       (char*) (com_stat+(uint) SQLCOM_SHOW_STATUS),SHOW_LONG},
unknown's avatar
unknown committed
5160
  {"Com_show_storage_engines", (char*) (com_stat+(uint) SQLCOM_SHOW_STORAGE_ENGINES),SHOW_LONG},
5161 5162
  {"Com_show_tables",	       (char*) (com_stat+(uint) SQLCOM_SHOW_TABLES),SHOW_LONG},
  {"Com_show_variables",       (char*) (com_stat+(uint) SQLCOM_SHOW_VARIABLES),SHOW_LONG},
5163
  {"Com_show_warnings",        (char*) (com_stat+(uint) SQLCOM_SHOW_WARNS),SHOW_LONG},
5164 5165 5166 5167 5168
  {"Com_slave_start",	       (char*) (com_stat+(uint) SQLCOM_SLAVE_START),SHOW_LONG},
  {"Com_slave_stop",	       (char*) (com_stat+(uint) SQLCOM_SLAVE_STOP),SHOW_LONG},
  {"Com_truncate",	       (char*) (com_stat+(uint) SQLCOM_TRUNCATE),SHOW_LONG},
  {"Com_unlock_tables",	       (char*) (com_stat+(uint) SQLCOM_UNLOCK_TABLES),SHOW_LONG},
  {"Com_update",	       (char*) (com_stat+(uint) SQLCOM_UPDATE),SHOW_LONG},
5169
  {"Com_update_multi",	       (char*) (com_stat+(uint) SQLCOM_UPDATE_MULTI),SHOW_LONG},
5170
  {"Connections",              (char*) &thread_id,              SHOW_LONG_CONST},
5171
  {"Created_tmp_disk_tables",  (char*) &created_tmp_disk_tables,SHOW_LONG},
5172
  {"Created_tmp_files",	       (char*) &my_tmp_file_created,	SHOW_LONG},
5173 5174
  {"Created_tmp_tables",       (char*) &created_tmp_tables,     SHOW_LONG},
  {"Delayed_errors",           (char*) &delayed_insert_errors,  SHOW_LONG},
5175
  {"Delayed_insert_threads",   (char*) &delayed_insert_threads, SHOW_LONG_CONST},
5176 5177
  {"Delayed_writes",           (char*) &delayed_insert_writes,  SHOW_LONG},
  {"Flush_commands",           (char*) &refresh_version,        SHOW_LONG_CONST},
5178
  {"Handler_commit",           (char*) &ha_commit_count,        SHOW_LONG},
5179
  {"Handler_delete",           (char*) &ha_delete_count,        SHOW_LONG},
unknown's avatar
unknown committed
5180
  {"Handler_discover",         (char*) &ha_discover_count,      SHOW_LONG},
5181 5182 5183 5184 5185 5186
  {"Handler_read_first",       (char*) &ha_read_first_count,    SHOW_LONG},
  {"Handler_read_key",         (char*) &ha_read_key_count,      SHOW_LONG},
  {"Handler_read_next",        (char*) &ha_read_next_count,     SHOW_LONG},
  {"Handler_read_prev",        (char*) &ha_read_prev_count,     SHOW_LONG},
  {"Handler_read_rnd",         (char*) &ha_read_rnd_count,      SHOW_LONG},
  {"Handler_read_rnd_next",    (char*) &ha_read_rnd_next_count, SHOW_LONG},
5187
  {"Handler_rollback",         (char*) &ha_rollback_count,      SHOW_LONG},
5188 5189
  {"Handler_update",           (char*) &ha_update_count,        SHOW_LONG},
  {"Handler_write",            (char*) &ha_write_count,         SHOW_LONG},
unknown's avatar
unknown committed
5190
  {"Key_blocks_not_flushed",   (char*) &dflt_key_cache_var.global_blocks_changed,
5191
   SHOW_KEY_CACHE_LONG},
5192 5193
  {"Key_blocks_unused",        (char*) &dflt_key_cache_var.blocks_unused,
   SHOW_KEY_CACHE_CONST_LONG},
unknown's avatar
unknown committed
5194 5195
  {"Key_blocks_used",          (char*) &dflt_key_cache_var.blocks_used,
   SHOW_KEY_CACHE_CONST_LONG},
unknown's avatar
unknown committed
5196
  {"Key_read_requests",        (char*) &dflt_key_cache_var.global_cache_r_requests,
5197
   SHOW_KEY_CACHE_LONG},
unknown's avatar
unknown committed
5198
  {"Key_reads",                (char*) &dflt_key_cache_var.global_cache_read,
5199
   SHOW_KEY_CACHE_LONG},
unknown's avatar
unknown committed
5200
  {"Key_write_requests",       (char*) &dflt_key_cache_var.global_cache_w_requests,
5201
   SHOW_KEY_CACHE_LONG},
unknown's avatar
unknown committed
5202
  {"Key_writes",               (char*) &dflt_key_cache_var.global_cache_write,
5203
   SHOW_KEY_CACHE_LONG},
5204
  {"Max_used_connections",     (char*) &max_used_connections,  SHOW_LONG},
5205
  {"Not_flushed_delayed_rows", (char*) &delayed_rows_in_use,    SHOW_LONG_CONST},
unknown's avatar
unknown committed
5206 5207
  {"Open_files",               (char*) &my_file_opened,         SHOW_LONG_CONST},
  {"Open_streams",             (char*) &my_stream_opened,       SHOW_LONG_CONST},
5208
  {"Open_tables",              (char*) 0,                       SHOW_OPENTABLES},
5209
  {"Opened_tables",            (char*) &opened_tables,          SHOW_LONG},
unknown's avatar
unknown committed
5210
#ifdef HAVE_QUERY_CACHE
5211 5212 5213 5214
  {"Qcache_free_blocks",       (char*) &query_cache.free_memory_blocks,
   SHOW_LONG_CONST},
  {"Qcache_free_memory",       (char*) &query_cache.free_memory,
   SHOW_LONG_CONST},
unknown's avatar
unknown committed
5215
  {"Qcache_hits",              (char*) &query_cache.hits,       SHOW_LONG},
5216
  {"Qcache_inserts",           (char*) &query_cache.inserts,    SHOW_LONG},
5217
  {"Qcache_lowmem_prunes",     (char*) &query_cache.lowmem_prunes, SHOW_LONG},
unknown's avatar
unknown committed
5218
  {"Qcache_not_cached",        (char*) &query_cache.refused,    SHOW_LONG},
5219
  {"Qcache_queries_in_cache",  (char*) &query_cache.queries_in_cache, SHOW_LONG_CONST},
unknown's avatar
unknown committed
5220 5221
  {"Qcache_total_blocks",      (char*) &query_cache.total_blocks,
   SHOW_LONG_CONST},
unknown's avatar
unknown committed
5222
#endif /*HAVE_QUERY_CACHE*/
5223
  {"Questions",                (char*) 0,                       SHOW_QUESTION},
unknown's avatar
unknown committed
5224
  {"Rpl_status",               (char*) 0,                 SHOW_RPL_STATUS},
5225 5226 5227 5228 5229
  {"Select_full_join",         (char*) &select_full_join_count, SHOW_LONG},
  {"Select_full_range_join",   (char*) &select_full_range_join_count, SHOW_LONG},
  {"Select_range",             (char*) &select_range_count, 	SHOW_LONG},
  {"Select_range_check",       (char*) &select_range_check_count, SHOW_LONG},
  {"Select_scan",	       (char*) &select_scan_count,	SHOW_LONG},
5230
  {"Slave_open_temp_tables",   (char*) &slave_open_temp_tables, SHOW_LONG},
5231
  {"Slave_running",            (char*) 0, SHOW_SLAVE_RUNNING},
5232 5233
  {"Slow_launch_threads",      (char*) &slow_launch_threads,    SHOW_LONG},
  {"Slow_queries",             (char*) &long_query_count,       SHOW_LONG},
5234
  {"Sort_merge_passes",	       (char*) &filesort_merge_passes,  SHOW_LONG},
5235 5236 5237
  {"Sort_range",	       (char*) &filesort_range_count,   SHOW_LONG},
  {"Sort_rows",		       (char*) &filesort_rows,	        SHOW_LONG},
  {"Sort_scan",		       (char*) &filesort_scan_count,    SHOW_LONG},
unknown's avatar
unknown committed
5238
#ifdef HAVE_OPENSSL
5239
  {"Ssl_accept_renegotiates",  (char*) 0, 	SHOW_SSL_CTX_SESS_ACCEPT_RENEGOTIATE},
5240
  {"Ssl_accepts",              (char*) 0,  	SHOW_SSL_CTX_SESS_ACCEPT},
5241 5242 5243 5244 5245 5246 5247 5248
  {"Ssl_callback_cache_hits",  (char*) 0,	SHOW_SSL_CTX_SESS_CB_HITS},
  {"Ssl_cipher",               (char*) 0,  	SHOW_SSL_GET_CIPHER},
  {"Ssl_cipher_list",          (char*) 0,  	SHOW_SSL_GET_CIPHER_LIST},
  {"Ssl_client_connects",      (char*) 0,	SHOW_SSL_CTX_SESS_CONNECT},
  {"Ssl_connect_renegotiates", (char*) 0, 	SHOW_SSL_CTX_SESS_CONNECT_RENEGOTIATE},
  {"Ssl_ctx_verify_depth",     (char*) 0,	SHOW_SSL_CTX_GET_VERIFY_DEPTH},
  {"Ssl_ctx_verify_mode",      (char*) 0,	SHOW_SSL_CTX_GET_VERIFY_MODE},
  {"Ssl_default_timeout",      (char*) 0,  	SHOW_SSL_GET_DEFAULT_TIMEOUT},
5249 5250 5251 5252
  {"Ssl_finished_accepts",     (char*) 0,  	SHOW_SSL_CTX_SESS_ACCEPT_GOOD},
  {"Ssl_finished_connects",    (char*) 0,  	SHOW_SSL_CTX_SESS_CONNECT_GOOD},
  {"Ssl_session_cache_hits",   (char*) 0,	SHOW_SSL_CTX_SESS_HITS},
  {"Ssl_session_cache_misses", (char*) 0,	SHOW_SSL_CTX_SESS_MISSES},
5253
  {"Ssl_session_cache_mode",   (char*) 0,	SHOW_SSL_CTX_GET_SESSION_CACHE_MODE},
5254 5255
  {"Ssl_session_cache_overflows", (char*) 0,	SHOW_SSL_CTX_SESS_CACHE_FULL},
  {"Ssl_session_cache_size",   (char*) 0,	SHOW_SSL_CTX_SESS_GET_CACHE_SIZE},
5256
  {"Ssl_session_cache_timeouts", (char*) 0,	SHOW_SSL_CTX_SESS_TIMEOUTS},
5257
  {"Ssl_sessions_reused",      (char*) 0,	SHOW_SSL_SESSION_REUSED},
5258
  {"Ssl_used_session_cache_entries",(char*) 0,	SHOW_SSL_CTX_SESS_NUMBER},
5259
  {"Ssl_verify_depth",         (char*) 0,	SHOW_SSL_GET_VERIFY_DEPTH},
5260
  {"Ssl_verify_mode",          (char*) 0,	SHOW_SSL_GET_VERIFY_MODE},
5261
  {"Ssl_version",   	       (char*) 0,  	SHOW_SSL_GET_VERSION},
unknown's avatar
unknown committed
5262
#endif /* HAVE_OPENSSL */
unknown's avatar
unknown committed
5263 5264
  {"Table_locks_immediate",    (char*) &locks_immediate,        SHOW_LONG},
  {"Table_locks_waited",       (char*) &locks_waited,           SHOW_LONG},
5265 5266
  {"Threads_cached",           (char*) &cached_thread_count,    SHOW_LONG_CONST},
  {"Threads_connected",        (char*) &thread_count,           SHOW_INT_CONST},
5267
  {"Threads_created",	       (char*) &thread_created,		SHOW_LONG_CONST},
5268 5269 5270
  {"Threads_running",          (char*) &thread_running,         SHOW_INT_CONST},
  {"Uptime",                   (char*) 0,                       SHOW_STARTTIME},
  {NullS, NullS, SHOW_LONG}
unknown's avatar
unknown committed
5271 5272 5273 5274
};

static void print_version(void)
{
5275
  set_server_version();
5276 5277
  printf("%s  Ver %s for %s on %s (%s)\n",my_progname,
	 server_version,SYSTEM_TYPE,MACHINE_TYPE, MYSQL_COMPILATION_COMMENT);
unknown's avatar
unknown committed
5278 5279
}

unknown's avatar
unknown committed
5280 5281 5282
static void use_help(void)
{
  print_version();
5283
  printf("Use '--help' or '--no-defaults --help' for a list of available options\n");
unknown's avatar
unknown committed
5284
}
unknown's avatar
unknown committed
5285

unknown's avatar
unknown committed
5286 5287
static void usage(void)
{
5288
  if (!(default_charset_info= get_charset_by_csname(default_character_set_name,
unknown's avatar
unknown committed
5289 5290 5291 5292 5293
					           MY_CS_PRIMARY,
						   MYF(MY_WME))))
    exit(1);
  if (!default_collation_name)
    default_collation_name= (char*) default_charset_info->name;
unknown's avatar
unknown committed
5294
  print_version();
unknown's avatar
unknown committed
5295 5296 5297
  puts("\
Copyright (C) 2000 MySQL AB, by Monty and others\n\
This software comes with ABSOLUTELY NO WARRANTY. This is free software,\n\
5298 5299
and you are welcome to modify and redistribute it under the GPL license\n\n\
Starts the MySQL database server\n");
unknown's avatar
unknown committed
5300 5301

  printf("Usage: %s [OPTIONS]\n", my_progname);
5302 5303 5304 5305
  if (!opt_verbose)
    puts("\nFor more help options (several pages), use mysqld --verbose --help\n");
  else
  {
unknown's avatar
unknown committed
5306 5307
#ifdef __WIN__
  puts("NT and Win32 specific options:\n\
5308 5309
  --install                     Install the default service (NT)\n\
  --install-manual              Install the default service started manually (NT)\n\
unknown's avatar
unknown committed
5310 5311
  --install service_name        Install an optional service (NT)\n\
  --install-manual service_name Install an optional service started manually (NT)\n\
5312
  --remove                      Remove the default service from the service list (NT)\n\
unknown's avatar
unknown committed
5313 5314 5315
  --remove service_name         Remove the service_name from the service list (NT)\n\
  --enable-named-pipe           Only to be used for the	default server (NT)\n\
  --standalone                  Dummy option to start as a standalone server (NT)\
unknown's avatar
unknown committed
5316
");
5317
  puts("");
unknown's avatar
unknown committed
5318
#endif
5319
  print_defaults(MYSQL_CONFIG_NAME,load_default_groups);
unknown's avatar
unknown committed
5320 5321 5322
  puts("");
  fix_paths();
  set_ports();
5323 5324 5325 5326

  my_print_help(my_long_options);
  my_print_variables(my_long_options);

unknown's avatar
unknown committed
5327
  puts("\n\
unknown's avatar
unknown committed
5328
To see what values a running MySQL server is using, type\n\
5329 5330
'mysqladmin variables' instead of 'mysqld --verbose --help'.\n");
  }
unknown's avatar
unknown committed
5331 5332 5333
}


unknown's avatar
unknown committed
5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344
/*
  Initialize all MySQL global variables to default values

  SYNOPSIS
    mysql_init_variables()

  NOTES
    The reason to set a lot of global variables to zero is to allow one to
    restart the embedded server with a clean environment
    It's also needed on some exotic platforms where global variables are
    not set to 0 when a program starts.
unknown's avatar
unknown committed
5345

unknown's avatar
unknown committed
5346 5347 5348
    We don't need to set numeric variables refered to in my_long_options
    as these are initialized by my_getopt.
*/
unknown's avatar
unknown committed
5349

unknown's avatar
unknown committed
5350 5351 5352 5353 5354 5355 5356 5357
static void mysql_init_variables(void)
{
  /* Things reset to zero */
  opt_skip_slave_start= opt_reckless_slave = 0;
  mysql_home[0]= pidfile_name[0]= log_error_file[0]= 0;
  opt_log= opt_update_log= opt_bin_log= opt_slow_log= 0;
  opt_disable_networking= opt_skip_show_db=0;
  opt_logname= opt_update_logname= opt_binlog_index_name= opt_slow_logname=0;
5358 5359
  opt_secure_auth= 0;
  opt_bootstrap= opt_myisam_log= 0;
unknown's avatar
unknown committed
5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381
  mqh_used= 0;
  segfaulted= kill_in_progress= 0;
  cleanup_done= 0;
  defaults_argv= 0;
  server_id_supplied= 0;
  test_flags= select_errors= dropping_tables= ha_open_options=0;
  thread_count= thread_running= kill_cached_threads= wake_thread=0;
  slave_open_temp_tables= 0;
  com_other= 0;
  cached_thread_count= 0;
  bytes_sent= bytes_received= 0;
  opt_endinfo= using_udf_functions= 0;
  opt_using_transactions= using_update_log= 0;
  abort_loop= select_thread_in_use= signal_thread_in_use= 0;
  ready_to_exit= shutdown_in_progress= grant_option= 0;
  long_query_count= aborted_threads= aborted_connects= 0;
  delayed_insert_threads= delayed_insert_writes= delayed_rows_in_use= 0;
  delayed_insert_errors= thread_created= 0;
  filesort_rows= filesort_range_count= filesort_scan_count= 0;
  filesort_merge_passes= select_range_check_count= select_range_count= 0;
  select_scan_count= select_full_range_join_count= select_full_join_count= 0;
  specialflag= opened_tables= created_tmp_tables= created_tmp_disk_tables= 0;
5382
  binlog_cache_use=  binlog_cache_disk_use= 0;
unknown's avatar
unknown committed
5383 5384 5385
  max_used_connections= slow_launch_threads = 0;
  mysqld_user= mysqld_chroot= opt_init_file= opt_bin_logname = 0;
  errmesg= 0;
5386
  mysqld_unix_port= opt_mysql_tmpdir= my_bind_addr_str= NullS;
unknown's avatar
unknown committed
5387 5388 5389
  bzero((gptr) &mysql_tmpdir_list, sizeof(mysql_tmpdir_list));
  bzero((gptr) &com_stat, sizeof(com_stat));

5390 5391 5392 5393 5394 5395
  /* Character sets */
  system_charset_info= &my_charset_utf8_general_ci;
  files_charset_info= &my_charset_utf8_general_ci;
  national_charset_info= &my_charset_utf8_general_ci;
  table_alias_charset= &my_charset_bin;

5396 5397
  opt_date_time_formats[0]= opt_date_time_formats[1]= opt_date_time_formats[2]= 0;

unknown's avatar
unknown committed
5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411
  /* Things with default values that are not zero */
  delay_key_write_options= (uint) DELAY_KEY_WRITE_ON;
  opt_specialflag= SPECIAL_ENGLISH;
  unix_sock= ip_sock= INVALID_SOCKET;
  mysql_home_ptr= mysql_home;
  pidfile_name_ptr= pidfile_name;
  log_error_file_ptr= log_error_file;
  language_ptr= language;
  mysql_data_home= mysql_real_data_home;
  thd_startup_options= (OPTION_UPDATE_LOG | OPTION_AUTO_IS_NULL |
			OPTION_BIN_LOG | OPTION_QUOTE_SHOW_CREATE);
  protocol_version= PROTOCOL_VERSION;
  what_to_log= ~ (1L << (uint) COM_TIME);
  refresh_version= flush_version= 1L;	/* Increments on each reload */
unknown's avatar
unknown committed
5412
  query_id= thread_id= 1L;
unknown's avatar
unknown committed
5413 5414 5415 5416 5417
  strmov(server_version, MYSQL_SERVER_VERSION);
  myisam_recover_options_str= sql_mode_str= "OFF";
  my_bind_addr = htonl(INADDR_ANY);
  threads.empty();
  thread_cache.empty();
5418
  key_caches.empty();
5419 5420 5421
  multi_keycache_init();
  if (!(sql_key_cache= get_or_create_key_cache(default_key_cache_base.str,
					       default_key_cache_base.length)))
5422
    exit(1);
unknown's avatar
unknown committed
5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441

  /* Initialize structures that is used when processing options */
  replicate_rewrite_db.empty();
  replicate_do_db.empty();
  replicate_ignore_db.empty();
  binlog_do_db.empty();
  binlog_ignore_db.empty();

  /* Set directory paths */
  strmake(language, LANGUAGE, sizeof(language)-1);
  strmake(mysql_real_data_home, get_relative_path(DATADIR),
	  sizeof(mysql_real_data_home)-1);
  mysql_data_home_buff[0]=FN_CURLIB;	// all paths are relative from here
  mysql_data_home_buff[1]=0;

  /* Replication parameters */
  master_user= (char*) "test";
  master_password= master_host= 0;
  master_info_file= (char*) "master.info",
unknown's avatar
unknown committed
5442 5443 5444
    relay_log_info_file= (char*) "relay-log.info";
  master_ssl_key= master_ssl_cert= master_ssl_ca= 
    master_ssl_capath= master_ssl_cipher= 0;
unknown's avatar
unknown committed
5445 5446 5447 5448 5449
  report_user= report_password = report_host= 0;	/* TO BE DELETED */
  opt_relay_logname= opt_relaylog_index_name= 0;

  /* Variables in libraries */
  charsets_dir= 0;
5450 5451
  default_character_set_name= (char*) MYSQL_DEFAULT_CHARSET_NAME;
  default_collation_name= (char*) MYSQL_DEFAULT_COLLATION_NAME;
5452
  sys_charset_system.value= (char*) system_charset_info->csname;
unknown's avatar
unknown committed
5453

5454

unknown's avatar
unknown committed
5455
  /* Set default values for some option variables */
unknown's avatar
unknown committed
5456 5457
  global_system_variables.table_type=   DB_TYPE_MYISAM;
  global_system_variables.tx_isolation= ISO_REPEATABLE_READ;
5458
  global_system_variables.select_limit= (ulonglong) HA_POS_ERROR;
unknown's avatar
unknown committed
5459
  max_system_variables.select_limit=    (ulonglong) HA_POS_ERROR;
5460
  global_system_variables.max_join_size= (ulonglong) HA_POS_ERROR;
unknown's avatar
unknown committed
5461
  max_system_variables.max_join_size=   (ulonglong) HA_POS_ERROR;
5462
  global_system_variables.old_passwords= 0;
unknown's avatar
unknown committed
5463

unknown's avatar
unknown committed
5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484
  /* Variables that depends on compile options */
#ifndef DBUG_OFF
  default_dbug_option=IF_WIN("d:t:i:O,\\mysqld.trace",
			     "d:t:i:o,/tmp/mysqld.trace");
#endif
  opt_error_log= IF_WIN(1,0);
#ifdef HAVE_BERKELEY_DB
  have_berkeley_db= SHOW_OPTION_YES;
#else
  have_berkeley_db= SHOW_OPTION_NO;
#endif
#ifdef HAVE_INNOBASE_DB
  have_innodb=SHOW_OPTION_YES;
#else
  have_innodb=SHOW_OPTION_NO;
#endif
#ifdef HAVE_ISAM
  have_isam=SHOW_OPTION_YES;
#else
  have_isam=SHOW_OPTION_NO;
#endif
5485 5486 5487 5488 5489
#ifdef HAVE_EXAMPLE_DB
  have_example_db= SHOW_OPTION_YES;
#else
  have_example_db= SHOW_OPTION_NO;
#endif
5490 5491 5492 5493 5494
#ifdef HAVE_ARCHIVE_DB
  have_archive_db= SHOW_OPTION_YES;
#else
  have_archive_db= SHOW_OPTION_NO;
#endif
5495 5496 5497 5498 5499
#ifdef HAVE_CSV_DB
  have_csv_db= SHOW_OPTION_YES;
#else
  have_csv_db= SHOW_OPTION_NO;
#endif
unknown's avatar
unknown committed
5500
#ifdef HAVE_NDBCLUSTER_DB
unknown's avatar
unknown committed
5501
  have_ndbcluster=SHOW_OPTION_DISABLED;
unknown's avatar
unknown committed
5502 5503 5504
#else
  have_ndbcluster=SHOW_OPTION_NO;
#endif
unknown's avatar
unknown committed
5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524
#ifdef USE_RAID
  have_raid=SHOW_OPTION_YES;
#else
  have_raid=SHOW_OPTION_NO;
#endif
#ifdef HAVE_OPENSSL
  have_openssl=SHOW_OPTION_YES;
#else
  have_openssl=SHOW_OPTION_NO;
#endif
#ifdef HAVE_BROKEN_REALPATH
  have_symlink=SHOW_OPTION_NO;
#else
  have_symlink=SHOW_OPTION_YES;
#endif
#ifdef HAVE_QUERY_CACHE
  have_query_cache=SHOW_OPTION_YES;
#else
  have_query_cache=SHOW_OPTION_NO;
#endif
5525 5526 5527 5528 5529 5530 5531 5532 5533 5534
#ifdef HAVE_SPATIAL
  have_geometry=SHOW_OPTION_YES;
#else
  have_geometry=SHOW_OPTION_NO;
#endif
#ifdef HAVE_RTREE_KEYS
  have_rtree_keys=SHOW_OPTION_YES;
#else
  have_rtree_keys=SHOW_OPTION_NO;
#endif
unknown's avatar
unknown committed
5535 5536 5537 5538 5539 5540
#ifdef HAVE_CRYPT
  have_crypt=SHOW_OPTION_YES;
#else
  have_crypt=SHOW_OPTION_NO;
#endif
#ifdef HAVE_COMPRESS
5541
  have_compress= SHOW_OPTION_YES;
unknown's avatar
unknown committed
5542
#else
5543
  have_compress= SHOW_OPTION_NO;
unknown's avatar
unknown committed
5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558
#endif
#ifdef HAVE_LIBWRAP
  libwrapName= NullS;
#endif
#ifdef HAVE_OPENSSL
  des_key_file = 0;
  ssl_acceptor_fd= 0;
#endif
#ifdef HAVE_SMEM
  shared_memory_base_name= default_shared_memory_base_name;
#endif
#if !defined(my_pthread_setprio) && !defined(HAVE_PTHREAD_SETSCHEDPARAM)
  opt_specialflag |= SPECIAL_NO_PRIOR;
#endif

unknown's avatar
unknown committed
5559 5560
#if defined(__WIN__) || defined(__NETWARE__)
  /* Allow Win32 and NetWare users to move MySQL anywhere */
unknown's avatar
unknown committed
5561 5562 5563 5564 5565 5566 5567 5568
  {
    char prg_dev[LIBLEN];
    my_path(prg_dev,my_progname,"mysql/bin");
    strcat(prg_dev,"/../");			// Remove 'bin' to get base dir
    cleanup_dirname(mysql_home,prg_dev);
  }
#else
  const char *tmpenv;
unknown's avatar
unknown committed
5569
  if (!(tmpenv = getenv("MY_BASEDIR_VERSION")))
unknown's avatar
unknown committed
5570
    tmpenv = DEFAULT_MYSQL_HOME;
unknown's avatar
unknown committed
5571
  (void) strmake(mysql_home, tmpenv, sizeof(mysql_home)-1);
unknown's avatar
unknown committed
5572 5573 5574 5575
#endif
}


5576
extern "C" my_bool
5577 5578
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
	       char *argument)
unknown's avatar
unknown committed
5579
{
5580 5581
  switch(optid) {
  case '#':
unknown's avatar
unknown committed
5582
#ifndef DBUG_OFF
5583 5584 5585 5586 5587
    DBUG_PUSH(argument ? argument : default_dbug_option);
#endif
    opt_endinfo=1;				/* unireg: memory allocation */
    break;
  case 'a':
5588
    global_system_variables.sql_mode= fix_sql_mode(MODE_ANSI);
unknown's avatar
unknown committed
5589
    global_system_variables.tx_isolation= ISO_SERIALIZABLE;
5590 5591 5592 5593
    break;
  case 'b':
    strmake(mysql_home,argument,sizeof(mysql_home)-1);
    break;
5594
  case 'C':
unknown's avatar
unknown committed
5595
    default_collation_name= 0;
5596
    break;
5597 5598 5599 5600 5601
  case 'l':
    opt_log=1;
    break;
  case 'h':
    strmake(mysql_real_data_home,argument, sizeof(mysql_real_data_home)-1);
unknown's avatar
unknown committed
5602 5603
    /* Correct pointer set by my_getopt (for embedded library) */
    mysql_data_home= mysql_real_data_home;
5604
    break;
5605
  case 'u':
5606
    if (!mysqld_user || !strcmp(mysqld_user, argument))
unknown's avatar
unknown committed
5607
      mysqld_user= argument;
5608
    else
unknown's avatar
unknown committed
5609
      fprintf(stderr, "Warning: Ignoring user change to '%s' because the user was set to '%s' earlier on the command line\n", argument, mysqld_user);
5610
    break;
5611 5612 5613
  case 'L':
    strmake(language, argument, sizeof(language)-1);
    break;
unknown's avatar
SCRUM  
unknown committed
5614
#ifdef HAVE_REPLICATION
5615 5616 5617
  case OPT_SLAVE_SKIP_ERRORS:
    init_slave_skip_errors(argument);
    break;
5618
#endif
5619
  case OPT_SAFEMALLOC_MEM_LIMIT:
5620
#if !defined(DBUG_OFF) && defined(SAFEMALLOC)
5621
    sf_malloc_mem_limit = atoi(argument);
5622
#endif
5623
    break;
5624 5625 5626
#ifdef EMBEDDED_LIBRARY
  case OPT_MAX_ALLOWED_PACKET:
    max_allowed_packet= atoi(argument);
5627
    global_system_variables.max_allowed_packet= max_allowed_packet;
5628 5629 5630
    break;
  case OPT_NET_BUFFER_LENGTH:
    net_buffer_length=  atoi(argument);
5631
    global_system_variables.net_buffer_length= net_buffer_length;
5632 5633
    break;
#endif
5634
#include <sslopt-case.h>
5635 5636 5637
  case 'V':
    print_version();
    exit(0);
5638 5639 5640 5641 5642 5643 5644 5645
  case 'W':
    if (!argument)
      global_system_variables.log_warnings++;
    else if (argument == disabled_my_option)
      global_system_variables.log_warnings= 0L;
    else
      global_system_variables.log_warnings= atoi(argument);
    break;
5646 5647
  case 'T':
    test_flags= argument ? (uint) atoi(argument) : 0;
5648
    test_flags&= ~TEST_NO_THREADS;
5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662
    opt_endinfo=1;
    break;
  case (int) OPT_BIG_TABLES:
    thd_startup_options|=OPTION_BIG_TABLES;
    break;
  case (int) OPT_ISAM_LOG:
    opt_myisam_log=1;
    break;
  case (int) OPT_UPDATE_LOG:
    opt_update_log=1;
    break;
  case (int) OPT_BIN_LOG:
    opt_bin_log=1;
    break;
5663 5664 5665
  case (int) OPT_ERROR_LOG_FILE:
    opt_error_log= 1;
    break;
unknown's avatar
SCRUM  
unknown committed
5666
#ifdef HAVE_REPLICATION
5667
  case (int) OPT_INIT_RPL_ROLE:
5668 5669 5670
  {
    int role;
    if ((role=find_type(argument, &rpl_role_typelib, 2)) <= 0)
5671
    {
5672 5673
      fprintf(stderr, "Unknown replication role: %s\n", argument);
      exit(1);
5674
    }
5675 5676 5677
    rpl_status = (role == 1) ?  RPL_AUTH_MASTER : RPL_IDLE_SLAVE;
    break;
  }
5678
  case (int)OPT_REPLICATE_IGNORE_DB:
5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692
  {
    i_string *db = new i_string(argument);
    replicate_ignore_db.push_back(db);
    break;
  }
  case (int)OPT_REPLICATE_DO_DB:
  {
    i_string *db = new i_string(argument);
    replicate_do_db.push_back(db);
    break;
  }
  case (int)OPT_REPLICATE_REWRITE_DB:
  {
    char* key = argument,*p, *val;
5693

5694
    if (!(p= strstr(argument, "->")))
5695
    {
5696 5697 5698
      fprintf(stderr,
	      "Bad syntax in replicate-rewrite-db - missing '->'!\n");
      exit(1);
5699
    }
5700
    val= p--;
unknown's avatar
unknown committed
5701
    while (my_isspace(mysqld_charset, *p) && p > argument)
5702 5703
      *p-- = 0;
    if (p == argument)
5704
    {
5705 5706 5707
      fprintf(stderr,
	      "Bad syntax in replicate-rewrite-db - empty FROM db!\n");
      exit(1);
5708
    }
5709 5710
    *val= 0;
    val+= 2;
unknown's avatar
unknown committed
5711
    while (*val && my_isspace(mysqld_charset, *val))
5712 5713
      *val++;
    if (!*val)
5714
    {
5715 5716 5717
      fprintf(stderr,
	      "Bad syntax in replicate-rewrite-db - empty TO db!\n");
      exit(1);
5718 5719
    }

5720 5721 5722 5723 5724
    i_string_pair *db_pair = new i_string_pair(key, val);
    replicate_rewrite_db.push_back(db_pair);
    break;
  }

5725
  case (int)OPT_BINLOG_IGNORE_DB:
5726 5727 5728 5729 5730
  {
    i_string *db = new i_string(argument);
    binlog_ignore_db.push_back(db);
    break;
  }
5731
  case (int)OPT_BINLOG_DO_DB:
5732 5733 5734 5735 5736
  {
    i_string *db = new i_string(argument);
    binlog_do_db.push_back(db);
    break;
  }
5737
  case (int)OPT_REPLICATE_DO_TABLE:
5738 5739 5740 5741
  {
    if (!do_table_inited)
      init_table_rule_hash(&replicate_do_table, &do_table_inited);
    if (add_table_rule(&replicate_do_table, argument))
5742
    {
5743 5744
      fprintf(stderr, "Could not add do table rule '%s'!\n", argument);
      exit(1);
5745
    }
5746 5747 5748
    table_rules_on = 1;
    break;
  }
5749
  case (int)OPT_REPLICATE_WILD_DO_TABLE:
5750 5751 5752 5753 5754
  {
    if (!wild_do_table_inited)
      init_table_rule_array(&replicate_wild_do_table,
			    &wild_do_table_inited);
    if (add_wild_table_rule(&replicate_wild_do_table, argument))
5755
    {
5756 5757
      fprintf(stderr, "Could not add do table rule '%s'!\n", argument);
      exit(1);
5758
    }
5759 5760 5761
    table_rules_on = 1;
    break;
  }
5762
  case (int)OPT_REPLICATE_WILD_IGNORE_TABLE:
5763 5764 5765 5766 5767
  {
    if (!wild_ignore_table_inited)
      init_table_rule_array(&replicate_wild_ignore_table,
			    &wild_ignore_table_inited);
    if (add_wild_table_rule(&replicate_wild_ignore_table, argument))
5768
    {
5769 5770
      fprintf(stderr, "Could not add ignore table rule '%s'!\n", argument);
      exit(1);
5771
    }
5772 5773 5774
    table_rules_on = 1;
    break;
  }
5775
  case (int)OPT_REPLICATE_IGNORE_TABLE:
5776 5777 5778 5779
  {
    if (!ignore_table_inited)
      init_table_rule_hash(&replicate_ignore_table, &ignore_table_inited);
    if (add_table_rule(&replicate_ignore_table, argument))
5780
    {
5781 5782
      fprintf(stderr, "Could not add ignore table rule '%s'!\n", argument);
      exit(1);
5783
    }
5784 5785 5786
    table_rules_on = 1;
    break;
  }
unknown's avatar
SCRUM  
unknown committed
5787
#endif /* HAVE_REPLICATION */
5788 5789 5790
  case (int) OPT_SLOW_QUERY_LOG:
    opt_slow_log=1;
    break;
5791 5792
  case (int) OPT_SKIP_NEW:
    opt_specialflag|= SPECIAL_NO_NEW_FUNC;
5793
    delay_key_write_options= (uint) DELAY_KEY_WRITE_NONE;
5794 5795 5796
    myisam_concurrent_insert=0;
    myisam_recover_options= HA_RECOVER_NONE;
    my_use_symdir=0;
5797
    ha_open_options&= ~(HA_OPEN_ABORT_IF_CRASHED | HA_OPEN_DELAY_KEY_WRITE);
unknown's avatar
unknown committed
5798
#ifdef HAVE_QUERY_CACHE
5799 5800 5801 5802 5803
    query_cache_size=0;
#endif
    break;
  case (int) OPT_SAFE:
    opt_specialflag|= SPECIAL_SAFE_MODE;
5804
    delay_key_write_options= (uint) DELAY_KEY_WRITE_NONE;
5805 5806
    myisam_recover_options= HA_RECOVER_DEFAULT;
    ha_open_options&= ~(HA_OPEN_DELAY_KEY_WRITE);
5807 5808 5809 5810 5811
    break;
  case (int) OPT_SKIP_PRIOR:
    opt_specialflag|= SPECIAL_NO_PRIOR;
    break;
  case (int) OPT_SKIP_LOCK:
5812
    opt_external_locking=0;
5813 5814 5815 5816 5817 5818 5819 5820
    break;
  case (int) OPT_SKIP_HOST_CACHE:
    opt_specialflag|= SPECIAL_NO_HOST_CACHE;
    break;
  case (int) OPT_SKIP_RESOLVE:
    opt_specialflag|=SPECIAL_NO_RESOLVE;
    break;
  case (int) OPT_SKIP_NETWORKING:
unknown's avatar
unknown committed
5821 5822 5823
#if defined(__NETWARE__)
    sql_perror("Can't start server: skip-networking option is currently not supported on NetWare");
    exit(1);
5824
#endif
5825
    opt_disable_networking=1;
5826
    mysqld_port=0;
5827 5828 5829 5830 5831
    break;
  case (int) OPT_SKIP_SHOW_DB:
    opt_skip_show_db=1;
    opt_specialflag|=SPECIAL_SKIP_SHOW_DB;
    break;
5832
#ifdef ONE_THREAD
5833 5834
  case (int) OPT_ONE_THREAD:
    test_flags |= TEST_NO_THREADS;
5835
#endif
5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846
    break;
  case (int) OPT_WANT_CORE:
    test_flags |= TEST_CORE_ON_SIGNAL;
    break;
  case (int) OPT_SKIP_STACK_TRACE:
    test_flags|=TEST_NO_STACKTRACE;
    break;
  case (int) OPT_SKIP_SYMLINKS:
    my_use_symdir=0;
    break;
  case (int) OPT_BIND_ADDRESS:
unknown's avatar
unknown committed
5847
    if ((my_bind_addr= (ulong) inet_addr(argument)) == INADDR_NONE)
5848 5849
    {
      struct hostent *ent;
unknown's avatar
unknown committed
5850
      if (argument[0])
5851
	ent=gethostbyname(argument);
unknown's avatar
unknown committed
5852 5853
      else
      {
5854 5855
	char myhostname[255];
	if (gethostname(myhostname,sizeof(myhostname)) < 0)
unknown's avatar
unknown committed
5856
	{
5857
	  sql_perror("Can't start server: cannot get my own hostname!");
unknown's avatar
unknown committed
5858 5859
	  exit(1);
	}
5860
	ent=gethostbyname(myhostname);
unknown's avatar
unknown committed
5861
      }
5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872
      if (!ent)
      {
	sql_perror("Can't start server: cannot resolve hostname!");
	exit(1);
      }
      my_bind_addr = (ulong) ((in_addr*)ent->h_addr_list[0])->s_addr;
    }
    break;
  case (int) OPT_PID_FILE:
    strmake(pidfile_name, argument, sizeof(pidfile_name)-1);
    break;
unknown's avatar
unknown committed
5873
#ifdef __WIN__
5874 5875
  case (int) OPT_STANDALONE:		/* Dummy option for NT */
    break;
unknown's avatar
unknown committed
5876
#endif
5877 5878 5879 5880
  case OPT_CONSOLE:
    if (opt_console)
      opt_error_log= 0;			// Force logs to stdout
    break;
5881
  case (int) OPT_FLUSH:
5882
#ifdef HAVE_ISAM
5883 5884 5885 5886 5887 5888 5889
    nisam_flush=1;
#endif
    myisam_flush=1;
    flush_time=0;			// No auto flush
    break;
  case OPT_LOW_PRIORITY_UPDATES:
    thr_upgraded_concurrent_insert_lock= TL_WRITE_LOW_PRIORITY;
unknown's avatar
unknown committed
5890
    global_system_variables.low_priority_updates=1;
5891 5892 5893 5894
    break;
  case OPT_BOOTSTRAP:
    opt_noacl=opt_bootstrap=1;
    break;
unknown's avatar
unknown committed
5895
  case OPT_STORAGE_ENGINE:
5896
  {
unknown's avatar
unknown committed
5897 5898
    if ((enum db_type)((global_system_variables.table_type=
	  ha_resolve_by_name(argument, strlen(argument)))) == DB_TYPE_UNKNOWN)
unknown's avatar
unknown committed
5899
    {
5900 5901
      fprintf(stderr,"Unknown table type: %s\n",argument);
      exit(1);
unknown's avatar
unknown committed
5902
    }
5903 5904
    break;
  }
5905 5906 5907
  case OPT_SERVER_ID:
    server_id_supplied = 1;
    break;
5908 5909 5910 5911
  case OPT_DELAY_KEY_WRITE_ALL:
    if (argument != disabled_my_option)
      argument= (char*) "ALL";
    /* Fall through */
5912
  case OPT_DELAY_KEY_WRITE:
5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926
    if (argument == disabled_my_option)
      delay_key_write_options= (uint) DELAY_KEY_WRITE_NONE;
    else if (! argument)
      delay_key_write_options= (uint) DELAY_KEY_WRITE_ON;
    else
    {
      int type;
      if ((type=find_type(argument, &delay_key_write_typelib, 2)) <= 0)
      {
	fprintf(stderr,"Unknown delay_key_write type: %s\n",argument);
	exit(1);
      }
      delay_key_write_options= (uint) type-1;
    }
5927 5928 5929 5930 5931 5932
    break;
  case OPT_CHARSETS_DIR:
    strmake(mysql_charsets_dir, argument, sizeof(mysql_charsets_dir)-1);
    charsets_dir = mysql_charsets_dir;
    break;
  case OPT_TX_ISOLATION:
5933 5934 5935
  {
    int type;
    if ((type=find_type(argument, &tx_isolation_typelib, 2)) <= 0)
unknown's avatar
unknown committed
5936
    {
5937 5938
      fprintf(stderr,"Unknown transaction isolation type: %s\n",argument);
      exit(1);
unknown's avatar
unknown committed
5939
    }
unknown's avatar
unknown committed
5940
    global_system_variables.tx_isolation= (type-1);
5941 5942
    break;
  }
unknown's avatar
unknown committed
5943
#ifdef HAVE_BERKELEY_DB
5944
  case OPT_BDB_NOSYNC:
5945 5946 5947 5948 5949 5950 5951 5952
    /* Deprecated option */
    opt_sync_bdb_logs= 0;
    /* Fall through */
  case OPT_BDB_SYNC:
    if (!opt_sync_bdb_logs)
      berkeley_env_flags|= DB_TXN_NOSYNC;
    else
      berkeley_env_flags&= ~DB_TXN_NOSYNC;
5953 5954 5955 5956 5957
    break;
  case OPT_BDB_NO_RECOVER:
    berkeley_init_flags&= ~(DB_RECOVER);
    break;
  case OPT_BDB_LOCK:
5958 5959 5960 5961 5962
  {
    int type;
    if ((type=find_type(argument, &berkeley_lock_typelib, 2)) > 0)
      berkeley_lock_type=berkeley_lock_types[type-1];
    else
unknown's avatar
unknown committed
5963
    {
5964
      int err;
5965 5966
      char *end;
      uint length= strlen(argument);
unknown's avatar
unknown committed
5967 5968
      long value= my_strntol(&my_charset_latin1, argument, length, 10, &end, &err);
      if (test_if_int(argument,(uint) length, end, &my_charset_latin1))
5969
	berkeley_lock_scan_time= value;
unknown's avatar
unknown committed
5970 5971
      else
      {
5972 5973
	fprintf(stderr,"Unknown lock type: %s\n",argument);
	exit(1);
unknown's avatar
unknown committed
5974 5975
      }
    }
5976 5977
    break;
  }
5978 5979
  case OPT_BDB_SHARED:
    berkeley_init_flags&= ~(DB_PRIVATE);
unknown's avatar
unknown committed
5980
    berkeley_shared_data= 1;
5981
    break;
5982
#endif /* HAVE_BERKELEY_DB */
5983
  case OPT_BDB:
5984
#ifdef HAVE_BERKELEY_DB
5985
    if (opt_bdb)
unknown's avatar
unknown committed
5986
      have_berkeley_db= SHOW_OPTION_YES;
5987
    else
unknown's avatar
unknown committed
5988
      have_berkeley_db= SHOW_OPTION_DISABLED;
5989 5990 5991 5992 5993
#endif
    break;
  case OPT_ISAM:
#ifdef HAVE_ISAM
    if (opt_isam)
5994
      have_isam= SHOW_OPTION_YES;
5995
    else
5996
      have_isam= SHOW_OPTION_DISABLED;
unknown's avatar
unknown committed
5997 5998 5999 6000 6001
#endif
    break;
  case OPT_NDBCLUSTER:
#ifdef HAVE_NDBCLUSTER_DB
    if (opt_ndbcluster)
unknown's avatar
unknown committed
6002
      have_ndbcluster= SHOW_OPTION_YES;
unknown's avatar
unknown committed
6003
    else
unknown's avatar
unknown committed
6004
      have_ndbcluster= SHOW_OPTION_DISABLED;
6005 6006
#endif
    break;
6007
  case OPT_INNODB:
6008
#ifdef HAVE_INNOBASE_DB
6009
    if (opt_innodb)
unknown's avatar
unknown committed
6010
      have_innodb= SHOW_OPTION_YES;
6011
    else
unknown's avatar
unknown committed
6012
      have_innodb= SHOW_OPTION_DISABLED;
unknown's avatar
unknown committed
6013
#endif
6014 6015
    break;
  case OPT_INNODB_DATA_FILE_PATH:
unknown's avatar
unknown committed
6016
#ifdef HAVE_INNOBASE_DB
unknown's avatar
unknown committed
6017
    innobase_data_file_path= argument;
6018
#endif
6019
    break;
6020
#ifdef HAVE_INNOBASE_DB
6021 6022 6023 6024 6025 6026
  case OPT_INNODB_LOG_ARCHIVE:
    innobase_log_archive= argument ? test(atoi(argument)) : 1;
    break;
  case OPT_INNODB_FAST_SHUTDOWN:
    innobase_fast_shutdown= argument ? test(atoi(argument)) : 1;
    break;
6027
#endif /* HAVE_INNOBASE_DB */
6028
  case OPT_MYISAM_RECOVER:
6029 6030
  {
    if (!argument || !argument[0])
6031
    {
6032 6033
      myisam_recover_options=    HA_RECOVER_DEFAULT;
      myisam_recover_options_str= myisam_recover_typelib.type_names[0];
6034
    }
6035
    else
6036
    {
6037 6038 6039
      myisam_recover_options_str=argument;
      if ((myisam_recover_options=
	   find_bit_type(argument, &myisam_recover_typelib)) == ~(ulong) 0)
6040
      {
6041
	fprintf(stderr, "Unknown option to myisam-recover: %s\n",argument);
6042 6043 6044
	exit(1);
      }
    }
6045 6046 6047 6048 6049
    ha_open_options|=HA_OPEN_ABORT_IF_CRASHED;
    break;
  }
  case OPT_SQL_MODE:
  {
6050 6051 6052
    sql_mode_str= argument;
    if ((global_system_variables.sql_mode=
         find_bit_type(argument, &sql_mode_typelib)) == ~(ulong) 0)
6053 6054 6055 6056
    {
      fprintf(stderr, "Unknown option to sql-mode: %s\n", argument);
      exit(1);
    }
6057 6058
    global_system_variables.sql_mode= fix_sql_mode(global_system_variables.
						   sql_mode);
unknown's avatar
unknown committed
6059
    break;
6060
  }
unknown's avatar
unknown committed
6061
  case OPT_FT_BOOLEAN_SYNTAX:
6062
    if (ft_boolean_check_syntax_string((byte*) argument))
unknown's avatar
unknown committed
6063 6064 6065 6066
    {
      fprintf(stderr, "Invalid ft-boolean-syntax string: %s\n", argument);
      exit(1);
    }
6067
    strmake(ft_boolean_syntax, argument, sizeof(ft_boolean_syntax)-1);
6068 6069
    break;
  case OPT_SKIP_SAFEMALLOC:
6070
#ifdef SAFEMALLOC
6071
    sf_malloc_quick=1;
6072
#endif
6073
    break;
unknown's avatar
unknown committed
6074 6075
  case OPT_LOWER_CASE_TABLE_NAMES:
    lower_case_table_names= argument ? atoi(argument) : 1;
6076
    lower_case_table_names_used= 1;
unknown's avatar
unknown committed
6077
    break;
unknown's avatar
unknown committed
6078
  }
6079 6080 6081
  return 0;
}

6082 6083

extern "C" gptr *
6084
mysql_getopt_value(const char *keyname, uint key_length,
6085 6086
		   const struct my_option *option)
{
6087 6088
  switch (option->id) {
  case OPT_KEY_BUFFER_SIZE:
unknown's avatar
unknown committed
6089
  case OPT_KEY_CACHE_BLOCK_SIZE:
6090 6091
  case OPT_KEY_CACHE_DIVISION_LIMIT:
  case OPT_KEY_CACHE_AGE_THRESHOLD:
6092
  {
unknown's avatar
unknown committed
6093
    KEY_CACHE *key_cache;
6094 6095
    if (!(key_cache= get_or_create_key_cache(keyname, key_length)))
      exit(1);
6096 6097
    switch (option->id) {
    case OPT_KEY_BUFFER_SIZE:
unknown's avatar
unknown committed
6098
      return (gptr*) &key_cache->param_buff_size;
6099
    case OPT_KEY_CACHE_BLOCK_SIZE:
unknown's avatar
unknown committed
6100
      return (gptr*) &key_cache->param_block_size;
6101
    case OPT_KEY_CACHE_DIVISION_LIMIT:
unknown's avatar
unknown committed
6102
      return (gptr*) &key_cache->param_division_limit;
6103
    case OPT_KEY_CACHE_AGE_THRESHOLD:
unknown's avatar
unknown committed
6104
      return (gptr*) &key_cache->param_age_threshold;
6105
    }
6106 6107
  }
  }
6108
 return option->value;
6109 6110
}

6111

6112 6113 6114 6115
static void get_options(int argc,char **argv)
{
  int ho_error;

6116
  my_getopt_register_get_addr(mysql_getopt_value);
6117
  strmake(def_ft_boolean_syntax, ft_boolean_syntax,
unknown's avatar
unknown committed
6118
	  sizeof(ft_boolean_syntax)-1);
unknown's avatar
unknown committed
6119
  if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)) != 0)
6120
    exit(ho_error);
6121 6122
  if (argc > 0)
  {
6123
    fprintf(stderr, "%s: Too many arguments (first extra is '%s').\nUse --help to get a list of available options\n", my_progname, *argv);
unknown's avatar
unknown committed
6124 6125
    /* FIXME add EXIT_TOO_MANY_ARGUMENTS to "mysys_err.h" and return that code? */
    exit(1);
6126
  }
6127

6128
  if (opt_help)
6129 6130 6131 6132
  {
    usage();
    exit(0);
  }
unknown's avatar
unknown committed
6133
#if defined(HAVE_BROKEN_REALPATH)
6134 6135 6136 6137 6138 6139 6140 6141 6142 6143
  my_use_symdir=0;
  my_disable_symlinks=1;
  have_symlink=SHOW_OPTION_NO;
#else
  if (!my_use_symdir)
  {
    my_disable_symlinks=1;
    have_symlink=SHOW_OPTION_DISABLED;
  }
#endif
6144 6145 6146 6147 6148 6149
  if (opt_debugging)
  {
    /* Allow break with SIGINT, no core or stack trace */
    test_flags|= TEST_SIGINT | TEST_NO_STACKTRACE;
    test_flags&= ~TEST_CORE_ON_SIGNAL;
  }
6150 6151 6152
  /* Set global MyISAM variables from delay_key_write_options */
  fix_delay_key_write((THD*) 0, OPT_GLOBAL);

6153
#ifndef EMBEDDED_LIBRARY
6154 6155
  if (mysqld_chroot)
    set_root(mysqld_chroot);
6156
#endif
unknown's avatar
unknown committed
6157
  fix_paths();
unknown's avatar
unknown committed
6158

unknown's avatar
unknown committed
6159 6160 6161 6162
  /*
    Set some global variables from the global_system_variables
    In most cases the global variables will not be used
  */
6163
  my_disable_locking= myisam_single_user= test(opt_external_locking == 0);
unknown's avatar
unknown committed
6164
  my_default_record_cache_size=global_system_variables.read_buff_size;
6165
  myisam_max_temp_length=
6166
    (my_off_t) global_system_variables.myisam_max_sort_file_size;
6167
  myisam_max_extra_temp_length=
6168
    (my_off_t) global_system_variables.myisam_max_extra_sort_file_size;
unknown's avatar
unknown committed
6169

unknown's avatar
unknown committed
6170
  /* Set global variables based on startup options */
unknown's avatar
unknown committed
6171
  myisam_block_size=(uint) 1 << my_bit_log2(opt_myisam_block_size);
6172 6173 6174
  table_alias_charset= (lower_case_table_names ?
			files_charset_info :
			&my_charset_bin);
unknown's avatar
unknown committed
6175

6176 6177 6178 6179
  if (opt_short_log_format)
    opt_specialflag|= SPECIAL_SHORT_LOG_FORMAT;
  if (opt_log_queries_not_using_indexes)
    opt_specialflag|= SPECIAL_LOG_QUERIES_NOT_USING_INDEXES;
6180

6181
  if (init_global_datetime_format(MYSQL_TIMESTAMP_DATE,
6182
				  &global_system_variables.date_format) ||
6183
      init_global_datetime_format(MYSQL_TIMESTAMP_TIME,
6184
				  &global_system_variables.time_format) ||
6185
      init_global_datetime_format(MYSQL_TIMESTAMP_DATETIME,
6186 6187
				  &global_system_variables.datetime_format))
    exit(1);
unknown's avatar
unknown committed
6188 6189 6190
}


6191 6192 6193 6194 6195 6196 6197 6198 6199 6200
/*
  Create version name for running mysqld version
  We automaticly add suffixes -debug, -embedded and -log to the version
  name to make the version more descriptive.
  (MYSQL_SERVER_SUFFIX is set by the compilation environment)
*/

static void set_server_version(void)
{
  char *end= strxmov(server_version, MYSQL_SERVER_VERSION,
6201
                     MYSQL_SERVER_SUFFIX_STR, NullS);
6202 6203 6204 6205
#ifdef EMBEDDED_LIBRARY
  end= strmov(end, "-embedded");
#endif
#ifndef DBUG_OFF
6206
  if (!strstr(MYSQL_SERVER_SUFFIX_STR, "-debug"))
6207 6208 6209 6210 6211 6212 6213
    end= strmov(end, "-debug");
#endif
  if (opt_log || opt_update_log || opt_slow_log || opt_bin_log)
    strmov(end, "-log");                        // This may slow down system
}


unknown's avatar
unknown committed
6214 6215 6216
static char *get_relative_path(const char *path)
{
  if (test_if_hard_path(path) &&
6217
      is_prefix(path,DEFAULT_MYSQL_HOME) &&
unknown's avatar
unknown committed
6218 6219
      strcmp(DEFAULT_MYSQL_HOME,FN_ROOTDIR))
  {
unknown's avatar
unknown committed
6220
    path+=(uint) strlen(DEFAULT_MYSQL_HOME);
unknown's avatar
unknown committed
6221 6222 6223 6224 6225 6226 6227
    while (*path == FN_LIBCHAR)
      path++;
  }
  return (char*) path;
}


6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249
/*
  Fix filename and replace extension where 'dir' is relative to
  mysql_real_data_home.
  Return 1 if len(path) > FN_REFLEN
*/

bool
fn_format_relative_to_data_home(my_string to, const char *name,
				const char *dir, const char *extension)
{
  char tmp_path[FN_REFLEN];
  if (!test_if_hard_path(dir))
  {
    strxnmov(tmp_path,sizeof(tmp_path)-1, mysql_real_data_home,
	     dir, NullS);
    dir=tmp_path;
  }
  return !fn_format(to, name, dir, extension,
		    MY_REPLACE_EXT | MY_UNPACK_FILENAME | MY_SAFE_PATH);
}


unknown's avatar
unknown committed
6250 6251
static void fix_paths(void)
{
6252
  char buff[FN_REFLEN],*pos;
6253
  convert_dirname(mysql_home,mysql_home,NullS);
6254
  /* Resolve symlinks to allow 'mysql_home' to be a relative symlink */
6255
  my_realpath(mysql_home,mysql_home,MYF(0));
6256 6257 6258 6259 6260 6261 6262
  /* Ensure that mysql_home ends in FN_LIBCHAR */
  pos=strend(mysql_home);
  if (pos[-1] != FN_LIBCHAR)
  {
    pos[0]= FN_LIBCHAR;
    pos[1]= 0;
  }
6263 6264
  convert_dirname(mysql_real_data_home,mysql_real_data_home,NullS);
  convert_dirname(language,language,NullS);
unknown's avatar
unknown committed
6265 6266 6267 6268
  (void) my_load_path(mysql_home,mysql_home,""); // Resolve current dir
  (void) my_load_path(mysql_real_data_home,mysql_real_data_home,mysql_home);
  (void) my_load_path(pidfile_name,pidfile_name,mysql_real_data_home);

unknown's avatar
unknown committed
6269
  char *sharedir=get_relative_path(SHAREDIR);
unknown's avatar
unknown committed
6270
  if (test_if_hard_path(sharedir))
unknown's avatar
unknown committed
6271
    strmake(buff,sharedir,sizeof(buff)-1);		/* purecov: tested */
unknown's avatar
unknown committed
6272
  else
unknown's avatar
unknown committed
6273
    strxnmov(buff,sizeof(buff)-1,mysql_home,sharedir,NullS);
6274
  convert_dirname(buff,buff,NullS);
unknown's avatar
unknown committed
6275 6276 6277 6278 6279
  (void) my_load_path(language,language,buff);

  /* If --character-sets-dir isn't given, use shared library dir */
  if (charsets_dir != mysql_charsets_dir)
  {
unknown's avatar
unknown committed
6280 6281
    strxnmov(mysql_charsets_dir, sizeof(mysql_charsets_dir)-1, buff,
	     CHARSET_DIR, NullS);
unknown's avatar
unknown committed
6282
  }
unknown's avatar
unknown committed
6283 6284
  (void) my_load_path(mysql_charsets_dir, mysql_charsets_dir, buff);
  charsets_dir=mysql_charsets_dir;
unknown's avatar
unknown committed
6285

unknown's avatar
unknown committed
6286
  if (init_tmpdir(&mysql_tmpdir_list, opt_mysql_tmpdir))
unknown's avatar
unknown committed
6287
    exit(1);
unknown's avatar
SCRUM  
unknown committed
6288
#ifdef HAVE_REPLICATION
6289 6290
  if (!slave_load_tmpdir)
  {
unknown's avatar
unknown committed
6291 6292
    if (!(slave_load_tmpdir = (char*) my_strdup(mysql_tmpdir, MYF(MY_FAE))))
      exit(1);
6293
  }
6294
#endif /* HAVE_REPLICATION */
unknown's avatar
unknown committed
6295 6296 6297
}


6298 6299 6300 6301
/*
  Return a bitfield from a string of substrings separated by ','
  returns ~(ulong) 0 on error.
*/
6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315

static ulong find_bit_type(const char *x, TYPELIB *bit_lib)
{
  bool found_end;
  int  found_count;
  const char *end,*i,*j;
  const char **array, *pos;
  ulong found,found_int,bit;
  DBUG_ENTER("find_bit_type");
  DBUG_PRINT("enter",("x: '%s'",x));

  found=0;
  found_end= 0;
  pos=(my_string) x;
6316 6317 6318
  while (*pos == ' ') pos++;
  found_end= *pos == 0;
  while (!found_end)
6319 6320 6321 6322
  {
    if (!*(end=strcend(pos,',')))		/* Let end point at fieldend */
    {
      while (end > pos && end[-1] == ' ')
unknown's avatar
unknown committed
6323
	end--;					/* Skip end-space */
6324 6325 6326 6327 6328 6329 6330 6331
      found_end=1;
    }
    found_int=0; found_count=0;
    for (array=bit_lib->type_names, bit=1 ; (i= *array++) ; bit<<=1)
    {
      j=pos;
      while (j != end)
      {
unknown's avatar
unknown committed
6332 6333
	if (my_toupper(mysqld_charset,*i++) !=
            my_toupper(mysqld_charset,*j++))
6334
	  goto skip;
6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345
      }
      found_int=bit;
      if (! *i)
      {
	found_count=1;
	break;
      }
      else if (j != pos)			// Half field found
      {
	found_count++;				// Could be one of two values
      }
6346
skip: ;
6347 6348 6349 6350 6351
    }
    if (found_count != 1)
      DBUG_RETURN(~(ulong) 0);				// No unique value
    found|=found_int;
    pos=end+1;
6352
  }
6353 6354 6355 6356 6357 6358

  DBUG_PRINT("exit",("bit-field: %ld",(ulong) found));
  DBUG_RETURN(found);
} /* find_bit_type */


6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377
/*
  Check if file system used for databases is case insensitive

  SYNOPSIS
    test_if_case_sensitive()
    dir_name			Directory to test

  RETURN
    -1  Don't know (Test failed)
    0   File system is case sensitive
    1   File system is case insensitive
*/

static int test_if_case_insensitive(const char *dir_name)
{
  int result= 0;
  File file;
  char buff[FN_REFLEN], buff2[FN_REFLEN];
  MY_STAT stat_info;
6378
  DBUG_ENTER("test_if_case_insensitive");
6379 6380 6381 6382 6383 6384 6385 6386 6387

  fn_format(buff, glob_hostname, dir_name, ".lower-test",
	    MY_UNPACK_FILENAME | MY_REPLACE_EXT | MY_REPLACE_DIR);
  fn_format(buff2, glob_hostname, dir_name, ".LOWER-TEST",
	    MY_UNPACK_FILENAME | MY_REPLACE_EXT | MY_REPLACE_DIR);
  (void) my_delete(buff2, MYF(0));
  if ((file= my_create(buff, 0666, O_RDWR, MYF(0))) < 0)
  {
    sql_print_error("Warning: Can't create test file %s", buff);
6388
    DBUG_RETURN(-1);
6389 6390 6391 6392 6393
  }
  my_close(file, MYF(0));
  if (my_stat(buff2, &stat_info, MYF(0)))
    result= 1;					// Can access file
  (void) my_delete(buff, MYF(MY_WME));
6394 6395
  DBUG_PRINT("exit", ("result: %d", result));
  DBUG_RETURN(result);
6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406
}


/* Create file to store pid number */

static void create_pid_file()
{
  File file;
  if ((file = my_create(pidfile_name,0664,
			O_WRONLY | O_TRUNC, MYF(MY_WME))) >= 0)
  {
unknown's avatar
unknown committed
6407
    char buff[21], *end;
6408
    end= int10_to_str((long) getpid(), buff, 10);
unknown's avatar
unknown committed
6409 6410
    *end++= '\n';
    (void) my_write(file, (byte*) buff, (uint) (end-buff),MYF(MY_WME));
6411 6412 6413 6414 6415
    (void) my_close(file, MYF(0));
  }
}


unknown's avatar
unknown committed
6416
/*****************************************************************************
6417
  Instantiate templates
unknown's avatar
unknown committed
6418 6419 6420 6421 6422 6423 6424
*****************************************************************************/

#ifdef __GNUC__
/* Used templates */
template class I_List<THD>;
template class I_List_iterator<THD>;
template class I_List<i_string>;
6425
template class I_List<i_string_pair>;
6426
template class I_List<NAMED_LIST>;
unknown's avatar
unknown committed
6427
FIX_GCC_LINKING_PROBLEM
unknown's avatar
unknown committed
6428
#endif