]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - win/inspircd_win32wrapper.cpp
Remove printf_c from wrapper, this code also segfaulted when it was used.
[user/henk/code/inspircd.git] / win / inspircd_win32wrapper.cpp
index ef04b4fc86935bb3f71fd367d6b804e24da6d8b1..3a929d09e375bcc175e0d5fdeebaaf0761a5e54f 100644 (file)
@@ -1,3 +1,16 @@
+/*       +------------------------------------+\r
+ *       | Inspire Internet Relay Chat Daemon |\r
+ *       +------------------------------------+\r
+ *\r
+ *  InspIRCd: (C) 2002-2007 InspIRCd Development Team\r
+ * See: http://www.inspircd.org/wiki/index.php/Credits\r
+ *\r
+ * This program is free but copyrighted software; see\r
+ *            the file COPYING for details.\r
+ *\r
+ * ---------------------------------------------------\r
+ */\r
+\r
 #include "inspircd_win32wrapper.h"\r
 #include "inspircd.h"\r
 #include <string>\r
@@ -52,6 +65,13 @@ int inet_pton(int af, const char *src, void *dst)
        sockaddr_in sa;\r
        int len = sizeof(SOCKADDR);\r
        int rv = WSAStringToAddress((LPSTR)src, af, NULL, (LPSOCKADDR)&sa, &len);\r
+       if(rv >= 0)\r
+       {\r
+               if(WSAGetLastError() == 10022)                  // Invalid Argument\r
+                       rv = 0;\r
+               else\r
+                       rv = 1;\r
+       }\r
        memcpy(dst, &sa.sin_addr, sizeof(struct in_addr));\r
        return rv;\r
 }\r
@@ -177,72 +197,6 @@ const char * dlerror()
        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);\r
-                                       break;\r
-       \r
-                                       default:                // Unknown\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
@@ -366,3 +320,105 @@ void CloseIPC()
        CloseHandle(hIPCPipe);\r
 }\r
 \r
+\r
+/* These three functions were created from looking at how ares does it\r
+ * (...and they look far tidier in C++)\r
+ */\r
+\r
+/* Get active nameserver */\r
+bool GetNameServer(HKEY regkey, const char *key, char* &output)\r
+{\r
+       DWORD size = 0;\r
+       DWORD result = RegQueryValueEx(regkey, key, 0, NULL, NULL, &size);\r
+       if (((result != ERROR_SUCCESS) && (result != ERROR_MORE_DATA)) || (!size))\r
+               return false;\r
+\r
+       output = new char[size+1];\r
+\r
+       if ((RegQueryValueEx(regkey, key, 0, NULL, (LPBYTE)output, &size) != ERROR_SUCCESS) || (!*output))\r
+       {\r
+               delete output;\r
+               return false;\r
+       }\r
+       return true;\r
+}\r
+\r
+/* Check a network interface for its nameserver */\r
+bool GetInterface(HKEY regkey, const char *key, char* &output)\r
+{\r
+       char buf[39];\r
+       DWORD size = 39;\r
+       int idx = 0;\r
+       HKEY top;\r
+\r
+       while (RegEnumKeyEx(regkey, idx++, buf, &size, 0, NULL, NULL, NULL) != ERROR_NO_MORE_ITEMS)\r
+       {\r
+               size = 39;\r
+               if (RegOpenKeyEx(regkey, buf, 0, KEY_QUERY_VALUE, &top) != ERROR_SUCCESS)\r
+                       continue;\r
+               int rc = GetNameServer(top, key, output);\r
+               RegCloseKey(top);\r
+               if (rc)\r
+                       return true;\r
+       }\r
+       return false;\r
+}\r
+\r
+\r
+std::string FindNameServerWin()\r
+{\r
+       std::string returnval = "127.0.0.1";\r
+       HKEY top, key;\r
+       char* dns = NULL;\r
+\r
+       /* Lets see if the correct registry hive and tree exist */\r
+       if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, KEY_READ, &top) == ERROR_SUCCESS)\r
+       {\r
+               /* If they do, attempt to get the nameserver name */\r
+               RegOpenKeyEx(top, "Interfaces", 0, KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS, &key);\r
+               if ((GetNameServer(top, "NameServer", dns)) || (GetNameServer(top, "DhcpNameServer", dns))\r
+                       || (GetInterface(key, "NameServer", dns)) || (GetInterface(key, "DhcpNameServer", dns)))\r
+               {\r
+                       if (dns)\r
+                       {\r
+                               returnval = dns;\r
+                               delete dns;\r
+                       }\r
+               }\r
+               RegCloseKey(key);\r
+               RegCloseKey(top);\r
+       }\r
+       return returnval;\r
+}\r
+\r
+\r
+void ClearConsole()\r
+{\r
+       COORD coordScreen = { 0, 0 };    /* here's where we'll home the cursor */\r
+       HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);\r
+       DWORD cCharsWritten;\r
+       CONSOLE_SCREEN_BUFFER_INFO csbi; /* to get buffer info */ \r
+       DWORD dwConSize;                 /* number of character cells in the current buffer */ \r
+\r
+       /* get the number of character cells in the current buffer */ \r
+\r
+       if (GetConsoleScreenBufferInfo( hConsole, &csbi ))\r
+       {\r
+               dwConSize = csbi.dwSize.X * csbi.dwSize.Y;\r
+               /* fill the entire screen with blanks */ \r
+               if (FillConsoleOutputCharacter( hConsole, (TCHAR) ' ', dwConSize, coordScreen, &cCharsWritten ))\r
+               {\r
+                       /* get the current text attribute */ \r
+                       if (GetConsoleScreenBufferInfo( hConsole, &csbi ))\r
+                       {\r
+                               /* now set the buffer's attributes accordingly */\r
+                               if (FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten ))\r
+                               {\r
+                                       /* put the cursor at (0, 0) */\r
+                                       SetConsoleCursorPosition( hConsole, coordScreen );\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r