X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=win%2Finspircd_win32wrapper.cpp;h=c42e8bd640148fabbe15def8668668b8469c6f7a;hb=af789aefbbdfa76ebe1a5e3929589213c15aaa44;hp=ee1d54c25dc99993bf29e3ff25e71fdf8d352654;hpb=27d4ea0d970ed95cf21acedf72a08611ea082d72;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/win/inspircd_win32wrapper.cpp b/win/inspircd_win32wrapper.cpp index ee1d54c25..c42e8bd64 100644 --- a/win/inspircd_win32wrapper.cpp +++ b/win/inspircd_win32wrapper.cpp @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * InspIRCd: (C) 2002-2008 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see @@ -13,15 +13,19 @@ #include "inspircd_win32wrapper.h" #include "inspircd.h" +#include "configreader.h" #include #include #include +#pragma comment(lib, "winmm.lib") using namespace std; #ifndef INADDR_NONE #define INADDR_NONE 0xffffffff #endif +#include + /* This MUST remain static and delcared outside the class, so that WriteProcessMemory can reference it properly */ static DWORD owner_processid = 0; @@ -365,7 +369,7 @@ int getopt_long_only(int ___argc, char *const *___argv, const char *__shortopts, #define IPC_MESSAGE_DIE 2 #define IPC_MESSAGE_RESTART 3 -void InitIPC() +IPC::IPC(InspIRCd* Srv) : Instance(Srv) { static DWORD buflen = 1024; static const char * pipename = "\\\\.\\mailslot\\Inspircd"; @@ -374,7 +378,7 @@ void InitIPC() printf("IPC Pipe could not be created. Are you sure you didn't start InspIRCd twice?\n"); } -void CheckIPC(InspIRCd * Instance) +void IPC::Check() { if (hIPCPipe == INVALID_HANDLE_VALUE) return; @@ -393,7 +397,7 @@ void CheckIPC(InspIRCd * Instance) switch (action) { case IPC_MESSAGE_REHASH: - Instance->Rehash(0); + Instance->Rehash(); break; case IPC_MESSAGE_DIE: @@ -406,7 +410,7 @@ void CheckIPC(InspIRCd * Instance) } } -void CloseIPC() +IPC::~IPC() { CloseHandle(hIPCPipe); } @@ -514,7 +518,16 @@ void ClearConsole() return; } -DWORD WindowsForkStart(InspIRCd * Instance) +/* Many inspircd classes contain function pointers/functors which can be changed to point at platform specific implementations + * of code. This function repoints these pointers and functors so that calls are windows specific. + */ +void ChangeWindowsSpecificPointers(InspIRCd* Instance) +{ + Instance->Log(DEBUG,"Changing to windows specific pointer and functor set"); + Instance->Config->DNSServerValidator = &ValidateWindowsDnsServer; +} + +DWORD WindowsForkStart(InspIRCd* Instance) { /* Windows implementation of fork() :P */ if (owner_processid) @@ -613,4 +626,36 @@ void WindowsForkKillOwner(InspIRCd * Instance) CloseHandle(hProcess); } +bool ValidateWindowsDnsServer(ServerConfig* conf, const char* tag, const char* value, ValueItem &data) +{ + if (!*(data.GetString())) + { + std::string nameserver; + conf->GetInstance()->Log(DEFAULT,"WARNING: not defined, attempting to find working server in the registry..."); + nameserver = FindNameServerWin(); + /* Windows stacks multiple nameservers in one registry key, seperated by commas. + * Spotted by Cataclysm. + */ + if (nameserver.find(',') != std::string::npos) + nameserver = nameserver.substr(0, nameserver.find(',')); + /* Just to be FUCKING AKWARD, windows fister... err i mean vista... + * seperates the nameservers with spaces instead. + */ + if (nameserver.find(' ') != std::string::npos) + nameserver = nameserver.substr(0, nameserver.find(' ')); + data.Set(nameserver.c_str()); + conf->GetInstance()->Log(DEFAULT," set to '%s' as first active resolver in registry.", nameserver.c_str()); + } + return true; +} + +int gettimeofday(struct timeval * tv, void * tz) +{ + if(tv == NULL) + return -1; + DWORD mstime = timeGetTime(); + tv->tv_sec = time(NULL); + tv->tv_usec = (mstime - (tv->tv_sec * 1000)) * 1000; + return 0; +}