X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsocketengine_kqueue.cpp;h=50f6242e2914de027b92d613e5c2fd2ec970e54e;hb=9422f4157ccff0482cd70105ada3bd9325455eaa;hp=7fcdae2b6a58084056cb25268e9b2e1365fb253a;hpb=d769fef63f2f9ccd929aa51fda3c3da7ec389181;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/socketengine_kqueue.cpp b/src/socketengine_kqueue.cpp index 7fcdae2b6..50f6242e2 100644 --- a/src/socketengine_kqueue.cpp +++ b/src/socketengine_kqueue.cpp @@ -21,6 +21,16 @@ KQueueEngine::KQueueEngine(InspIRCd* Instance) : SocketEngine(Instance) { + this->RecoverFromFork(); +} + +void KQueueEngine::RecoverFromFork() +{ + /* + * The only bad thing about kqueue is that its fd cant survive a fork and is not inherited. + * BUM HATS. + * + */ EngineHandle = kqueue(); if (EngineHandle == -1) { @@ -28,14 +38,14 @@ KQueueEngine::KQueueEngine(InspIRCd* Instance) : SocketEngine(Instance) ServerInstance->Log(SPARSE,"ERROR: this is a fatal error, exiting now."); printf("ERROR: Could not initialize socket engine. Your kernel probably does not have the proper features."); printf("ERROR: this is a fatal error, exiting now."); - InspIRCd::Exit(EXIT_STATUS_SOCKETENGINE); + ServerInstance->Exit(EXIT_STATUS_SOCKETENGINE); } CurrentSetSize = 0; } KQueueEngine::~KQueueEngine() { - close(EngineHandle); + this->Close(EngineHandle); } bool KQueueEngine::AddFd(EventHandler* eh) @@ -51,15 +61,16 @@ bool KQueueEngine::AddFd(EventHandler* eh) if (ref[fd]) return false; - ref[fd] = eh; - struct kevent ke; EV_SET(&ke, fd, eh->Readable() ? EVFILT_READ : EVFILT_WRITE, EV_ADD, 0, 0, NULL); int i = kevent(EngineHandle, &ke, 1, 0, 0, NULL); if (i == -1) + { return false; + } + ref[fd] = eh; CurrentSetSize++; ServerInstance->Log(DEBUG,"New file descriptor: %d", fd);