-extern char optarg[514];\r
-int getopt_long_only (int ___argc, char *const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind);\r
-\r
-/* Accept Handlers */\r
-int CoreExport __accept_socket(SOCKET s, sockaddr * addr, int * addrlen, void * acceptevent);\r
-int CoreExport __getsockname(SOCKET s, sockaddr * name, int * namelen, void * acceptevent);\r
-\r
-/* Module Loading */\r
-#define dlopen(path, state) (void*)LoadLibrary(path)\r
-#define dlsym(handle, export) (void*)GetProcAddress((HMODULE)handle, export)\r
-#define dlclose(handle) FreeLibrary((HMODULE)handle)\r
-const char * dlerror();\r
-\r
-/* Unix-style directory searching functions */\r
-#define chmod(filename, mode) \r
-struct dirent\r
-{\r
- char d_name[MAX_PATH];\r
-};\r
-\r
-struct DIR\r
-{\r
- dirent dirent_pointer;\r
- HANDLE find_handle;\r
- WIN32_FIND_DATA find_data;\r
- bool first;\r
-};\r
-\r
-CoreExport DIR * opendir(const char * path);\r
-CoreExport dirent * readdir(DIR * handle);\r
-CoreExport void closedir(DIR * handle);\r
-\r
-/* Disable these stupid warnings.. */\r
-#pragma warning(disable:4800)\r
-#pragma warning(disable:4251)\r
-#pragma warning(disable:4275)\r
-#pragma warning(disable:4996)\r
-#pragma warning(disable:4244) // warning C4244: '=' : conversion from 'long' to 'short', possible loss of data\r
-#pragma warning(disable:4267) // warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data\r
-#pragma warning(disable:4805) // warning C4805: '!=' : unsafe mix of type 'char' and type 'bool' in operation\r
-#pragma warning(disable:4311) // warning C4311: 'type cast' : pointer truncation from 'accept_overlap *' to 'int'\r
-#pragma warning(disable:4312) // warning C4312: 'type cast' : conversion from 'int' to 'HANDLE' of greater size\r
-#pragma warning(disable:4355) // warning C4355: 'this' : used in base member initializer list\r
-\r
-/* Mehhhh... typedefs. */\r
-\r
-typedef unsigned char uint8_t;\r
-typedef unsigned long long uint64_t;\r
-typedef signed char int8_t;\r
-typedef signed long int32_t;\r
-typedef signed long long int64_t;\r
-\r
-void * ::operator new(size_t iSize);\r
-void ::operator delete(void * ptr);\r
-\r
-/* IPC Handlers */\r
-class InspIRCd;\r
-\r
-void InitIPC();\r
-void CheckIPC(InspIRCd * Instance);\r
-void CloseIPC();\r
-\r
-#endif\r
-\r
+extern int optind;
+extern char optarg[514];
+int getopt_long(int ___argc, char *const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind);
+
+struct dirent
+{
+ char d_name[MAX_PATH];
+};
+
+struct DIR
+{
+ dirent dirent_pointer;
+ HANDLE find_handle;
+ WIN32_FIND_DATAA find_data;
+ bool first;
+};
+
+CoreExport DIR * opendir(const char * path);
+CoreExport dirent * readdir(DIR * handle);
+CoreExport void closedir(DIR * handle);
+
+// warning: 'identifier' : class 'type' needs to have dll-interface to be used by clients of class 'type2'
+// Normally, this is a huge problem, but due to our new/delete remap, we can ignore it.
+#pragma warning(disable:4251)
+
+// warning: DLL-interface classkey 'identifier' used as base for DLL-interface classkey 'identifier'
+#pragma warning(disable:4275)
+
+// warning: unreferenced formal parameter
+// Unimportant for now, but for the next version, we should take a look at these again.
+#pragma warning(disable:4100)
+
+// warning: 'class' : assignment operator could not be generated
+#pragma warning(disable:4512)
+
+// warning C4127: conditional expression is constant
+// This will be triggered like crazy because FOREACH_MOD and similar macros are wrapped in do { ... } while(0) constructs
+#pragma warning(disable:4127)
+
+// warning C4996: The POSIX name for this item is deprecated.
+#pragma warning(disable:4996)
+
+// warning C4244: conversion from 'x' to 'y', possible loss of data
+#pragma warning(disable:4244)
+
+// warning C4267: 'var' : conversion from 'size_t' to 'type', possible loss of data
+#pragma warning(disable:4267)
+
+// warning C4706: assignment within conditional expression
+#pragma warning(disable:4706)
+
+/* Shared memory allocation functions */
+void * ::operator new(size_t iSize);
+void ::operator delete(void * ptr);
+
+#include <exception>
+
+class CWin32Exception : public std::exception
+{
+public:
+ CWin32Exception();
+ CWin32Exception(const CWin32Exception& other);
+ virtual const char* what() const throw();
+ DWORD GetErrorCode();
+
+private:
+ char szErrorString[500];
+ DWORD dwErrorCode;
+};
+
+// Same value as EXIT_STATUS_FORK (EXIT_STATUS_FORK is unused on Windows)
+#define EXIT_STATUS_SERVICE 4
+
+// POSIX iovec
+struct iovec
+{
+ void* iov_base; // Starting address
+ size_t iov_len; // Number of bytes to transfer
+};
+
+// Windows WSABUF with POSIX field names
+struct WindowsIOVec
+{
+ // POSIX iovec has iov_base then iov_len, WSABUF in Windows has the fields in reverse order
+ u_long iov_len; // Number of bytes to transfer
+ char FAR* iov_base; // Starting address
+};
+
+inline ssize_t writev(int fd, const WindowsIOVec* iov, int count)
+{
+ DWORD sent;
+ int ret = WSASend(fd, reinterpret_cast<LPWSABUF>(const_cast<WindowsIOVec*>(iov)), count, &sent, 0, NULL, NULL);
+ if (ret == 0)
+ return sent;
+ return -1;
+}