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;
}
Exemple #2
0
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);
}