diff options
author | msvensson@neptunus.(none) <> | 2005-09-14 09:43:56 +0200 |
---|---|---|
committer | msvensson@neptunus.(none) <> | 2005-09-14 09:43:56 +0200 |
commit | fb63290635b2f166973130fbd98857818c372c10 (patch) | |
tree | 8122abb61a196d04af334814017370f2a8fbf43b /server-tools | |
parent | 4c685e6a1593eb310ae6f5946ac902e54157425c (diff) | |
parent | d5ae0825d9b54e9ac8aa5e652e10e94998a6a392 (diff) | |
download | mariadb-git-fb63290635b2f166973130fbd98857818c372c10.tar.gz |
Merge neptunus.(none):/home/msvensson/mysql/bug10713_new/my50-bug10713_new
into neptunus.(none):/home/msvensson/mysql/bug10713_new/my51-bug10713_new
Diffstat (limited to 'server-tools')
-rw-r--r-- | server-tools/instance-manager/IMService.cpp | 13 | ||||
-rw-r--r-- | server-tools/instance-manager/IMService.h | 2 | ||||
-rw-r--r-- | server-tools/instance-manager/WindowsService.cpp | 5 | ||||
-rw-r--r-- | server-tools/instance-manager/WindowsService.h | 2 | ||||
-rw-r--r-- | server-tools/instance-manager/instance.cc | 30 | ||||
-rw-r--r-- | server-tools/instance-manager/instance_options.cc | 8 | ||||
-rw-r--r-- | server-tools/instance-manager/listener.cc | 13 | ||||
-rw-r--r-- | server-tools/instance-manager/mysqlmanager.cc | 10 | ||||
-rw-r--r-- | server-tools/instance-manager/mysqlmanager.vcproj | 148 | ||||
-rw-r--r-- | server-tools/instance-manager/options.cc | 5 | ||||
-rw-r--r-- | server-tools/instance-manager/options.h | 3 |
11 files changed, 172 insertions, 67 deletions
diff --git a/server-tools/instance-manager/IMService.cpp b/server-tools/instance-manager/IMService.cpp index e040a5da8c2..b7ea8e7eb81 100644 --- a/server-tools/instance-manager/IMService.cpp +++ b/server-tools/instance-manager/IMService.cpp @@ -1,12 +1,16 @@ #include <windows.h> +#include <signal.h> #include "log.h" #include "options.h" #include "IMService.h" +#include "manager.h" IMService::IMService(void) { serviceName= "MySqlManager"; displayName= "MySQL Manager"; + username= NULL; + password= NULL; } IMService::~IMService(void) @@ -16,18 +20,25 @@ IMService::~IMService(void) void IMService::Stop() { ReportStatus(SERVICE_STOP_PENDING); + // stop the IM work + raise(SIGTERM); } -void IMService::Run() +void IMService::Run(DWORD argc, LPTSTR *argv) { // report to the SCM that we're about to start ReportStatus((DWORD)SERVICE_START_PENDING); + Options o; + o.load(argc, argv); + // init goes here ReportStatus((DWORD)SERVICE_RUNNING); // wait for main loop to terminate + manager(o); + o.cleanup(); } void IMService::Log(const char *msg) diff --git a/server-tools/instance-manager/IMService.h b/server-tools/instance-manager/IMService.h index 60c202fc561..cad38bebdaf 100644 --- a/server-tools/instance-manager/IMService.h +++ b/server-tools/instance-manager/IMService.h @@ -10,5 +10,5 @@ public: protected: void Log(const char *msg); void Stop(); - void Run(); + void Run(DWORD argc, LPTSTR *argv); }; diff --git a/server-tools/instance-manager/WindowsService.cpp b/server-tools/instance-manager/WindowsService.cpp index fb7e00e0d9b..192045b7a4c 100644 --- a/server-tools/instance-manager/WindowsService.cpp +++ b/server-tools/instance-manager/WindowsService.cpp @@ -8,7 +8,8 @@ WindowsService::WindowsService(void) : statusCheckpoint(0), serviceName(NULL), inited(false), - dwAcceptedControls(SERVICE_ACCEPT_STOP) + dwAcceptedControls(SERVICE_ACCEPT_STOP), + debugging(false) { gService= this; status.dwServiceType= SERVICE_WIN32_OWN_PROCESS; @@ -148,7 +149,7 @@ void WindowsService::RegisterAndRun(DWORD argc, LPTSTR *argv) { statusHandle= ::RegisterServiceCtrlHandler(serviceName, ControlHandler); if (statusHandle && ReportStatus(SERVICE_START_PENDING)) - Run(); + Run(argc, argv); ReportStatus(SERVICE_STOPPED); } diff --git a/server-tools/instance-manager/WindowsService.h b/server-tools/instance-manager/WindowsService.h index 612eeda21e9..1a034ce1351 100644 --- a/server-tools/instance-manager/WindowsService.h +++ b/server-tools/instance-manager/WindowsService.h @@ -30,7 +30,7 @@ public: static void WINAPI ControlHandler(DWORD CtrlType); protected: - virtual void Run()= 0; + virtual void Run(DWORD argc, LPTSTR *argv)= 0; virtual void Stop() {} virtual void Shutdown() {} virtual void Pause() {} diff --git a/server-tools/instance-manager/instance.cc b/server-tools/instance-manager/instance.cc index 0a373429d01..5e1c3d2ea9f 100644 --- a/server-tools/instance-manager/instance.cc +++ b/server-tools/instance-manager/instance.cc @@ -18,9 +18,6 @@ #pragma implementation #endif -#ifdef __WIN__ -#include <process.h> -#endif #include "instance.h" #include "mysql_manager_error.h" @@ -40,7 +37,7 @@ static void start_and_monitor_instance(Instance_options *old_instance_options, Instance_map *instance_map); -#ifndef _WIN_ +#ifndef __WIN__ typedef pid_t My_process_info; #else typedef PROCESS_INFORMATION My_process_info; @@ -171,25 +168,24 @@ static int start_process(Instance_options *instance_options, ZeroMemory(pi, sizeof(PROCESS_INFORMATION)); int cmdlen= 0; - for (int i= 1; instance_options->argv[i] != 0; i++) - cmdlen+= strlen(instance_options->argv[i]) + 1; - cmdlen++; /* we have to add a single space for CreateProcess (see docs) */ + for (int i= 0; instance_options->argv[i] != 0; i++) + cmdlen+= strlen(instance_options->argv[i]) + 3; + cmdlen++; /* make room for the null */ - char *cmdline= NULL; - if (cmdlen > 0) + char *cmdline= new char[cmdlen]; + if (cmdline == NULL) + return 1; + + for (int i= 0; instance_options->argv[i] != 0; i++) { - cmdline= new char[cmdlen]; - cmdline[0]= 0; - for (int i= 1; instance_options->argv[i] != 0; i++) - { - strcat(cmdline, " "); - strcat(cmdline, instance_options->argv[i]); - } + strcat(cmdline, "\""); + strcat(cmdline, instance_options->argv[i]); + strcat(cmdline, "\" "); } /* Start the child process */ BOOL result= - CreateProcess(instance_options->mysqld_path, /* File to execute */ + CreateProcess(NULL, /* Put it all in cmdline */ cmdline, /* Command line */ NULL, /* Process handle not inheritable */ NULL, /* Thread handle not inheritable */ diff --git a/server-tools/instance-manager/instance_options.cc b/server-tools/instance-manager/instance_options.cc index 124195aad37..70950a91015 100644 --- a/server-tools/instance-manager/instance_options.cc +++ b/server-tools/instance-manager/instance_options.cc @@ -46,8 +46,16 @@ static inline int create_mysqld_command(Buffer *buf, if (buf->get_size()) /* malloc succeeded */ { +#ifdef __WIN__ + buf->append(position, "\"", 1); + position++; +#endif buf->append(position, mysqld_path_str, mysqld_path_len); position+= mysqld_path_len; +#ifdef __WIN__ + buf->append(position, "\"", 1); + position++; +#endif /* here the '\0' character is copied from the option string */ buf->append(position, option, option_len); diff --git a/server-tools/instance-manager/listener.cc b/server-tools/instance-manager/listener.cc index 790770be09e..374946d3b73 100644 --- a/server-tools/instance-manager/listener.cc +++ b/server-tools/instance-manager/listener.cc @@ -121,6 +121,9 @@ void Listener_thread::run() n= max(n, sockets[i]); n++; + timeval tv; + tv.tv_sec= 0; + tv.tv_usec= 100000; while (!thread_registry.is_shutdown()) { fd_set read_fds_arg= read_fds; @@ -130,13 +133,13 @@ void Listener_thread::run() signal during shutdown. This results in failing assert (Thread_registry::~Thread_registry). Valgrind 2.2 works fine. */ - int rc= select(n, &read_fds_arg, 0, 0, 0); + int rc= select(n, &read_fds_arg, 0, 0, &tv); - - if (rc == -1 && errno != EINTR) + if (rc == 0 || rc == -1) { - log_error("Listener_thread::run(): select() failed, %s", - strerror(errno)); + if (rc == -1 && errno != EINTR) + log_error("Listener_thread::run(): select() failed, %s", + strerror(errno)); continue; } diff --git a/server-tools/instance-manager/mysqlmanager.cc b/server-tools/instance-manager/mysqlmanager.cc index a1420a639cb..3d2907f4776 100644 --- a/server-tools/instance-manager/mysqlmanager.cc +++ b/server-tools/instance-manager/mysqlmanager.cc @@ -102,10 +102,12 @@ int main(int argc, char *argv[]) angel(options); } #else -#ifdef NDEBUG - return_value= HandleServiceOptions(options); - goto err; /* this is not always an error but we reuse the label */ -#endif + if (!options.stand_alone) + { + if (HandleServiceOptions(options)) + goto err; + } + else #endif manager(options); diff --git a/server-tools/instance-manager/mysqlmanager.vcproj b/server-tools/instance-manager/mysqlmanager.vcproj index 2ab9a4878c1..a5ef7cb21e3 100644 --- a/server-tools/instance-manager/mysqlmanager.vcproj +++ b/server-tools/instance-manager/mysqlmanager.vcproj @@ -19,7 +19,7 @@ <Tool Name="VCCLCompilerTool" Optimization="0" - AdditionalIncludeDirectories="..\include" + AdditionalIncludeDirectories="..\..\include,../../extra/yassl/include" PreprocessorDefinitions="MYSQL_INSTANCE_MANAGER;MYSQL_SERVER;_DEBUG;SAFEMALLOC;SAFE_MUTEX;_WINDOWS;CONSOLE" MinimalRebuild="TRUE" ExceptionHandling="FALSE" @@ -69,7 +69,7 @@ CharacterSet="2"> <Tool Name="VCCLCompilerTool" - AdditionalIncludeDirectories="..\include" + AdditionalIncludeDirectories="..\..\include,../../extra/yassl/include" PreprocessorDefinitions="MYSQL_INSTANCE_MANAGER;MYSQL_SERVER;_WINDOWS;CONSOLE" ExceptionHandling="FALSE" RuntimeLibrary="0" @@ -119,94 +119,172 @@ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> <File - RelativePath=".\buffer.cc"> + RelativePath=".\buffer.cpp"> </File> <File - RelativePath="..\sql\client.c"> + RelativePath="..\..\sql\client.c"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)/$(InputName)1.obj"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)/$(InputName)1.obj"/> + </FileConfiguration> </File> <File - RelativePath=".\command.cc"> + RelativePath=".\command.cpp"> </File> <File - RelativePath=".\commands.cc"> + RelativePath=".\commands.cpp"> </File> <File - RelativePath=".\factory.cc"> + RelativePath="..\..\libmysql\get_password.c"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)/$(InputName)1.obj"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)/$(InputName)1.obj"/> + </FileConfiguration> </File> <File - RelativePath="..\libmysql\get_password.c"> - </File> - <File - RelativePath=".\guardian.cc"> + RelativePath=".\guardian.cpp"> </File> <File RelativePath=".\IMService.cpp"> </File> <File - RelativePath=".\instance.cc"> - </File> - <File - RelativePath=".\instance_map.cc"> + RelativePath=".\instance.cpp"> </File> <File - RelativePath=".\instance_options.cc"> + RelativePath=".\instance_map.cpp"> </File> <File - RelativePath=".\listener.cc"> + RelativePath=".\instance_options.cpp"> </File> <File - RelativePath=".\log.cc"> + RelativePath=".\listener.cpp"> </File> <File - RelativePath=".\manager.cc"> + RelativePath=".\log.cpp"> </File> <File - RelativePath=".\messages.cc"> + RelativePath=".\manager.cpp"> </File> <File - RelativePath="..\sql\mini_client_errors.c"> + RelativePath=".\messages.cpp"> </File> <File - RelativePath=".\mysql_connection.cc"> + RelativePath="..\..\sql\mini_client_errors.c"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)/$(InputName)1.obj"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)/$(InputName)1.obj"/> + </FileConfiguration> </File> <File - RelativePath=".\mysqlmanager.cc"> + RelativePath=".\mysql_connection.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)/$(InputName)1.obj"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)/$(InputName)1.obj"/> + </FileConfiguration> </File> <File - RelativePath="..\sql\net_serv.cpp"> + RelativePath=".\mysqlmanager.cpp"> </File> <File - RelativePath=".\options.cc"> + RelativePath="..\..\sql\net_serv.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)/$(InputName)1.obj"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)/$(InputName)1.obj"/> + </FileConfiguration> </File> <File - RelativePath="..\sql\pack.c"> + RelativePath=".\options.cpp"> </File> <File - RelativePath=".\parse.cc"> + RelativePath="..\..\sql\pack.c"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)/$(InputName)1.obj"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)/$(InputName)1.obj"/> + </FileConfiguration> </File> <File - RelativePath=".\parse_output.cc"> + RelativePath=".\parse.cpp"> </File> <File - RelativePath="..\sql\password.c"> + RelativePath=".\parse_output.cpp"> </File> <File - RelativePath=".\priv.cc"> + RelativePath="..\..\sql\password.c"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)/$(InputName)1.obj"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)/$(InputName)1.obj"/> + </FileConfiguration> </File> <File - RelativePath=".\protocol.cc"> + RelativePath=".\priv.cpp"> </File> <File - RelativePath=".\service_funcs.cpp"> + RelativePath=".\protocol.cpp"> </File> <File - RelativePath="..\sql\sql_state.c"> + RelativePath="..\..\sql\sql_state.c"> </File> <File - RelativePath=".\thread_registry.cc"> + RelativePath=".\thread_registry.cpp"> </File> <File - RelativePath=".\user_map.cc"> + RelativePath=".\user_map.cpp"> </File> <File RelativePath=".\WindowsService.cpp"> diff --git a/server-tools/instance-manager/options.cc b/server-tools/instance-manager/options.cc index 36fe0a89dda..74ccade3a2c 100644 --- a/server-tools/instance-manager/options.cc +++ b/server-tools/instance-manager/options.cc @@ -33,6 +33,7 @@ #ifdef __WIN__ char Options::install_as_service; char Options::remove_service; +char Options::stand_alone; char windows_config_file[FN_REFLEN]; char default_password_file_name[FN_REFLEN]; char default_log_file_name[FN_REFLEN]; @@ -72,6 +73,7 @@ enum options { #else OPT_INSTALL_SERVICE, OPT_REMOVE_SERVICE, + OPT_STAND_ALONE, #endif OPT_MONITORING_INTERVAL, OPT_PORT, @@ -131,6 +133,9 @@ static struct my_option my_long_options[] = { "remove", OPT_REMOVE_SERVICE, "Remove system service.", (gptr *)&Options::remove_service, (gptr*) &Options::remove_service, 0, GET_BOOL, NO_ARG, 0, 0, 1, 0, 0, 0}, + { "standalone", OPT_STAND_ALONE, "Run the application in stand alone mode.", + (gptr *)&Options::stand_alone, (gptr*) &Options::stand_alone, + 0, GET_BOOL, NO_ARG, 0, 0, 1, 0, 0, 0}, #else { "run-as-service", OPT_RUN_AS_SERVICE, "Daemonize and start angel process.", (gptr *) &Options::run_as_service, diff --git a/server-tools/instance-manager/options.h b/server-tools/instance-manager/options.h index 5cc14e7ee7f..a5cd049decf 100644 --- a/server-tools/instance-manager/options.h +++ b/server-tools/instance-manager/options.h @@ -31,6 +31,7 @@ struct Options #ifdef __WIN__ static char install_as_service; static char remove_service; + static char stand_alone; #else static char run_as_service; /* handle_options doesn't support bool */ static const char *user; @@ -52,7 +53,7 @@ struct Options int load(int argc, char **argv); void cleanup(); #ifdef __WIN__ - int setup_windows_defaults(const char *progname); + int setup_windows_defaults(); #endif }; |