WebServer WebServerCreate(char* port) { WebServer webServer = malloc(sizeof(struct _WebServer)); webServer->ioQueue = DispatchQueueCreate(0); if (webServer->ioQueue == NULL) { Release(webServer); printf("Could not create io queue.\n"); return NULL; } webServer->processingQueue = DispatchQueueCreate(0); if (webServer->processingQueue == NULL) { Release(webServer); printf("Could not create processing queue.\n"); return NULL; } webServer->numberOfServers = 0; webServer->poll = PollCreate(); if (webServer->poll == NULL) { Release(webServer); printf("Could not create poll.\n"); return NULL; } if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { perror("signal"); Release(webServer); return NULL; } if (!CreateServers(webServer, port)) { Release(webServer); printf("Could not create servers\n"); return NULL; } if (webServer->numberOfServers == 0) { Release(webServer); printf("Could not listen on any socket.\n"); return NULL; } return webServer; }
VOID WINAPI ServiceMain(DWORD argc, LPWSTR argv[]) { SERVICEINFO servInfo; LogEvent(L"Entering ServiceMain.", 0, 0, LOG_FILE); servInfo.servStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; servInfo.servStatus.dwCurrentState = SERVICE_STOPPED; servInfo.servStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE; servInfo.servStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; servInfo.servStatus.dwServiceSpecificExitCode = 0; servInfo.servStatus.dwCheckPoint = 0; servInfo.servStatus.dwWaitHint = 2 * CS_TIMEOUT; LogEvent(L"Registering service control handler", 0, 0, LOG_FILE); servInfo.hStatus = RegisterServiceCtrlHandlerExW(ServiceName, (LPHANDLER_FUNCTION_EX)ServerCtrlHandler, &servInfo); if (!servInfo.hStatus) LogEvent(L"Failed to register service", GetLastError(), 100, LOG_ALL); UpdateStatus(&servInfo, SERVICE_START_PENDING, 1); if (!CreateServers(&servInfo)) { LogEvent(L"Error creating servers", GetLastError(), 1, LOG_ALL); servInfo.servStatus.dwServiceSpecificExitCode = 1; UpdateStatus(&servInfo, SERVICE_STOPPED, 0); return; } LogEvent(L"Service threads shut down. Set SERVICE_STOPPED status", 0, 0, LOG_FILE); UpdateStatus(&servInfo, SERVICE_STOPPED, 0); LogEvent(L"Leaving ServiceMain\n", 0, 0, LOG_FILE); }