mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fixes for Netware
Call pthread_mutex_destroy() on not used mutex. Changed comments in .h and .c files from // -> /* */ Added detection of mutex on which one didn't call pthread_mutex_destroy() Fixed bug in create_tmp_field() which causes a memory overrun in queries that uses "ORDER BY constant_expression" Added optimisation for ORDER BY NULL BitKeeper/deleted/.del-ChangeLog~dfc92e15bee6fc75: Delete: sql/ChangeLog BUILD/compile-pentium-valgrind-max: Don't use valgrind with safemalloc as this can hide some bugs Makefile.am: Added platform dirs bdb/os/os_handle.c: Portability fix client/mysql.cc: Fixes for Netware. Fixed duplicate output when using 'tee' Simple optimisations client/mysqldump.c: Portability fix client/mysqltest.c: Portability fix configure.in: Fixes for Netware extra/resolveip.c: Fixes for Netware include/Makefile.am: Fixes for Netware include/config-win.h: Portability fix include/my_global.h: Fixes for Netware include/my_net.h: Fixes for Netware include/my_pthread.h: Fixes for Netware Added detection of mutexes that was not destroyed include/my_sys.h: Fixes for Netware Added 'extern' before external functions include/mysql.h: Fixes for Netware innobase/configure.in: Fixes for Netware innobase/include/os0thread.h: Fixes for Netware innobase/os/os0sync.c: Fixes for Netware innobase/os/os0thread.c: Fixes for Netware innobase/srv/srv0srv.c: Fixes for Netware innobase/srv/srv0start.c: Fixes for Netware innobase/sync/sync0sync.c: Fixes for Netware isam/test3.c: Disable test on Netware libmysql/Makefile.shared: Added my_sleep libmysql/get_password.c: Fixes for Netware libmysql/libmysql.c: Fixes for Netware Made mysql_once_init() global libmysql/manager.c: Fixes for Netware myisam/mi_test3.c: Disable test for netware mysql-test/mysql-test-run.sh: Give warning if output file contains errors mysql-test/r/count_distinct.result: More tests mysql-test/r/group_by.result: Test of ORDER BY NULL mysql-test/t/backup.test: Fixes for Netware mysql-test/t/count_distinct.test: More tests mysql-test/t/func_crypt.test: Fixes for Netware mysql-test/t/grant_cache.test: Fixes for Netware mysql-test/t/group_by.test: Tests of ORDER BY NULL mysql-test/t/rpl000015.test: Fixes for Netware mysql-test/t/rpl000017.test: Fixes for Netware mysql-test/t/rpl_rotate_logs.test: Fixes for Netware mysys/Makefile.am: Added my_sleep.c and my_netware.c mysys/charset.c: Fixes for Netware mysys/default.c: Fixes for Netware mysys/mf_tempfile.c: Fixes for Netware mysys/my_clock.c: Fixes for Netware mysys/my_copy.c: Fixes for Netware mysys/my_getwd.c: Changed function comment from // -> /* */ mysys/my_init.c: Fixes for Netware mysys/my_lock.c: Fixes for Netware mysys/my_messnc.c: Fixes for Netware mysys/my_os2cond.c: Removed comment mysys/my_os2dirsrch.c: Changed function comment from // -> /* */ Fixed indentation mysys/my_os2dirsrch.h: Changed function comment from // -> /* */ Fixed indentation mysys/my_os2file64.c: Changed function comment from // -> /* */ Fixed indentation mysys/my_os2mutex.c: Changed function comment from // -> /* */ Fixed indentation mysys/my_os2thread.c: Changed function comment from // -> /* */ Fixed indentation mysys/my_os2tls.c: Changed function comment from // -> /* */ Fixed indentation mysys/my_pthread.c: Fixes for Netware mysys/my_redel.c: Fixes for Netware mysys/my_tempnam.c: Fixes for Netware mysys/my_thr_init.c: Remove created mutexes when program ends. mysys/mysys_priv.h: Cleanup mysys/safemalloc.c: Prefix error messages with "Error:" mysys/thr_alarm.c: Destroy internal mutex on end_thr_alarm. mysys/thr_mutex.c: Added detection of mutex on which one didn't call pthread_mutex_destroy() scripts/make_binary_distribution.sh: Fixes for Netware sql/des_key_file.cc: Free mutex at end sql/ha_innodb.cc: Free mutex at end sql/ha_myisam.cc: Changed warnings from REPAIR Note: (For mysql-test-run) sql/hostname.cc: Fixes for Netware sql/item.h: Fixed bug in create_tmp_field() which causes a memory overrun sql/item_func.cc: Free used mutexes sql/item_sum.cc: Fixed bug in create_tmp_field() which causes a memory overrun sql/log.cc: Free used mutexes sql/my_lock.c: Fixes for Netware sql/mysql_priv.h: Fixes for Netware sql/mysqld.cc: Fixes for Netware Added Have_crypt Properly free mutexes from MYSQL_LOG by calling cleanup Free mutex before exit sql/repl_failsafe.cc: Fixes for Netware sql/set_var.cc: Added have_crypt sql/share/english/errmsg.txt: Added version socket and port to stderr log sql/slave.cc: Remove global MASTER_INFO variable and use instead an allocated variable. This allows us to correctly free used mutex. sql/slave.h: Move constructors and destuctors to slave.cc (To make it easier to clear all needed variables) sql/sql_base.cc: Safety fix sql/sql_class.h: Portability fixes. Added 'cleanup' to log handling to be able to free mutexes. sql/sql_insert.cc: Fixes for Netware mysys/my_sleep.c: E sql/sql_parse.cc: Fixes for Netware sql/sql_select.cc: Added optimisation for ORDER BY NULL sql/sql_select.h: Fixed bug in create_tmp_field() which causes a memory overrun sql/sql_table.cc: Fixed bug in create_tmp_field() which causes a memory overrun sql/sql_udf.cc: Free mutex on end vio/test-ssl.c: Simple code cleanup vio/test-sslclient.c: Simple code cleanup vio/test-sslserver.c: Simple code cleanup vio/viotest-ssl.c: Simple code cleanup
This commit is contained in:
269
sql/mysqld.cc
269
sql/mysqld.cc
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
||||
/* Copyright (C) 2000-2003 MySQL AB
|
||||
|
||||
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
|
||||
@ -79,7 +79,9 @@ extern "C" { // Because of SCO 3.2V4.2
|
||||
#if defined(OS2)
|
||||
# include <sys/un.h>
|
||||
#elif !defined( __WIN__)
|
||||
# ifndef __NETWARE__
|
||||
#include <sys/resource.h>
|
||||
# endif /* __NETWARE__ */
|
||||
#ifdef HAVE_SYS_UN_H
|
||||
# include <sys/un.h>
|
||||
#endif
|
||||
@ -117,6 +119,15 @@ int deny_severity = LOG_WARNING;
|
||||
#include <sys/mman.h>
|
||||
#endif
|
||||
|
||||
#ifdef __NETWARE__
|
||||
#include <nks/vm.h>
|
||||
#include <library.h>
|
||||
#include <monitor.h>
|
||||
|
||||
event_handle_t eh;
|
||||
Report_t ref;
|
||||
#endif /* __NETWARE__ */
|
||||
|
||||
#ifdef _AIX41
|
||||
int initgroups(const char *,unsigned int);
|
||||
#endif
|
||||
@ -240,6 +251,11 @@ SHOW_COMP_OPTION have_query_cache=SHOW_OPTION_YES;
|
||||
#else
|
||||
SHOW_COMP_OPTION have_query_cache=SHOW_OPTION_NO;
|
||||
#endif
|
||||
#ifdef HAVE_CRYPT
|
||||
SHOW_COMP_OPTION have_crypt=SHOW_OPTION_YES;
|
||||
#else
|
||||
SHOW_COMP_OPTION have_crypt=SHOW_OPTION_NO;
|
||||
#endif
|
||||
|
||||
bool opt_large_files= sizeof(my_off_t) > 4;
|
||||
#if SIZEOF_OFF_T > 4 && defined(BIG_TABLES)
|
||||
@ -361,8 +377,8 @@ ulong bytes_sent = 0L, bytes_received = 0L;
|
||||
|
||||
bool opt_endinfo,using_udf_functions, locked_in_memory;
|
||||
bool opt_using_transactions, using_update_log;
|
||||
bool volatile abort_loop,select_thread_in_use,grant_option;
|
||||
bool volatile ready_to_exit,shutdown_in_progress;
|
||||
bool volatile abort_loop, select_thread_in_use, signal_thread_in_use;
|
||||
bool volatile ready_to_exit, shutdown_in_progress, grant_option;
|
||||
ulong refresh_version=1L,flush_version=1L; /* Increments on each reload */
|
||||
ulong query_id=1L,long_query_count,aborted_threads,
|
||||
aborted_connects,delayed_insert_timeout,delayed_insert_limit,
|
||||
@ -471,6 +487,7 @@ static uint set_maximum_open_files(uint max_file_limit);
|
||||
#endif
|
||||
static ulong find_bit_type(const char *x, TYPELIB *bit_lib);
|
||||
static void clean_up(bool print_message);
|
||||
static void clean_up_mutexes(void);
|
||||
|
||||
/****************************************************************************
|
||||
** Code to end mysqld
|
||||
@ -498,7 +515,7 @@ static void close_connections(void)
|
||||
(void) pthread_mutex_unlock(&LOCK_manager);
|
||||
|
||||
/* kill connection thread */
|
||||
#if !defined(__WIN__) && !defined(__EMX__) && !defined(OS2)
|
||||
#if !defined(__WIN__) && !defined(__EMX__) && !defined(OS2) && !defined(__NETWARE__)
|
||||
DBUG_PRINT("quit",("waiting for select thread: %lx",select_thread));
|
||||
(void) pthread_mutex_lock(&LOCK_thread_count);
|
||||
|
||||
@ -640,14 +657,11 @@ static void close_connections(void)
|
||||
}
|
||||
(void) pthread_mutex_unlock(&LOCK_thread_count);
|
||||
|
||||
mysql_log.close(1);
|
||||
mysql_slow_log.close(1);
|
||||
mysql_update_log.close(1);
|
||||
mysql_bin_log.close(1);
|
||||
DBUG_PRINT("quit",("close_connections thread"));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
static void close_server_sock()
|
||||
{
|
||||
#ifdef HAVE_CLOSE_SERVER_SOCK
|
||||
@ -659,10 +673,10 @@ static void close_server_sock()
|
||||
ip_sock=INVALID_SOCKET;
|
||||
DBUG_PRINT("info",("calling shutdown on TCP/IP socket"));
|
||||
VOID(shutdown(tmp_sock,2));
|
||||
#ifdef NOT_USED
|
||||
#if defined(__NETWARE__)
|
||||
/*
|
||||
The following code is disabled as it causes MySQL to hang on
|
||||
AIX 4.3 during shutdown
|
||||
The following code is disabled for normal systems as it causes MySQL
|
||||
to hang on AIX 4.3 during shutdown
|
||||
*/
|
||||
DBUG_PRINT("info",("calling closesocket on TCP/IP socket"));
|
||||
VOID(closesocket(tmp_sock));
|
||||
@ -674,9 +688,9 @@ static void close_server_sock()
|
||||
unix_sock=INVALID_SOCKET;
|
||||
DBUG_PRINT("info",("calling shutdown on unix socket"));
|
||||
VOID(shutdown(tmp_sock,2));
|
||||
#ifdef NOT_USED
|
||||
#if defined(__NETWARE__)
|
||||
/*
|
||||
The following code is disabled as it may cause MySQL to hang on
|
||||
The following code is disabled for normal systems as it causes MySQL
|
||||
AIX 4.3 during shutdown (not tested, but likely)
|
||||
*/
|
||||
DBUG_PRINT("info",("calling closesocket on unix/IP socket"));
|
||||
@ -741,7 +755,7 @@ void kill_mysql(void)
|
||||
|
||||
/* Force server down. kill all connections and threads and exit */
|
||||
|
||||
#if defined(OS2)
|
||||
#if defined(OS2) || defined(__NETWARE__)
|
||||
extern "C" void kill_server(int sig_ptr)
|
||||
#define RETURN_FROM_KILL_SERVER DBUG_RETURN
|
||||
#elif !defined(__WIN__)
|
||||
@ -760,13 +774,16 @@ static void __cdecl kill_server(int sig_ptr)
|
||||
RETURN_FROM_KILL_SERVER;
|
||||
kill_in_progress=TRUE;
|
||||
abort_loop=1; // This should be set
|
||||
#ifdef __NETWARE__
|
||||
ActivateScreen(getscreenhandle()); // Show the screen going down
|
||||
#endif
|
||||
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 */
|
||||
|
||||
#if defined(USE_ONE_SIGNAL_HAND) && !defined(__WIN__) && !defined(OS2)
|
||||
#if defined(__NETWARE__) || (defined(USE_ONE_SIGNAL_HAND) && !defined(__WIN__) && !defined(OS2))
|
||||
my_thread_init(); // If this is a new thread
|
||||
#endif
|
||||
close_connections();
|
||||
@ -774,12 +791,18 @@ static void __cdecl kill_server(int sig_ptr)
|
||||
unireg_abort(1); /* purecov: inspected */
|
||||
else
|
||||
unireg_end();
|
||||
|
||||
#ifdef __NETWARE__
|
||||
pthread_join(select_thread, NULL); // wait for main thread
|
||||
#else
|
||||
pthread_exit(0); /* purecov: deadcode */
|
||||
#endif /* __NETWARE__ */
|
||||
|
||||
RETURN_FROM_KILL_SERVER;
|
||||
}
|
||||
|
||||
|
||||
#ifdef USE_ONE_SIGNAL_HAND
|
||||
#if defined(USE_ONE_SIGNAL_HAND) || (defined(__NETWARE__) && defined(SIGNALS_DONT_BREAK_READ))
|
||||
extern "C" pthread_handler_decl(kill_server_thread,arg __attribute__((unused)))
|
||||
{
|
||||
SHUTDOWN_THD;
|
||||
@ -806,7 +829,7 @@ extern "C" sig_handler print_signal_warning(int sig)
|
||||
#ifdef DONT_REMEMBER_SIGNAL
|
||||
sigset(sig,print_signal_warning); /* int. thread system calls */
|
||||
#endif
|
||||
#if !defined(__WIN__) && !defined(OS2)
|
||||
#if !defined(__WIN__) && !defined(OS2) && !defined(__NETWARE__)
|
||||
if (sig == SIGALRM)
|
||||
alarm(2); /* reschedule alarm */
|
||||
#endif
|
||||
@ -830,11 +853,13 @@ void unireg_end(void)
|
||||
{
|
||||
clean_up(1);
|
||||
my_thread_end();
|
||||
#ifndef __NETWARE__
|
||||
#ifdef SIGNALS_DONT_BREAK_READ
|
||||
exit(0);
|
||||
#else
|
||||
pthread_exit(0); // Exit is in main thread
|
||||
#endif
|
||||
#endif /* __NETWARE__ */
|
||||
}
|
||||
|
||||
|
||||
@ -846,6 +871,8 @@ extern "C" void unireg_abort(int exit_code)
|
||||
clean_up(1); /* purecov: inspected */
|
||||
DBUG_PRINT("quit",("done with cleanup in unireg_abort"));
|
||||
my_thread_end();
|
||||
clean_up_mutexes();
|
||||
my_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
|
||||
exit(exit_code); /* purecov: inspected */
|
||||
}
|
||||
|
||||
@ -855,6 +882,12 @@ void clean_up(bool print_message)
|
||||
DBUG_PRINT("exit",("clean_up"));
|
||||
if (cleanup_done++)
|
||||
return; /* purecov: inspected */
|
||||
|
||||
mysql_log.cleanup();
|
||||
mysql_slow_log.cleanup();
|
||||
mysql_update_log.cleanup();
|
||||
mysql_bin_log.cleanup();
|
||||
|
||||
if (use_slave_mask)
|
||||
bitmap_free(&slave_error_mask);
|
||||
acl_free(1);
|
||||
@ -884,6 +917,9 @@ void clean_up(bool print_message)
|
||||
bitmap_free(&temp_pool);
|
||||
free_max_user_conn();
|
||||
end_slave_list();
|
||||
#ifdef HAVE_OPENSSL
|
||||
free_des_key_file();
|
||||
#endif /* HAVE_OPENSSL */
|
||||
#ifdef USE_REGEX
|
||||
regex_end();
|
||||
#endif
|
||||
@ -911,6 +947,35 @@ void clean_up(bool print_message)
|
||||
} /* clean_up */
|
||||
|
||||
|
||||
static void clean_up_mutexes()
|
||||
{
|
||||
(void) pthread_mutex_destroy(&LOCK_mysql_create_db);
|
||||
(void) pthread_mutex_destroy(&LOCK_Acl);
|
||||
(void) pthread_mutex_destroy(&LOCK_grant);
|
||||
(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_timezone);
|
||||
(void) pthread_mutex_destroy(&LOCK_user_conn);
|
||||
(void) pthread_mutex_destroy(&LOCK_rpl_status);
|
||||
(void) pthread_mutex_destroy(&LOCK_active_mi);
|
||||
(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);
|
||||
(void) pthread_cond_destroy(&COND_rpl_status);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
** Init IP and UNIX socket
|
||||
@ -944,7 +1009,7 @@ static void set_ports()
|
||||
|
||||
static void set_user(const char *user)
|
||||
{
|
||||
#if !defined(__WIN__) && !defined(OS2)
|
||||
#if !defined(__WIN__) && !defined(OS2) && !defined(__NETWARE__)
|
||||
struct passwd *ent;
|
||||
|
||||
// don't bother if we aren't superuser
|
||||
@ -1005,7 +1070,7 @@ static void set_user(const char *user)
|
||||
|
||||
static void set_root(const char *path)
|
||||
{
|
||||
#if !defined(__WIN__) && !defined(__EMX__) && !defined(OS2)
|
||||
#if !defined(__WIN__) && !defined(__EMX__) && !defined(OS2) && !defined(__NETWARE__)
|
||||
if (chroot(path) == -1)
|
||||
{
|
||||
sql_perror("chroot");
|
||||
@ -1317,6 +1382,89 @@ static void start_signal_handler(void)
|
||||
{
|
||||
}
|
||||
|
||||
#elif defined(__NETWARE__)
|
||||
|
||||
// down server event callback
|
||||
void mysql_down_server_cb(void *, void *)
|
||||
{
|
||||
setscreenmode(SCR_AUTOCLOSE_ON_EXIT); // auto close the screen
|
||||
kill_server(0);
|
||||
}
|
||||
|
||||
// destroy callback resources
|
||||
void mysql_cb_destroy(void *)
|
||||
{
|
||||
UnRegisterEventNotification(eh); // cleanup down event notification
|
||||
NX_UNWRAP_INTERFACE(ref);
|
||||
}
|
||||
|
||||
// initialize callbacks
|
||||
void mysql_cb_init()
|
||||
{
|
||||
// register for down server event
|
||||
void *handle = getnlmhandle();
|
||||
rtag_t rt = AllocateResourceTag(handle, "MySQL Down Server Callback",
|
||||
EventSignature);
|
||||
NX_WRAP_INTERFACE((void *)mysql_down_server_cb, 2, (void **)&ref);
|
||||
eh = RegisterForEventNotification(rt, EVENT_DOWN_SERVER,
|
||||
EVENT_PRIORITY_APPLICATION,
|
||||
NULL, ref, NULL);
|
||||
NXVmRegisterExitHandler(mysql_cb_destroy, NULL); // clean-up
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
static void start_signal_handler(void)
|
||||
{
|
||||
// Save vm id of this process
|
||||
if (!opt_bootstrap)
|
||||
{
|
||||
File pidFile;
|
||||
if ((pidFile = my_create(pidfile_name,0664, O_WRONLY, MYF(MY_WME))) >= 0)
|
||||
{
|
||||
char buff[21];
|
||||
sprintf(buff,"%lu",(ulong) getpid());
|
||||
(void) my_write(pidFile, buff,strlen(buff),MYF(MY_WME));
|
||||
(void) my_close(pidFile,MYF(0));
|
||||
}
|
||||
}
|
||||
// no signal handler
|
||||
}
|
||||
|
||||
|
||||
/* Warn if the data is on a Traditional volume */
|
||||
|
||||
static void check_data_home(const char *path)
|
||||
{
|
||||
struct volume_info vol;
|
||||
char buff[PATH_MAX], *pos;
|
||||
|
||||
bzero((char*) &vol, sizeof(vol)); // clear struct
|
||||
|
||||
// find volume name
|
||||
if ((pos= strchr(path, ':')))
|
||||
{
|
||||
uint length= (uint) (pos-path);
|
||||
strmake(buff, path, min(length, sizeof(buff)-1));
|
||||
}
|
||||
else
|
||||
strmov(buff, "SYS"); // assume SYS volume
|
||||
|
||||
netware_vol_info_from_name(&vol, buff); // retrieve information
|
||||
if ((vol.flags & VOL_NSS_PRESENT) == 0)
|
||||
{
|
||||
sql_print_error("Error: %s is not on an NSS volume!", path);
|
||||
unireg_abort(-1);
|
||||
}
|
||||
}
|
||||
|
||||
#elif defined(__EMX__)
|
||||
static void sig_reload(int signo)
|
||||
{
|
||||
@ -1352,6 +1500,10 @@ static void start_signal_handler(void)
|
||||
{
|
||||
}
|
||||
|
||||
static void check_data_home(const char *path)
|
||||
{
|
||||
}
|
||||
|
||||
#else /* if ! __WIN__ && ! __EMX__ */
|
||||
|
||||
#ifdef HAVE_LINUXTHREADS
|
||||
@ -1554,7 +1706,8 @@ extern "C" void *signal_hand(void *arg __attribute__((unused)))
|
||||
int sig;
|
||||
my_thread_init(); // Init new thread
|
||||
DBUG_ENTER("signal_hand");
|
||||
SIGNAL_THD;
|
||||
signal_thread_in_use= 1;
|
||||
|
||||
/*
|
||||
Setup alarm handler
|
||||
The two extra handlers are for slave threads
|
||||
@ -1621,6 +1774,7 @@ extern "C" void *signal_hand(void *arg __attribute__((unused)))
|
||||
if (cleanup_done)
|
||||
{
|
||||
my_thread_end();
|
||||
signal_thread_in_use= 0;
|
||||
pthread_exit(0); // Safety
|
||||
}
|
||||
switch (sig) {
|
||||
@ -1672,6 +1826,10 @@ extern "C" void *signal_hand(void *arg __attribute__((unused)))
|
||||
return(0); /* purecov: deadcode */
|
||||
}
|
||||
|
||||
static void check_data_home(const char *path)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* __WIN__*/
|
||||
|
||||
|
||||
@ -1844,6 +2002,12 @@ int main(int argc, char **argv)
|
||||
tzset(); // Set tzname
|
||||
|
||||
start_time=time((time_t*) 0);
|
||||
|
||||
#ifdef __NETWARE__
|
||||
printf("MySQL Server %s, for %s (%s)\n", VERSION, SYSTEM_TYPE, MACHINE_TYPE);
|
||||
fflush(stdout);
|
||||
#endif /* __NETWARE__ */
|
||||
|
||||
#ifdef OS2
|
||||
{
|
||||
// fix timezone for daylight saving
|
||||
@ -2006,6 +2170,7 @@ int main(int argc, char **argv)
|
||||
We have enough space for fiddling with the argv, continue
|
||||
*/
|
||||
umask(((~my_umask) & 0666));
|
||||
check_data_home(mysql_real_data_home);
|
||||
if (my_setwd(mysql_real_data_home,MYF(MY_WME)))
|
||||
{
|
||||
unireg_abort(1); /* purecov: inspected */
|
||||
@ -2054,7 +2219,7 @@ int main(int argc, char **argv)
|
||||
sql_print_error("Can't init databases");
|
||||
if (unix_sock != INVALID_SOCKET)
|
||||
unlink(mysql_unix_port);
|
||||
exit(1);
|
||||
unireg_abort(1);
|
||||
}
|
||||
ha_key_cache();
|
||||
#if defined(HAVE_MLOCKALL) && defined(MCL_CURRENT)
|
||||
@ -2091,21 +2256,23 @@ int main(int argc, char **argv)
|
||||
sql_print_error("Can't create thread-keys");
|
||||
if (unix_sock != INVALID_SOCKET)
|
||||
unlink(mysql_unix_port);
|
||||
exit(1);
|
||||
unireg_abort(1);
|
||||
}
|
||||
start_signal_handler(); // Creates pidfile
|
||||
if (acl_init((THD*) 0, opt_noacl))
|
||||
{
|
||||
abort_loop=1;
|
||||
select_thread_in_use=0;
|
||||
(void) pthread_kill(signal_thread,MYSQL_KILL_SIGNAL);
|
||||
#ifndef __NETWARE__
|
||||
(void) pthread_kill(signal_thread, MYSQL_KILL_SIGNAL);
|
||||
#endif /* __NETWARE__ */
|
||||
#ifndef __WIN__
|
||||
if (!opt_bootstrap)
|
||||
(void) my_delete(pidfile_name,MYF(MY_WME)); // Not needed anymore
|
||||
#endif
|
||||
if (unix_sock != INVALID_SOCKET)
|
||||
unlink(mysql_unix_port);
|
||||
exit(1);
|
||||
unireg_abort(1);
|
||||
}
|
||||
if (!opt_noacl)
|
||||
(void) grant_init((THD*) 0);
|
||||
@ -2194,7 +2361,9 @@ The server will not act as a slave.");
|
||||
sql_print_error("Warning: Can't create thread to manage maintenance");
|
||||
}
|
||||
|
||||
printf(ER(ER_READY),my_progname,server_version,"");
|
||||
if (unix_sock == INVALID_SOCKET)
|
||||
mysql_unix_port[0]= 0;
|
||||
printf(ER(ER_READY),my_progname,server_version, mysql_unix_port, mysql_port);
|
||||
fflush(stdout);
|
||||
|
||||
#ifdef __NT__
|
||||
@ -2277,6 +2446,22 @@ The server will not act as a slave.");
|
||||
CloseHandle(hEventShutdown);
|
||||
}
|
||||
#endif
|
||||
#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();
|
||||
my_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
|
||||
exit(0);
|
||||
return(0); /* purecov: deadcode */
|
||||
@ -2552,7 +2737,10 @@ static void create_new_thread(THD *thd)
|
||||
inline void kill_broken_server()
|
||||
{
|
||||
/* hack to get around signals ignored in syscalls for problem OS's */
|
||||
if (unix_sock == INVALID_SOCKET ||
|
||||
if (
|
||||
#if !defined(__NETWARE__)
|
||||
unix_sock == INVALID_SOCKET ||
|
||||
#endif
|
||||
(!opt_disable_networking && ip_sock == INVALID_SOCKET))
|
||||
{
|
||||
select_thread_in_use = 0;
|
||||
@ -2566,7 +2754,8 @@ inline void kill_broken_server()
|
||||
|
||||
/* Handle new connections and spawn new process to handle them */
|
||||
|
||||
extern "C" pthread_handler_decl(handle_connections_sockets,arg __attribute__((unused)))
|
||||
extern "C" pthread_handler_decl(handle_connections_sockets,
|
||||
arg __attribute__((unused)))
|
||||
{
|
||||
my_socket sock,new_sock;
|
||||
uint error_count=0;
|
||||
@ -2652,6 +2841,13 @@ extern "C" pthread_handler_decl(handle_connections_sockets,arg __attribute__((un
|
||||
size_socket length=sizeof(struct sockaddr_in);
|
||||
new_sock = accept(sock, my_reinterpret_cast(struct sockaddr *) (&cAddr),
|
||||
&length);
|
||||
#ifdef __NETWARE__
|
||||
// TODO: temporary fix, waiting for TCP/IP fix - DEFECT000303149
|
||||
if ((new_sock == INVALID_SOCKET) && (socket_errno == EINVAL))
|
||||
{
|
||||
kill_server(SIGTERM);
|
||||
}
|
||||
#endif
|
||||
if (new_sock != INVALID_SOCKET ||
|
||||
(socket_errno != SOCKET_EINTR && socket_errno != SOCKET_EAGAIN))
|
||||
break;
|
||||
@ -2880,7 +3076,7 @@ enum options {
|
||||
OPT_BDB_HOME, OPT_BDB_LOG,
|
||||
OPT_BDB_TMP, OPT_BDB_NOSYNC,
|
||||
OPT_BDB_LOCK, OPT_BDB_SKIP,
|
||||
OPT_BDB_NO_RECOVER, OPT_BDB_SHARED,
|
||||
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,
|
||||
@ -2964,7 +3160,8 @@ enum options {
|
||||
OPT_INNODB_FORCE_RECOVERY,
|
||||
OPT_BDB_CACHE_SIZE,
|
||||
OPT_BDB_LOG_BUFFER_SIZE,
|
||||
OPT_BDB_MAX_LOCK
|
||||
OPT_BDB_MAX_LOCK,
|
||||
OPT_AUTOCLOSE
|
||||
};
|
||||
|
||||
|
||||
@ -2974,6 +3171,9 @@ struct my_option my_long_options[] =
|
||||
{
|
||||
{"ansi", 'a', "Use ANSI SQL syntax instead of MySQL syntax", 0, 0, 0,
|
||||
GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#ifdef __NETWARE__
|
||||
{"autoclose", OPT_AUTOCLOSE, "Auto close screen. (NetWare only)", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif /* __NETWARE__ */
|
||||
{"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,
|
||||
@ -3971,8 +4171,8 @@ static void set_options(void)
|
||||
global_system_variables.max_join_size= HA_POS_ERROR;
|
||||
max_system_variables.max_join_size= HA_POS_ERROR;
|
||||
|
||||
#ifdef __WIN__
|
||||
/* Allow Win32 users to move MySQL anywhere */
|
||||
#if defined(__WIN__) || defined(__NETWARE__)
|
||||
/* Allow Win32 and NetWare users to move MySQL anywhere */
|
||||
{
|
||||
char prg_dev[LIBLEN];
|
||||
my_path(prg_dev,my_progname,"mysql/bin");
|
||||
@ -4290,6 +4490,11 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
||||
#ifdef __WIN__
|
||||
case (int) OPT_STANDALONE: /* Dummy option for NT */
|
||||
break;
|
||||
#endif
|
||||
#ifdef __NETWARE__
|
||||
case (int) OPT_AUTOCLOSE:
|
||||
setscreenmode(SCR_AUTOCLOSE_ON_EXIT);
|
||||
break;
|
||||
#endif
|
||||
case (int) OPT_FLUSH:
|
||||
#ifdef HAVE_ISAM
|
||||
@ -4462,7 +4667,7 @@ static void get_options(int argc,char **argv)
|
||||
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
|
||||
exit(ho_error);
|
||||
|
||||
#ifdef HAVE_BROKEN_REALPATH
|
||||
#if defined(HAVE_BROKEN_REALPATH)
|
||||
my_use_symdir=0;
|
||||
my_disable_symlinks=1;
|
||||
have_symlink=SHOW_OPTION_NO;
|
||||
|
Reference in New Issue
Block a user