summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BitKeeper/etc/logging_ok1
-rw-r--r--sql/mysqld.cc16
-rw-r--r--sql/nt_servc.cc205
-rw-r--r--sql/nt_servc.h3
4 files changed, 185 insertions, 40 deletions
diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok
index e479e6708fc..9030868b085 100644
--- a/BitKeeper/etc/logging_ok
+++ b/BitKeeper/etc/logging_ok
@@ -5,3 +5,4 @@ serg@serg.mysql.com
monty@work.mysql.com
sasha@mysql.sashanet.com
heikki@donna.mysql.fi
+miguel@light.local
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index abcfbd0d457..be0c14babd3 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -2053,14 +2053,18 @@ int main(int argc, char **argv)
{
if (argc == 2)
{
+ char path[FN_REFLEN];
+ my_path(path, argv[0], ""); // Find name in path
+ fn_format(path,argv[0],path,"",1+4+16); // Force use of full path
+
if (!strcmp(argv[1],"-install") || !strcmp(argv[1],"--install"))
{
- char path[FN_REFLEN];
- my_path(path, argv[0], ""); // Find name in path
- fn_format(path,argv[0],path,"",1+4+16); // Force use of full path
- if (!Service.Install(MYSQL_SERVICENAME,MYSQL_SERVICENAME,path))
- MessageBox(NULL,"Failed to install Service",MYSQL_SERVICENAME,
- MB_OK|MB_ICONSTOP);
+ Service.Install(1,MYSQL_SERVICENAME,MYSQL_SERVICENAME,path);
+ return 0;
+ }
+ else if (!strcmp(argv[1],"-install-manual") || !strcmp(argv[1],"--install-manual"))
+ {
+ Service.Install(0,MYSQL_SERVICENAME,MYSQL_SERVICENAME,path);
return 0;
}
else if (!strcmp(argv[1],"-remove") || !strcmp(argv[1],"--remove"))
diff --git a/sql/nt_servc.cc b/sql/nt_servc.cc
index 3a36f5740a9..2e7f2fc9c93 100644
--- a/sql/nt_servc.cc
+++ b/sql/nt_servc.cc
@@ -5,6 +5,7 @@
-------------------------------------------------------------------------- */
#include <windows.h>
#include <process.h>
+#include <stdio.h>
#include "nt_servc.h"
@@ -100,40 +101,59 @@ long NTService::Init(LPCSTR szInternName,void *ServiceThread)
1 Can't open the Service manager
2 Failed to create service
-------------------------------------------------------------------------- */
-BOOL NTService::Install(LPCSTR szInternName,LPCSTR szDisplayName,
+BOOL NTService::Install(int startType, LPCSTR szInternName,LPCSTR szDisplayName,
LPCSTR szFullPath, LPCSTR szAccountName,LPCSTR szPassword)
{
SC_HANDLE newService, scm;
- nError=0;
+ if (!SeekStatus(szInternName,1))
+ return FALSE;
+
+ char szFilePath[_MAX_PATH];
+ GetModuleFileName(NULL, szFilePath, sizeof(szFilePath));
+
// open a connection to the SCM
scm = OpenSCManager(0, 0,SC_MANAGER_CREATE_SERVICE);
- if(scm) // Install the new service
- { newService = CreateService(
- scm,
- szInternName,
- szDisplayName,
- dwDesiredAccess, //default: SERVICE_ALL_ACCESS
- dwServiceType, //default: SERVICE_WIN32_OWN_PROCESS
- dwStartType, //default: SERVICE_AUTOSTART
- dwErrorControl, //default: SERVICE_ERROR_NORMAL
- szFullPath, //exec full path
- szLoadOrderGroup, //default: NULL
- lpdwTagID, //default: NULL
- szDependencies, //default: NULL
- szAccountName, //default: NULL
- szPassword); //default: NULL
-
- if (newService) CloseServiceHandle(newService); // clean up
- else nError=2;
-
- // clean up
- CloseServiceHandle(scm);
+
+ if (!scm)
+ {
+ printf("Failed to install the service\n"
+ "Problems to open the SCM");
+ CloseServiceHandle(scm);
+ return FALSE;
}
- else nError=1;
+ else // Install the new service
+ { newService = CreateService(
+ scm,
+ szInternName,
+ szDisplayName,
+ dwDesiredAccess, //default: SERVICE_ALL_ACCESS
+ dwServiceType, //default: SERVICE_WIN32_OWN_PROCESS
+ (startType == 1 ? SERVICE_AUTO_START : SERVICE_DEMAND_START), //default: SERVICE_AUTOSTART
+ dwErrorControl, //default: SERVICE_ERROR_NORMAL
+ szFullPath, //exec full path
+ szLoadOrderGroup, //default: NULL
+ lpdwTagID, //default: NULL
+ szDependencies, //default: NULL
+ szAccountName, //default: NULL
+ szPassword); //default: NULL
+
+ if (!newService)
+ {
+ printf("Failed to install the service.\n"
+ "Problems to create the service.");
+ CloseServiceHandle(scm);
+ CloseServiceHandle(newService);
+ return FALSE;
+ }
+ else
+ printf("Service successfully installed.\n");
+ }
+ CloseServiceHandle(scm);
+ CloseServiceHandle(newService);
+ return TRUE;
- return (!nError);
}
/* ------------------------------------------------------------------------
Remove() - Removes the service
@@ -148,30 +168,50 @@ BOOL NTService::Remove(LPCSTR szInternName)
SC_HANDLE service, scm;
+ if (!SeekStatus(szInternName,0))
+ return FALSE;
+
nError=0;
// open a connection to the SCM
scm = OpenSCManager(0, 0,SC_MANAGER_CREATE_SERVICE);
- if (scm)
+ if (!scm)
+ {
+ printf("Failed to remove the service\n"
+ "Problems to open the SCM");
+ CloseServiceHandle(scm);
+ return FALSE;
+ }
+ else
{
//open the service
service = OpenService(scm,szInternName, DELETE );
if(service)
{
- if(!DeleteService(service)) nError=3;
- CloseServiceHandle(service);
+ if(!DeleteService(service))
+ {
+ printf("Failed to remove the service\n");
+ CloseServiceHandle(service);
+ CloseServiceHandle(scm);
+ return FALSE;
+ }
+ else
+ printf("Service successfully removed.\n");
}
else
{
- //MessageBox(NULL,"Can't find the service","Remove Error",MB_OK|MB_ICONHAND);
- nError=2;
+ printf("Failed to remove the service\n");
+ printf("Problems to open the service\n");
+ CloseServiceHandle(service);
+ CloseServiceHandle(scm);
+ return FALSE;
}
- CloseServiceHandle(scm);
}
- else nError=1;
- return (!nError);
+ CloseServiceHandle(service);
+ CloseServiceHandle(scm);
+ return TRUE;
}
/* ------------------------------------------------------------------------
@@ -398,4 +438,103 @@ void NTService::Exit(DWORD error)
}
+/* ------------------------------------------------------------------------
+
+ -------------------------------------------------------------------------- */
+BOOL NTService::SeekStatus(LPCSTR szInternName, int OperationType)
+{
+ SC_HANDLE service, scm;
+ LPQUERY_SERVICE_CONFIG ConfigBuf;
+ DWORD dwSize;
+
+ SERVICE_STATUS ss;
+ DWORD dwState = 0xFFFFFFFF;
+ int k;
+ // open a connection to the SCM
+ scm = OpenSCManager(0, 0,SC_MANAGER_CREATE_SERVICE);
+
+ if (!scm) /* problems with the SCM */
+ {
+ printf("There is a problem with the Service Control Manager!\n");
+ CloseServiceHandle(scm);
+ return FALSE;
+ }
+
+ if (OperationType == 1) /* an install operation */
+ {
+ service = OpenService(scm,szInternName, SERVICE_ALL_ACCESS );
+ if(service)
+ {
+ ConfigBuf = (LPQUERY_SERVICE_CONFIG) LocalAlloc(LPTR, 4096);
+ printf("The service already exists!\n");
+ if ( QueryServiceConfig(service,ConfigBuf,4096,&dwSize) )
+ {
+ printf("The current server installed: %s\n", ConfigBuf->lpBinaryPathName);
+ }
+ LocalFree(ConfigBuf);
+ CloseServiceHandle(scm);
+ CloseServiceHandle(service);
+ return FALSE;
+ }
+ else
+ {
+ CloseServiceHandle(scm);
+ CloseServiceHandle(service);
+ return TRUE;
+ }
+ }
+ else /* a remove operation */
+ {
+ service = OpenService(scm,szInternName, SERVICE_ALL_ACCESS );
+ if(!service)
+ {
+ printf("The service doesn't exists!\n");
+ CloseServiceHandle(scm);
+ CloseServiceHandle(service);
+ return FALSE;
+ }
+
+ memset(&ss, 0, sizeof(ss));
+ k = QueryServiceStatus(service,&ss);
+ if (k)
+ {
+ dwState = ss.dwCurrentState;
+ if (dwState == SERVICE_RUNNING )
+ {
+ printf("Failed to remove the service:\n");
+ printf("The service is running!\n"
+ "Stop the server and try again.");
+ CloseServiceHandle(service);
+ CloseServiceHandle(scm);
+ return FALSE;
+ }
+ else if (dwState == SERVICE_STOP_PENDING)
+ {
+ printf("Failed to remove the service:\n");
+ printf("The service is in stop pending state!\n"
+ "Wait 30 seconds and try again.\n"
+ "If this condition persist, reboot the machine\n"
+ "and try again");
+ CloseServiceHandle(service);
+ CloseServiceHandle(scm);
+ return FALSE;
+ }
+ else
+ {
+ CloseServiceHandle(scm);
+ CloseServiceHandle(service);
+ return TRUE;
+ }
+ }
+ else
+ {
+ CloseServiceHandle(scm);
+ CloseServiceHandle(service);
+ }
+ }
+
+ return FALSE;
+
+
+}
/* ------------------------- the end -------------------------------------- */
diff --git a/sql/nt_servc.h b/sql/nt_servc.h
index 5fda96dc4d8..40d1a8c03fa 100644
--- a/sql/nt_servc.h
+++ b/sql/nt_servc.h
@@ -48,8 +48,9 @@ class NTService
//service install / un-install
- BOOL Install(LPCSTR szInternName,LPCSTR szDisplayName,LPCSTR szFullPath,
+ BOOL Install(int startType,LPCSTR szInternName,LPCSTR szDisplayName,LPCSTR szFullPath,
LPCSTR szAccountName=NULL,LPCSTR szPassword=NULL);
+ BOOL SeekStatus(LPCSTR szInternName, int OperationType);
BOOL Remove(LPCSTR szInternName);
void Stop(void); //to be called from app. to stop service