From 73cd90e4f9eb24891ad70f15ef6ede5f077c88aa Mon Sep 17 00:00:00 2001
From: davidely <davidely@localhost>
Date: Mon, 07 May 2007 16:33:57 +0000
Subject: [PATCH] Updating Windows service related code and executables. This fixes a problem with stopping the server on Windows, and also adds a lot of debug logging to the service code, so we can track problems down in the future
---
opends/src/build-tools/windows/service.c | 321 +++++++++++++++++++++++++---------------------------
1 files changed, 155 insertions(+), 166 deletions(-)
diff --git a/opends/src/build-tools/windows/service.c b/opends/src/build-tools/windows/service.c
index fe1ca4c..6be0345 100644
--- a/opends/src/build-tools/windows/service.c
+++ b/opends/src/build-tools/windows/service.c
@@ -33,8 +33,6 @@
char *_instanceDir = NULL;
HANDLE _eventLog = NULL;
char * _logFile = NULL;
-BOOL DEBUG = FALSE;
-
// ----------------------------------------------------
// Register a service handler to the service control dispatcher.
@@ -58,6 +56,8 @@
{
ServiceReturnCode returnValue;
+ debug("Registering the service handler for '%s'", serviceName);
+
// register the service to the service control dispatcher (SCM)
*serviceStatusHandle = RegisterServiceCtrlHandler (
serviceName, (LPHANDLER_FUNCTION) serviceHandler
@@ -70,89 +70,13 @@
{
returnValue = SERVICE_RETURN_OK;
}
+
+ debug("registerServiceHandler returning '%d'", returnValue);
+
return returnValue;
} // registerServiceHandler
-// ---------------------------------------------------
-// Debug utility.
-// If the _eventLog is NULL and the DEBUG variable is TRUE write the message
-// in a log file.
-// ---------------------------------------------------
-void debug(char* msg)
-{
- if (DEBUG == TRUE)
- {
- /*
- if (_eventLog != NULL)
- {
- const char* args[1];
- args[0] = msg;
- // report the event
- ReportEvent(
- _eventLog, // event log handle
- EVENTLOG_INFORMATION_TYPE, // info, warning, error
- WIN_FACILITY_NAME_OPENDS, // unique category for OPENDS
- WIN_EVENT_ID_DEBUG,
- NULL, // no user security identifier
- 1, // number of args
- 0, // raw data size
- (const char**)args, // args
- NULL // no war data
- );
- }
- */
-
- // Log to the file
- FILE *fp;
- if (_logFile == NULL)
- {
- char path [MAX_PATH];
- if (_instanceDir != NULL)
- {
- int length = strlen(_instanceDir);
- if ((length > 0) && (_instanceDir[length - 1] == '\\'))
- {
- sprintf(path, "%slogs\\windows-service.out", _instanceDir);
- _logFile = strdup(path);
- }
- else
- {
- sprintf(path, "%s\\logs\\windows-service.out", _instanceDir);
- _logFile = strdup(path);
- }
- }
- else
- {
- char execName [MAX_PATH];
- char instanceDir [MAX_PATH];
- int length;
- GetModuleFileName (
- NULL,
- execName,
- MAX_PATH
- );
- length = strlen(execName) - strlen("lib\\opends_service.exe");
- if (length > 0)
- {
- strncpy(instanceDir, execName, length);
- instanceDir[length] = '\0';
- sprintf(path, "%slogs\\windows-service.out", instanceDir);
- _logFile = strdup(path);
- }
- }
- }
- if ((_logFile != NULL) && ((fp = fopen(_logFile, "a")) != NULL))
- {
- fprintf(fp, "%s\n", msg);
- fclose(fp);
- }
- else
- {
- fprintf(stdout, "Could not create log file.\n");
- }
- }
-}
// ---------------------------------------------------
// Reports a log event of a given type, id and arguments
@@ -223,11 +147,12 @@
);
if (scm == NULL)
{
- debug("scm is NULL.");
+ debugError("Failed to open the Service Control Manager. Last error = %d", GetLastError());
returnValue = SERVICE_RETURN_ERROR;
}
else
{
+ debug("Successfully opened the Service Control Manager.");
returnValue = SERVICE_RETURN_OK;
}
return returnValue;
@@ -262,6 +187,9 @@
// here because we already required it to figure out to get the service
// name based on the command to run associated with it.
char execName [MAX_PATH];
+
+ debug("Creating registry key for service '%s'.", serviceName);
+
GetModuleFileName (
NULL,
execName,
@@ -280,6 +208,7 @@
);
if (result == ERROR_SUCCESS)
{
+ debug("The registry key for service '%s' already exists.", serviceName);
alreadyRegistered = TRUE;
success = FALSE;
}
@@ -300,7 +229,7 @@
);
if (result != ERROR_SUCCESS)
{
- debug("RegCreateKeyEx failed.");
+ debugError("RegCreateKeyEx failed, result=%d.", result);
success = FALSE;
}
}
@@ -318,6 +247,7 @@
);
if (result != ERROR_SUCCESS)
{
+ debugError("RegSetValueEx('EventMessageFile') failed, result=%d.", result);
success = FALSE;
}
}
@@ -341,6 +271,7 @@
);
if (result != ERROR_SUCCESS)
{
+ debugError("RegSetValueEx('TypesSupported') failed, result=%d.", result);
success = FALSE;
}
}
@@ -359,6 +290,7 @@
);
if (result != ERROR_SUCCESS)
{
+ debugError("RegSetValueEx('CategoryMessageFile') failed, result=%d.", result);
success = FALSE;
}
}
@@ -376,6 +308,7 @@
);
if (result != ERROR_SUCCESS)
{
+ debugError("RegSetValueEx('CategoryCount') failed, result=%d.", result);
success = FALSE;
}
}
@@ -392,7 +325,7 @@
}
else
{
- debug("Could not create a registry key.");
+ debugError("Could not create a registry key.");
return FALSE;
}
} // createRegistryKey
@@ -406,7 +339,7 @@
// ---------------------------------------------------
BOOLEAN removeRegistryKey(char* serviceName)
{
- BOOL returnValue;
+ BOOL returnValue = FALSE;
// Create the event source subkey (or open it if it already exists)
char subkey [MAX_REGISTRY_KEY];
@@ -415,6 +348,8 @@
HKEY hkey = NULL;
+ debug("Removing registry key for service '%s'.", serviceName);
+
// Check whether the Registry Key is already created,
// If so don't create a new one.
sprintf (subkey, EVENT_LOG_KEY, serviceName);
@@ -427,6 +362,7 @@
);
if (result != ERROR_SUCCESS)
{
+ debug("The registry key for service '%s' does not exist, so we do not need to remove it.", serviceName);
// Assume that the registry key does not exist.
returnValue = TRUE;
}
@@ -437,6 +373,10 @@
{
returnValue = TRUE;
}
+ else
+ {
+ debugError("RegDeleteKey('%s') failed, result=%d.", subkey, result);
+ }
}
return returnValue;
@@ -453,6 +393,8 @@
// subkey under Eventlog registry key
char subkey [MAX_SERVICE_NAME];
+ debug("Registering the Event Log for service '%s'.", serviceName);
+
sprintf (subkey, serviceName);
eventLog = RegisterEventSource(
@@ -471,6 +413,7 @@
{
if (_eventLog != NULL)
{
+ debug("Deregistering the Event Log.");
DeregisterEventSource(_eventLog);
}
}
@@ -485,21 +428,26 @@
ServiceReturnCode returnValue;
char* relativePath = "\\locks\\server.lock";
char lockFile[MAX_PATH];
+ debug("Determining if the server is running.");
+
if (strlen(relativePath)+strlen(_instanceDir)+1 < MAX_PATH)
{
int fd;
sprintf(lockFile, "%s%s", _instanceDir, relativePath);
-
+ debug("When determining whether the server is running, the lock file name is '%s'.", lockFile);
+
fd = _open(lockFile, _O_RDWR);
if (fd != -1)
{
+ debug("Able to open the lock file '%s'.", lockFile);
returnValue = SERVICE_RETURN_OK;
// Test if there is a lock
/* Lock some bytes and read them. Then unlock. */
if(_locking(fd, LK_NBLCK, 1) != -1)
{
+ debug("Able to lock '%s', so the server is not running.", lockFile);
*running = FALSE;
_locking(fd, LK_UNLCK, 1);
}
@@ -507,20 +455,21 @@
{
if (errno == EACCES)
{
+ debug("Unable to lock '%s', so the server is running.", lockFile);
*running = TRUE;
}
else
{
*running = FALSE;
returnValue = SERVICE_RETURN_ERROR;
- debug("Unexpected error locking");
+ debugError("Unexpected error locking: %d", errno);
}
}
_close(fd);
}
else
{
- debug("Could not open lock file.");
+ debug("Could not open lock file '%s', which means the server is not running.", lockFile);
*running = FALSE;
returnValue = SERVICE_RETURN_ERROR;
}
@@ -531,6 +480,7 @@
*running = FALSE;
returnValue = SERVICE_RETURN_ERROR;
}
+
return returnValue;
} // isServerRunning
@@ -545,35 +495,40 @@
// init out params
char* relativePath = "\\bat\\start-ds.bat";
char command[COMMAND_SIZE];
+
+
+ debug("doStartApplication called.");
+
if (strlen(relativePath)+strlen(_instanceDir)+1 < COMMAND_SIZE)
{
sprintf(command, "\"%s%s\" --windowsNetStart", _instanceDir, relativePath);
// launch the command
+ debug("doStartApplication attempting to spawn '%s'", command);
if (spawn(command, FALSE) != -1)
{
// Try to see if server is really running
int nTries = 10;
BOOL running = FALSE;
- debug("doStartApplication: the spawn of the process worked.");
- debug("Command:");
- debug(command);
+ debug("doStartApplication: the spawn of the process worked. Command: '%s'", command);
// Wait to be able to launch the java process in order it to free the lock
// on the file.
+ debug("Sleeping for 3 seconds to allow the process to free the lock.");
Sleep(3000);
while ((nTries > 0) && !running)
{
+ nTries--;
if (isServerRunning(&running) != SERVICE_RETURN_OK)
{
break;
}
if (!running)
{
+ debug("Sleeping for 2 seconds to allow the process to free the lock. %d tries remaining.", nTries);
Sleep(2000);
}
- nTries--;
}
if (running)
{
@@ -695,10 +650,12 @@
{
// failed to get the path of the executable file
returnValue = SERVICE_RETURN_ERROR;
- debug("Could not get the path of the executable file.\n");
+ debug("Could not get the path of the executable file.");
}
else
{
+ debug("When determining the service bin path, the module file name is '%s'.", fileName);
+
if (result == MAX_PATH)
{
// buffer was too small, executable name is probably not valid
@@ -707,7 +664,7 @@
}
else
{
- if (strlen(fileName) + strlen(" start ") + strlen(_instanceDir)
+ if ((strlen(fileName) + strlen(" start ") + strlen(_instanceDir) + strlen("\"\""))
< COMMAND_SIZE)
{
sprintf(serviceBinPath, "%s start \"%s\"", fileName,
@@ -715,10 +672,11 @@
}
else
{
+ char * msg = "The name of the resulting windows service command is too long.\n";
+ debug(msg);
// buffer was too small, executable name is probably not valid
returnValue = SERVICE_RETURN_ERROR;
- fprintf(stdout,
- "The name of the resulting windows service command is too long.\n");
+ fprintf(stdout, msg);
}
}
}
@@ -745,6 +703,11 @@
// retrieve list of services
ServiceDescriptor* serviceList = NULL;
int nbServices = -1;
+
+ strcpy(serviceName, "");
+
+ debug("Attempting to get the service name assuming command to run is '%s'.", cmdToRun);
+
returnValue = getServiceList(&serviceList, &nbServices);
// go through the list of services and search for the service name
@@ -772,8 +735,7 @@
}
else
{
- debug("The service name found is too long:");
- debug(curService.serviceName);
+ debug("The service name found is too long: '%s'", curService.serviceName);
}
break;
}
@@ -786,6 +748,9 @@
{
debug("getServiceName: could not get service list.");
}
+
+ debug("The service name was found to be '%s'.", serviceName);
+
return returnValue;
} // getServiceName
@@ -817,6 +782,8 @@
{
ServiceReturnCode returnValue;
+
+
// elaborate service type:
// SERVICE_WIN32_OWN_PROCESS means this is not a driver and there is
// only one service in the process
@@ -832,8 +799,14 @@
DWORD controls;
SERVICE_STATUS serviceStatus;
BOOL success;
+
+ debug("Updating the service status. statusToSet=%d win32ExitCode=%d serviceExitCode=%d checkPoint=%d waitHint=%d",
+ statusToSet, win32ExitCode, serviceExitCode,
+ checkPoint, waitHint);
+
if (statusToSet == SERVICE_START_PENDING)
{
+ debug("Service start pending.");
// do not accept any command when the service is starting up...
controls = SERVICE_ACCEPT_NONE;
}
@@ -864,6 +837,7 @@
if (!success)
{
+ debugError("Failed to set the service status. Last error = %d.", GetLastError());
returnValue = SERVICE_RETURN_ERROR;
}
else
@@ -897,6 +871,8 @@
DWORD checkPoint = CHECKPOINT_FIRST_VALUE;
SERVICE_STATUS_HANDLE serviceStatusHandle;
+ // __debugbreak();
+
debug("serviceMain called.");
code = createServiceBinPath(cmdToRun);
@@ -997,6 +973,7 @@
break;
default:
+ debugError("doApplication() failed");
code = SERVICE_RETURN_ERROR;
_serviceCurStatus = SERVICE_STOPPED;
updateServiceStatus (
@@ -1027,7 +1004,9 @@
// if all is ok wait for the application to die before we leave
if (code == SERVICE_RETURN_OK)
{
+ debug("Waiting indefinitely for the application to exit.");
WaitForSingleObject (_terminationEvent, INFINITE);
+ debug("The application has exited.");
}
// update the service status to STOPPED if it's not already done
@@ -1044,6 +1023,7 @@
_serviceStatusHandle
);
}
+ debug("serviceMain() returning.");
} // serviceMain
@@ -1054,6 +1034,7 @@
// ----------------------------------------------------
void doTerminateService(HANDLE terminationEvent)
{
+ debug("Faking a service termination so serviceMain can return.");
SetEvent(terminationEvent);
return;
@@ -1071,17 +1052,17 @@
ServiceReturnCode code;
DWORD checkpoint;
BOOL running;
- debug("serviceHandler called.");
+ debug("serviceHandler called with controlCode=%d.", controlCode);
switch (controlCode)
{
case SERVICE_CONTROL_SHUTDOWN:
// If system is shuting down then stop the service
// -> no break here
- debug("serviceHandler: Shutdown.");
+ debug("serviceHandler: shutdown");
case SERVICE_CONTROL_STOP:
{
// update service status to STOP_PENDING
- debug("serviceHandler: Stop.");
+ debug("serviceHandler: stop");
_serviceCurStatus = SERVICE_STOP_PENDING;
checkpoint = CHECKPOINT_FIRST_VALUE;
updateServiceStatus (
@@ -1123,6 +1104,7 @@
{
WORD argCount = 1;
const char *argc[] = {_instanceDir};
+ debug("The server could not be stopped.");
// We could not stop the server
reportLogEvent(
EVENTLOG_ERROR_TYPE,
@@ -1222,7 +1204,11 @@
);
}
- if (myService != NULL)
+ if (myService == NULL)
+ {
+ debugError("Failed to open the service '%s'.", serviceName);
+ }
+ else
{
while (!getConfigOk)
{
@@ -1240,7 +1226,7 @@
DWORD errCode = GetLastError();
if (errCode == ERROR_INSUFFICIENT_BUFFER)
{
- // buffer nor big enough...
+ // buffer not big enough...
configSize += bytesNeeded;
serviceConfig =
(LPQUERY_SERVICE_CONFIG)realloc(serviceConfig, configSize);
@@ -1248,12 +1234,7 @@
}
else
{
- char msg[200];
- sprintf(msg,
- "getBinaryPath: error calling QueryServiceConfig. Code [%d]",
- errCode);
- // error
- debug(msg);
+ debug("getBinaryPath: error calling QueryServiceConfig. Code [%d]", errCode);
break;
}
}
@@ -1266,12 +1247,7 @@
}
else
{
- debug(
- "getBinaryPath: the length of the binary path name is too big.");
- debug("serviceName:");
- debug(serviceName);
- debug("binary path:");
- debug(serviceConfig->lpBinaryPathName);
+ debug("getBinaryPath: the length of the binary path name is too big. serviceName='%s', binaryPath='%s'", serviceName, serviceConfig->lpBinaryPathName);
}
}
}
@@ -1329,11 +1305,7 @@
DWORD lastError = GetLastError();
if (lastError != ERROR_MORE_DATA)
{
- char msg[200];
- sprintf(msg, "getServiceList: generic error. Code [%d]",
- lastError);
- // error
- debug(msg);
+ debug("getServiceList: generic error. Code [%d]", lastError);
returnValue = SERVICE_RETURN_ERROR;
}
else
@@ -1359,10 +1331,8 @@
DWORD lastError = GetLastError();
if (lastError != ERROR_MORE_DATA)
{
- char msg[200];
returnValue = SERVICE_RETURN_ERROR;
- sprintf(msg, "getServiceList: second try generic error. Code [%d]",
- lastError);
+ debug("getServiceList: second try generic error. Code [%d]", lastError);
}
else
{
@@ -1406,18 +1376,17 @@
l = (ServiceDescriptor*)calloc(sizeof(ServiceDescriptor), aux);
for (i = 0; i < aux; i++)
{
- l[i].serviceName = strdup(curService->lpServiceName);
- l[i].displayName = strdup(curService->lpDisplayName);
+ l[i].serviceName = _strdup(curService->lpServiceName);
+ l[i].displayName = _strdup(curService->lpDisplayName);
if (getBinaryPathName(scm, l[i].serviceName, binPath) ==
SERVICE_RETURN_OK)
{
- l[i].cmdToRun = strdup(binPath);
+ l[i].cmdToRun = _strdup(binPath);
}
- else
+ else
{
- debug("Error getting binary path name of service:");
- debug(l[i].serviceName);
+ debug("Error getting binary path name of service: %s", l[i].serviceName);
}
curService++;
}
@@ -1457,6 +1426,8 @@
int nbServices = -1;
int i;
+ debug("Determining if service name '%s' is in use.", serviceName);
+
// go through the list of services and search for the service name
if (getServiceList(&serviceList, &nbServices) == SERVICE_RETURN_OK)
{
@@ -1477,6 +1448,7 @@
if (strcmp (serviceName, curService.serviceName) == 0)
{
// found the service!
+ debug("The service name '%s' is in use.", serviceName);
returnValue = SERVICE_IN_USE;
}
}
@@ -1486,6 +1458,7 @@
}
else
{
+ debugError("Could not determine if the service name '%s' is in use because listing the services failed.", serviceName);
returnValue = SERVICE_RETURN_ERROR;
}
return returnValue;
@@ -1509,6 +1482,7 @@
int i = 1;
BOOL ended = FALSE;
ServiceReturnCode nameInUseResult;
+ strcpy(serviceName, "");
while (!ended)
{
if (i == 1)
@@ -1540,6 +1514,9 @@
}
}
+ debug("createServiceName returning serviceName='%s' and returnValue=%d",
+ serviceName, returnValue);
+
return returnValue;
} // createServiceName
@@ -1586,6 +1563,7 @@
if (returnValue == SERVICE_RETURN_OK)
{
+ debug("Creating the service '%s'.", serviceName);
myService = CreateService(
scm,
serviceName, // name of service
@@ -1607,6 +1585,7 @@
if ((returnValue == SERVICE_RETURN_OK) && (myService == NULL))
{
DWORD errCode = GetLastError();
+ debugError("Failed to create the service '%s'. Last error = %d.", serviceName, errCode);
if (errCode == ERROR_DUPLICATE_SERVICE_NAME)
{
returnValue = DUPLICATED_SERVICE_NAME;
@@ -1635,6 +1614,7 @@
if (!success)
{
+ debugError("Failed to add a description to the service '%s'. Last error = %d.", serviceName, GetLastError());
returnValue = SERVICE_RETURN_ERROR;
}
}
@@ -1656,6 +1636,8 @@
free (serviceName);
}
+ debug("createServiceInScm returning %d.", returnValue);
+
return returnValue;
} // createServiceInScm
@@ -1675,6 +1657,8 @@
SC_HANDLE myService = NULL;
SERVICE_STATUS serviceStatus;
+ debug("Removing service '%s' from the Service Control Manager.", serviceName);
+
returnValue = openScm(GENERIC_WRITE, &scm);
// open the service
@@ -1687,6 +1671,7 @@
);
if (myService == NULL)
{
+ debugError("Failed to open the service '%s'. Last error = %d", serviceName, GetLastError());
returnValue = SERVICE_RETURN_ERROR;
}
}
@@ -1699,6 +1684,7 @@
);
if (!success)
{
+ debugError("Failed to query the status for service '%s'. Last error = %d", serviceName, GetLastError());
returnValue = SERVICE_RETURN_ERROR;
}
}
@@ -1708,7 +1694,9 @@
{
if (serviceStatus.dwCurrentState != SERVICE_STOPPED)
{
- BOOL success = ControlService (
+ BOOL success;
+ debug("Attempting to stop the service '%s'.", serviceName);
+ success = ControlService (
myService,
SERVICE_CONTROL_STOP,
&serviceStatus
@@ -1716,6 +1704,7 @@
if (!success)
{
DWORD errCode = GetLastError();
+ debugError("Failed to stop the service '%s'. Last error = %d.", serviceName, errCode);
if (errCode == ERROR_SERVICE_MARKED_FOR_DELETE)
{
returnValue = SERVICE_MARKED_FOR_DELETION;
@@ -1735,11 +1724,13 @@
// remove the service
if (returnValue == SERVICE_RETURN_OK)
{
- BOOL success = DeleteService (myService);
+ BOOL success;
+ debug("Deleting the service '%s'.");
+ success = DeleteService (myService);
if (!success)
{
-
DWORD errCode = GetLastError();
+ debugError("Failed to delete the service '%s'. Last error = %d.", serviceName, errCode);
if (errCode == ERROR_SERVICE_MARKED_FOR_DELETE)
{
returnValue = SERVICE_MARKED_FOR_DELETION;
@@ -1784,7 +1775,7 @@
char cmdToRun[COMMAND_SIZE];
ServiceReturnCode code;
- debug("Creating service.");
+ debug("Creating service displayName='%s' description='%s'.", displayName, description);
code = createServiceBinPath(cmdToRun);
if (code == SERVICE_RETURN_OK)
@@ -1793,6 +1784,7 @@
code = getServiceName(cmdToRun, serviceName);
if (code == SERVICE_RETURN_OK)
{
+ debug("Service '%s' already exists.", displayName);
// There is a valid serviceName for the command to run, so
// OpenDS is registered as a service.
code = SERVICE_ALREADY_EXISTS;
@@ -1800,6 +1792,7 @@
}
else
{
+ debug("Could not find service '%s', so creating it now.", displayName);
// We could not find a serviceName for the command to run, so
// try to create the service.
code = createServiceInScm(displayName, description, cmdToRun);
@@ -1812,7 +1805,7 @@
}
else
{
- debug("Could not get a service name for command to run");
+ debug("Could not get a service name for command to run.");
}
}
}
@@ -1859,24 +1852,27 @@
char serviceName[MAX_SERVICE_NAME];
ServiceReturnCode code;
+ strcpy(serviceName, "");
debug("Getting service state.");
code = createServiceBinPath(cmdToRun);
+ debug("Created the service bin path. code=%d. cmdToRun='%s'.", code, cmdToRun);
if (code == SERVICE_RETURN_OK)
{
code = getServiceName(cmdToRun, serviceName);
+
if (code == SERVICE_RETURN_OK)
{
// There is a valid serviceName for the command to run, so
// OpenDS is registered as a service.
fprintf(stdout, serviceName);
returnCode = 0;
- debug("Service is enabled.");
+ debug("Service '%s' is enabled.", serviceName);
}
else
{
returnCode = 1;
- debug("Service is disabled.");
+ debug("Service '%s' is disabled enabled.", serviceName);
}
}
else
@@ -1950,6 +1946,7 @@
char serviceName[MAX_SERVICE_NAME];
ServiceReturnCode code;
+ debug("removeService()");
code = createServiceBinPath(cmdToRun);
if (code == SERVICE_RETURN_OK)
@@ -1969,6 +1966,7 @@
returnCode = 2;
}
+ debug("removeService() returning %d.", returnCode);
return returnCode;
} // removeService
@@ -1987,6 +1985,7 @@
char cmdToRun[COMMAND_SIZE];
ServiceReturnCode code;
+ debug("startService()");
code = createServiceBinPath(cmdToRun);
if (code == SERVICE_RETURN_OK)
@@ -2042,6 +2041,7 @@
WIN_EVENT_ID_SERVER_START_FAILED,
argCount, argc
);
+ debugError("For instance dir '%s', %s", argc[0], argc[1]);
}
deregisterEventLog();
}
@@ -2063,29 +2063,22 @@
} // startService
-// ---------------------------------------------------------------
-// Function called to know if the --debug option was passed
-// when calling this executable or not. The DEBUG variable is
-// updated accordingly.
-// ---------------------------------------------------------------
-
-void updateDebugFlag(char* argv[], int argc, int startIndex)
-{
- int i;
- DEBUG = FALSE;
- for (i=startIndex; (i<argc) && !DEBUG; i++)
- {
- if (strcmp(argv[i], "--debug") == 0)
- {
- DEBUG = TRUE;
- }
- }
-}
int main(int argc, char* argv[])
{
char* subcommand;
int returnCode = 0;
+ int i;
+
+ updateDebugFlag(argv, argc);
+
+ debug("main called.");
+ for (i = 0; i < argc; i++) {
+ debug(" argv[%d] = '%s'", i, argv[i]);
+ }
+
+ // __debugbreak();
+
if (argc <= 1)
{
fprintf(stdout,
@@ -2105,8 +2098,7 @@
}
else
{
- _instanceDir = strdup(argv[2]);
- updateDebugFlag(argv, argc, 5);
+ _instanceDir = _strdup(argv[2]);
returnCode = createService(argv[3], argv[4]);
free(_instanceDir);
}
@@ -2121,8 +2113,7 @@
}
else
{
- _instanceDir = strdup(argv[2]);
- updateDebugFlag(argv, argc, 3);
+ _instanceDir = _strdup(argv[2]);
returnCode = serviceState();
free(_instanceDir);
}
@@ -2137,8 +2128,7 @@
}
else
{
- _instanceDir = strdup(argv[2]);
- updateDebugFlag(argv, argc, 3);
+ _instanceDir = _strdup(argv[2]);
returnCode = removeService();
free(_instanceDir);
}
@@ -2153,8 +2143,7 @@
}
else
{
- _instanceDir = strdup(argv[2]);
- DEBUG = TRUE;
+ _instanceDir = _strdup(argv[2]);
returnCode = startService();
free(_instanceDir);
}
@@ -2171,8 +2160,7 @@
{
BOOL running;
ServiceReturnCode code;
- _instanceDir = strdup(argv[2]);
- updateDebugFlag(argv, argc, 3);
+ _instanceDir = _strdup(argv[2]);
code = isServerRunning(&running);
if (code == SERVICE_RETURN_OK)
{
@@ -2196,8 +2184,7 @@
}
else
{
- char* serviceName = strdup(argv[2]);
- updateDebugFlag(argv, argc, 3);
+ char* serviceName = _strdup(argv[2]);
returnCode = removeServiceWithServiceName(serviceName);
free(serviceName);
}
@@ -2210,6 +2197,8 @@
}
}
+ debug("main returning %d.", returnCode);
+
return returnCode;
} // main
--
Gitblit v1.10.0