+/* +------------------------------------+\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
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
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
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