-#include "inspircd_win32wrapper.h"\r
-#include "inspircd.h"\r
-#include <string>\r
-#include <errno.h>\r
-#include <assert.h>\r
-using namespace std;\r
-\r
-#ifndef INADDR_NONE\r
-#define INADDR_NONE 0xffffffff\r
-#endif\r
-\r
-HANDLE hIPCPipe;\r
-\r
-int inet_aton(const char *cp, struct in_addr *addr)\r
-{\r
- unsigned long ip = inet_addr(cp);\r
- addr->s_addr = ip;\r
- return (addr->s_addr == INADDR_NONE) ? 0 : 1;\r
-}\r
-\r
-const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt)\r
-{\r
-\r
- if (af == AF_INET)\r
- {\r
- struct sockaddr_in in;\r
- memset(&in, 0, sizeof(in));\r
- in.sin_family = AF_INET;\r
- memcpy(&in.sin_addr, src, sizeof(struct in_addr));\r
- getnameinfo((struct sockaddr *)&in, sizeof(struct\r
- sockaddr_in), dst, cnt, NULL, 0, NI_NUMERICHOST);\r
- return dst;\r
- }\r
- else if (af == AF_INET6)\r
- {\r
- struct sockaddr_in6 in;\r
- memset(&in, 0, sizeof(in));\r
- in.sin6_family = AF_INET6;\r
- memcpy(&in.sin6_addr, src, sizeof(struct in_addr6));\r
- getnameinfo((struct sockaddr *)&in, sizeof(struct\r
- sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST);\r
- return dst;\r
- }\r
- return NULL;\r
-}\r
-\r
-int geteuid()\r
-{\r
- return 1;\r
-}\r
-\r
-int inet_pton(int af, const char *src, void *dst)\r
-{\r
- sockaddr_in sa;\r
- int len = sizeof(SOCKADDR);\r
- int rv = WSAStringToAddress((LPSTR)src, af, NULL, (LPSOCKADDR)&sa, &len);\r
- memcpy(dst, &sa.sin_addr, sizeof(struct in_addr));\r
- return rv;\r
-}\r
-\r
-char * strtok_r(char *_String, const char *_Control, char **_Context)\r
-{\r
- unsigned char *str;\r
- const unsigned char *ctl = (const unsigned char*)_Control;\r
- unsigned char map[32];\r
-\r
- if(_Context == 0 || !_Control)\r
- return 0;\r
-\r
- if(!(_String != NULL || *_Context != NULL))\r
- return 0;\r
-\r
- memset(map, 0, 32);\r
-\r
- do {\r
- map[*ctl >> 3] |= (1 << (*ctl & 7));\r
- } while (*ctl++);\r
-\r
- /* If string is NULL, set str to the saved\r
- * pointer (i.e., continue breaking tokens out of the string\r
- * from the last strtok call) */\r
- if (_String != NULL)\r
- {\r
- str = (unsigned char*)_String;\r
- }\r
- else\r
- {\r
- str = (unsigned char*)*_Context;\r
- }\r
-\r
- /* Find beginning of token (skip over leading delimiters). Note that\r
- * there is no token iff this loop sets str to point to the terminal\r
- * null (*str == 0) */\r
- while ((map[*str >> 3] & (1 << (*str & 7))) && *str != 0)\r
- {\r
- str++;\r
- }\r
-\r
- _String = (char*)str;\r
-\r
- /* Find the end of the token. If it is not the end of the string,\r
- * put a null there. */\r
- for ( ; *str != 0 ; str++ )\r
- {\r
- if (map[*str >> 3] & (1 << (*str & 7)))\r
- {\r
- *str++ = 0;\r
- break;\r
- }\r
- }\r
-\r
- /* Update context */\r
- *_Context = (char*)str;\r
-\r
- /* Determine if a token has been found. */\r
- if (_String == (char*)str)\r
- {\r
- return NULL;\r
- }\r
- else\r
- {\r
- return _String;\r
- }\r
-}\r
-\r
-void setcolor(int color_code)\r
-{\r
- SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color_code);\r
-}\r
-\r
-DIR * opendir(const char * path)\r
-{\r
- std::string search_path = string(path) + "\\*.*";\r
- WIN32_FIND_DATA fd;\r
- HANDLE f = FindFirstFile(search_path.c_str(), &fd);\r
- if(f != INVALID_HANDLE_VALUE)\r
- {\r
- DIR * d = new DIR;\r
- memcpy(&d->find_data, &fd, sizeof(WIN32_FIND_DATA));\r
- d->find_handle = f;\r
- d->first = true;\r
- return d;\r
- }\r
- else\r
- {\r
- return 0;\r
- }\r
-}\r
-\r
-dirent * readdir(DIR * handle)\r
-{\r
- if(handle->first)\r
- handle->first = false;\r
- else\r
- {\r
- if(!FindNextFile(handle->find_handle, &handle->find_data))\r
- return 0;\r
- }\r
-\r
- strncpy(handle->dirent_pointer.d_name, handle->find_data.cFileName, MAX_PATH);\r
- return &handle->dirent_pointer;\r
-}\r
-\r
-void closedir(DIR * handle)\r
-{\r
- FindClose(handle->find_handle);\r
- delete handle;\r
-}\r
-\r
-const char * dlerror()\r
-{\r
- static char errormessage[500];\r
- DWORD error = GetLastError();\r
- SetLastError(0);\r
- if(error == 0)\r
- return 0;\r
-\r
- FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)errormessage, 500, 0);\r
- return errormessage;\r
-}\r
-\r
-int printf_c(const char * format, ...)\r
-{\r
- // Better hope we're not multithreaded, otherwise we'll have chickens crossing the road other side to get the to :P\r
- static char message[500];\r
- static char temp[10];\r
- int color1, color2;\r
- \r
- /* parse arguments */\r
- va_list ap;\r
- va_start(ap, format);\r
- vsnprintf(message, 500, format, ap);\r
- va_end(ap);\r
-\r
- /* search for unix-style escape sequences */\r
- int t;\r
- int c = 0;\r
- const char * p = message;\r
- while(*p != 0)\r
- {\r
- if(*p == '\033')\r
- {\r
- // Escape sequence -> copy into the temp buffer, and parse the color.\r
- p++;\r
- t = 0;\r
- while(*p != 'm')\r
- {\r
- temp[t++] = *p;\r
- ++p;\r
- }\r
- \r
- temp[t] = 0;\r
- p++;\r
- if(!stricmp(temp, "[0"))\r
- {\r
- // Returning to normal colour.\r
- SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);\r
- }\r
- else if(sscanf(temp, "[%u;%u", &color1, &color2) == 2)\r
- {\r
- switch(color2)\r
- {\r
- case 32: // Green\r
- SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY); // Yellow\r
- break;\r
-\r
- default: // Unknown\r
- // White\r
- SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);\r
- break;\r
- }\r
- }\r
- else\r
- {\r
- char message[50];\r
- sprintf("Unknown color code: %s", temp);\r
- MessageBox(0, message, message, MB_OK);\r
- }\r
- }\r
-\r
- putchar(*p);\r
- ++c;\r
- ++p;\r
- }\r
-\r
- return c;\r
-}\r
-\r
-int arg_counter = 1;\r
-char optarg[514];\r
-int getopt_long_only(int ___argc, char *const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind)\r
-{\r
- // burlex todo: handle the shortops, at the moment it only works with longopts.\r
-\r
- if(___argc == 1 || arg_counter == ___argc) // No arguments (apart from filename)\r
- return -1;\r
-\r
- const char * opt = ___argv[arg_counter];\r
- int return_val = 0;\r
-\r
- // if we're not an option, return an error.\r
- if(strnicmp(opt, "--", 2) != 0)\r
- return 1;\r
- else\r
- opt += 2;\r
-\r
-\r
- // parse argument list\r
- int i = 0;\r
- for(; __longopts[i].name != 0; ++i)\r
- {\r
- if(!strnicmp(__longopts[i].name, opt, strlen(__longopts[i].name)))\r
- {\r
- // woot, found a valid argument =)\r
- char * par = 0;\r
- if((arg_counter + 1) != ___argc)\r
- {\r
- // grab the parameter from the next argument (if its not another argument)\r
- if(strnicmp(___argv[arg_counter+1], "--", 2) != 0)\r
- {\r
- arg_counter++; // Trash this next argument, we won't be needing it.\r
- par = ___argv[arg_counter];\r
- }\r
- } \r
-\r
- // increment the argument for next time\r
- arg_counter++;\r
-\r
- // determine action based on type\r
- if(__longopts[i].has_arg == required_argument && !par)\r
- {\r
- // parameter missing and its a required parameter option\r
- return 1;\r
- }\r
-\r
- // store argument in optarg\r
- if(par)\r
- strncpy(optarg, par, 514);\r
-\r
- if(__longopts[i].flag != 0)\r
- {\r
- // this is a variable, we have to set it if this argument is found.\r
- *__longopts[i].flag = 1;\r
- return 0;\r
- }\r
- else\r
- {\r
- if(__longopts[i].val == -1 || par == 0)\r
- return 1;\r
- \r
- return __longopts[i].val;\r
- } \r
- break;\r
- }\r
- }\r
-\r
- // return 1 (invalid argument)\r
- return 1;\r
-}\r
-\r
-/* IPC Messages */\r
-#define IPC_MESSAGE_REHASH 1\r
-#define IPC_MESSAGE_DIE 2\r
-#define IPC_MESSAGE_RESTART 3\r
-\r
-void InitIPC()\r
-{\r
- static DWORD buflen = 1024;\r
- static const char * pipename = "\\\\.\\mailslot\\Inspircd";\r
- hIPCPipe = CreateMailslot(pipename, buflen, 0, 0);\r
- if(hIPCPipe == INVALID_HANDLE_VALUE)\r
- printf("IPC Pipe could not be created. Are you sure you didn't start InspIRCd twice?\n");\r
-}\r
-\r
-void CheckIPC(InspIRCd * Instance)\r
-{\r
- if(hIPCPipe == INVALID_HANDLE_VALUE)\r
- return;\r
-\r
- DWORD bytes;\r
- DWORD action;\r
-\r
- BOOL res = ReadFile(hIPCPipe, &action, sizeof(DWORD), &bytes, 0);\r
- if(!res)\r
- {\r
- if(GetLastError() != ERROR_SEM_TIMEOUT)\r
- printf("IPC Pipe Error %u: %s", GetLastError(), dlerror());\r
- return;\r
- }\r
-\r
- printf("Got IPC Message: %u\n", action);\r
- switch(action)\r
- {\r
- case IPC_MESSAGE_REHASH:\r
- printf("Rehashing...\n");\r
- InspIRCd::Rehash(0);\r
- break;\r
- \r
- case IPC_MESSAGE_DIE:\r
- printf("Shutting down...\n");\r
- InspIRCd::Exit(0);\r
- break;\r
-\r
- case IPC_MESSAGE_RESTART:\r
- printf("Restarting...\n");\r
- Instance->Restart("IPC_MESSAGE_RESTART received by mailslot.");\r
- break;\r
- }\r
-}\r
-\r
-void CloseIPC()\r
-{\r
- CloseHandle(hIPCPipe);\r
-}\r
-\r
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
+ *
+ * Copyright (C) 2011 Adam <Adam@anope.org>
+ * Copyright (C) 2007, 2009 Dennis Friis <peavey@inspircd.org>
+ * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ * Copyright (C) 2007-2009 Craig Edwards <craigedwards@brainbox.cc>
+ * Copyright (C) 2008 John Brooks <john.brooks@dereferenced.net>
+ * Copyright (C) 2007 Burlex <???@???>
+ * Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net>
+ *
+ * This file is part of InspIRCd. InspIRCd is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "inspircd_win32wrapper.h"
+#include "inspircd.h"
+#include "configreader.h"
+#include <string>
+#include <errno.h>
+#include <assert.h>
+
+CoreExport const char *insp_inet_ntop(int af, const void *src, char *dst, socklen_t cnt)
+{
+
+ if (af == AF_INET)
+ {
+ struct sockaddr_in in;
+ memset(&in, 0, sizeof(in));
+ in.sin_family = AF_INET;
+ memcpy(&in.sin_addr, src, sizeof(struct in_addr));
+ getnameinfo((struct sockaddr *)&in, sizeof(struct sockaddr_in), dst, cnt, NULL, 0, NI_NUMERICHOST);
+ return dst;
+ }
+ else if (af == AF_INET6)
+ {
+ struct sockaddr_in6 in;
+ memset(&in, 0, sizeof(in));
+ in.sin6_family = AF_INET6;
+ memcpy(&in.sin6_addr, src, sizeof(struct in_addr6));
+ getnameinfo((struct sockaddr *)&in, sizeof(struct sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST);
+ return dst;
+ }
+ return NULL;
+}
+
+CoreExport int insp_inet_pton(int af, const char *src, void *dst)
+{
+ int address_length;
+ sockaddr_storage sa;
+ sockaddr_in* sin = reinterpret_cast<sockaddr_in*>(&sa);
+ sockaddr_in6* sin6 = reinterpret_cast<sockaddr_in6*>(&sa);
+
+ switch (af)
+ {
+ case AF_INET:
+ address_length = sizeof(sockaddr_in);
+ break;
+ case AF_INET6:
+ address_length = sizeof(sockaddr_in6);
+ break;
+ default:
+ return -1;
+ }
+
+ if (!WSAStringToAddress(static_cast<LPSTR>(const_cast<char *>(src)), af, NULL, reinterpret_cast<LPSOCKADDR>(&sa), &address_length))
+ {
+ switch (af)
+ {
+ case AF_INET:
+ memcpy(dst, &sin->sin_addr, sizeof(in_addr));
+ break;
+ case AF_INET6:
+ memcpy(dst, &sin6->sin6_addr, sizeof(in6_addr));
+ break;
+ }
+ return 1;
+ }
+
+ return 0;
+}
+
+CoreExport DIR * opendir(const char * path)
+{
+ std::string search_path = std::string(path) + "\\*.*";
+ WIN32_FIND_DATAA fd;
+ HANDLE f = FindFirstFileA(search_path.c_str(), &fd);
+ if (f != INVALID_HANDLE_VALUE)
+ {
+ DIR * d = new DIR;
+ memcpy(&d->find_data, &fd, sizeof(WIN32_FIND_DATA));
+ d->find_handle = f;
+ d->first = true;
+ return d;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+CoreExport dirent * readdir(DIR * handle)
+{
+ if (handle->first)
+ handle->first = false;
+ else
+ {
+ if (!FindNextFileA(handle->find_handle, &handle->find_data))
+ return 0;
+ }
+
+ strncpy(handle->dirent_pointer.d_name, handle->find_data.cFileName, MAX_PATH);
+ return &handle->dirent_pointer;
+}
+
+CoreExport void closedir(DIR * handle)
+{
+ FindClose(handle->find_handle);
+ delete handle;
+}
+
+int optind = 1;
+char optarg[514];
+int getopt_long(int ___argc, char *const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind)
+{
+ // burlex todo: handle the shortops, at the moment it only works with longopts.
+
+ if (___argc == 1 || optind == ___argc) // No arguments (apart from filename)
+ return -1;
+
+ const char * opt = ___argv[optind];
+ optind++;
+
+ // if we're not an option, return an error.
+ if (strnicmp(opt, "--", 2) != 0)
+ return 1;
+ else
+ opt += 2;
+
+
+ // parse argument list
+ int i = 0;
+ for (; __longopts[i].name != 0; ++i)
+ {
+ if (!strnicmp(__longopts[i].name, opt, strlen(__longopts[i].name)))
+ {
+ // woot, found a valid argument =)
+ char * par = 0;
+ if ((optind) != ___argc)
+ {
+ // grab the parameter from the next argument (if its not another argument)
+ if (strnicmp(___argv[optind], "--", 2) != 0)
+ {
+// optind++; // Trash this next argument, we won't be needing it.
+ par = ___argv[optind-1];
+ }
+ }
+
+ // increment the argument for next time
+// optind++;
+
+ // determine action based on type
+ if (__longopts[i].has_arg == required_argument && !par)
+ {
+ // parameter missing and its a required parameter option
+ return 1;
+ }
+
+ // store argument in optarg
+ if (par)
+ strncpy(optarg, par, 514);
+
+ if (__longopts[i].flag != 0)
+ {
+ // this is a variable, we have to set it if this argument is found.
+ *__longopts[i].flag = 1;
+ return 0;
+ }
+ else
+ {
+ if (__longopts[i].val == -1 || par == 0)
+ return 1;
+
+ return __longopts[i].val;
+ }
+ break;
+ }
+ }
+
+ // return 1 (invalid argument)
+ return 1;
+}
+
+CWin32Exception::CWin32Exception() : exception()
+{
+ dwErrorCode = GetLastError();
+ if( FormatMessageA( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)szErrorString, _countof(szErrorString), NULL) == 0 )
+ sprintf_s(szErrorString, _countof(szErrorString), "Error code: %u", dwErrorCode);
+ for (size_t i = 0; i < _countof(szErrorString); i++)
+ {
+ if ((szErrorString[i] == '\r') || (szErrorString[i] == '\n'))
+ szErrorString[i] = 0;
+ }
+}
+
+CWin32Exception::CWin32Exception(const CWin32Exception& other)
+{
+ strcpy_s(szErrorString, _countof(szErrorString), other.szErrorString);
+}
+
+const char* CWin32Exception::what() const throw()
+{
+ return szErrorString;
+}
+
+DWORD CWin32Exception::GetErrorCode()
+{
+ return dwErrorCode;
+}