summaryrefslogtreecommitdiff
path: root/win
diff options
context:
space:
mode:
authorpeavey <peavey@e03df62e-2008-0410-955e-edbf42e46eb7>2007-07-16 17:30:04 +0000
committerpeavey <peavey@e03df62e-2008-0410-955e-edbf42e46eb7>2007-07-16 17:30:04 +0000
commitf2acdbc3820f0f4f5ef76a0a64e73d2a320df91f (patch)
tree0602469ef10e4dab4b3975599eb4f919a501c1eb /win
parent387f54199e9f335c58af888bdad5ddc1f5cf9bec (diff)
OOPS! We try again, since I'm smoking craq. LF is 0x0a NOT CR.
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@7456 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'win')
-rw-r--r--win/cert.pem19
-rw-r--r--win/colours.h110
-rw-r--r--win/configure.cpp510
-rw-r--r--win/inspircd.nsi273
-rw-r--r--win/inspircd_memory_functions.cpp45
-rw-r--r--win/inspircd_win32wrapper.cpp514
-rw-r--r--win/inspircd_win32wrapper.h190
-rw-r--r--win/key.pem16
-rw-r--r--win/makeinstaller.bat8
9 files changed, 1676 insertions, 9 deletions
diff --git a/win/cert.pem b/win/cert.pem
index 1d1298d7c..d0eaf68e7 100644
--- a/win/cert.pem
+++ b/win/cert.pem
@@ -1 +1,18 @@
------BEGIN CERTIFICATE----- MIIC1DCCAj+gAwIBAgIDcGbSMAsGCSqGSIb3DQEBBTCBgTEQMA4GA1UEBhMHRW5n bGFuZDElMCMGA1UEChMcRGVmYXVsdCBJbnNwSVJDZCBDZXJ0aWZpY2F0ZTEeMBwG A1UECxMVU2VydmVyIEFkbWluaXN0cmF0aW9uMQswCQYDVQQIEwJVSzEZMBcGA1UE AxMQaXJjLmluc3BpcmNkLm9yZzAeFw0wNzA2MTMyMTUyMTNaFw0wOTA1MTMyMTUy MTNaMIGBMRAwDgYDVQQGEwdFbmdsYW5kMSUwIwYDVQQKExxEZWZhdWx0IEluc3BJ UkNkIENlcnRpZmljYXRlMR4wHAYDVQQLExVTZXJ2ZXIgQWRtaW5pc3RyYXRpb24x CzAJBgNVBAgTAlVLMRkwFwYDVQQDExBpcmMuaW5zcGlyY2Qub3JnMIGcMAsGCSqG SIb3DQEBAQOBjAAwgYgCgYDIbKvMTTogBZxTi1yn4ncVK09Wr+F2AxP63HWTzxnE wNhcURSaUqpCzVIfcpr7/jKn+8I17MzaMvG8m+sPKngPK5WMN440p12uitkS+uzk LbJ7J/Z335ar6nZOtbIO+aTDRzUTnNHGHRgdQj4GGvx89l0u7vQM3R2f9Oe2lWlc 1wIDAQABo18wXTAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggr BgEFBQcDATAPBgNVHQ8BAf8EBQMDB6AAMB0GA1UdDgQWBBQTdpXUljwHWvbEggnP BZMFhd1MvjALBgkqhkiG9w0BAQUDgYEARi9LL+mCxLWffiTHzGMO4ul0E0bXIzD5 QzFI/llFzX4+fcuZJUFPgpBFJzxOqSO9RZAXHfm7x9sUMNpFP4ir4b2phQGr0QDd 6nPHmcwuyiQISPIL3xcgrb2CuzQa/Wqmkxi5vXHf1CQQijJ1UA/FCPD6f+Dulcdq UAtrNsUBhLY= -----END CERTIFICATE----- \ No newline at end of file
+-----BEGIN CERTIFICATE-----
+MIIC1DCCAj+gAwIBAgIDcGbSMAsGCSqGSIb3DQEBBTCBgTEQMA4GA1UEBhMHRW5n
+bGFuZDElMCMGA1UEChMcRGVmYXVsdCBJbnNwSVJDZCBDZXJ0aWZpY2F0ZTEeMBwG
+A1UECxMVU2VydmVyIEFkbWluaXN0cmF0aW9uMQswCQYDVQQIEwJVSzEZMBcGA1UE
+AxMQaXJjLmluc3BpcmNkLm9yZzAeFw0wNzA2MTMyMTUyMTNaFw0wOTA1MTMyMTUy
+MTNaMIGBMRAwDgYDVQQGEwdFbmdsYW5kMSUwIwYDVQQKExxEZWZhdWx0IEluc3BJ
+UkNkIENlcnRpZmljYXRlMR4wHAYDVQQLExVTZXJ2ZXIgQWRtaW5pc3RyYXRpb24x
+CzAJBgNVBAgTAlVLMRkwFwYDVQQDExBpcmMuaW5zcGlyY2Qub3JnMIGcMAsGCSqG
+SIb3DQEBAQOBjAAwgYgCgYDIbKvMTTogBZxTi1yn4ncVK09Wr+F2AxP63HWTzxnE
+wNhcURSaUqpCzVIfcpr7/jKn+8I17MzaMvG8m+sPKngPK5WMN440p12uitkS+uzk
+LbJ7J/Z335ar6nZOtbIO+aTDRzUTnNHGHRgdQj4GGvx89l0u7vQM3R2f9Oe2lWlc
+1wIDAQABo18wXTAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggr
+BgEFBQcDATAPBgNVHQ8BAf8EBQMDB6AAMB0GA1UdDgQWBBQTdpXUljwHWvbEggnP
+BZMFhd1MvjALBgkqhkiG9w0BAQUDgYEARi9LL+mCxLWffiTHzGMO4ul0E0bXIzD5
+QzFI/llFzX4+fcuZJUFPgpBFJzxOqSO9RZAXHfm7x9sUMNpFP4ir4b2phQGr0QDd
+6nPHmcwuyiQISPIL3xcgrb2CuzQa/Wqmkxi5vXHf1CQQijJ1UA/FCPD6f+Dulcdq
+UAtrNsUBhLY=
+-----END CERTIFICATE-----
diff --git a/win/colours.h b/win/colours.h
index 8c16a98bf..6a5853c21 100644
--- a/win/colours.h
+++ b/win/colours.h
@@ -1 +1,109 @@
-/* +------------------------------------+ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * * InspIRCd: (C) 2002-2007 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see * the file COPYING for details. * * --------------------------------------------------- */ #ifndef __COLOURS_H #define __COLOURS_H #define TRED FOREGROUND_RED | FOREGROUND_INTENSITY #define TGREEN FOREGROUND_GREEN | FOREGROUND_INTENSITY #define TYELLOW FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY #define TNORMAL FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE #define TWHITE TNORMAL | FOREGROUND_INTENSITY #define TBLUE FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY inline void sc(WORD color) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color); } /* Handles colors in printf */ int printf_c(const char * format, ...) { // Better hope we're not multithreaded, otherwise we'll have chickens crossing the road other side to get the to :P static char message[500]; static char temp[500]; int color1, color2; /* parse arguments */ va_list ap; va_start(ap, format); vsnprintf(message, 500, format, ap); va_end(ap); /* search for unix-style escape sequences */ int t; int c = 0; const char * p = message; while (*p != 0) { if (*p == '\033') { // Escape sequence -> copy into the temp buffer, and parse the color. p++; t = 0; while ((*p) && (*p != 'm')) { temp[t++] = *p; ++p; } temp[t] = 0; p++; if (*temp == '[') { if (sscanf(temp, "[%u;%u", &color1, &color2) == 2) { switch(color2) { case 32: // Green SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY); // Yellow break; default: // Unknown // White SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; } } else { switch (*(temp+1)) { case '0': // Returning to normal colour. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); break; case '1': // White SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), TWHITE); break; default: char message[50]; sprintf(message, "Unknown color code: %s", temp); MessageBox(0, message, message, MB_OK); break; } } } } putchar(*p); ++c; ++p; } return c; } #endif \ No newline at end of file
+/* +------------------------------------+
+ * | Inspire Internet Relay Chat Daemon |
+ * +------------------------------------+
+ *
+ * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * See: http://www.inspircd.org/wiki/index.php/Credits
+ *
+ * This program is free but copyrighted software; see
+ * the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+#ifndef __COLOURS_H
+#define __COLOURS_H
+
+#define TRED FOREGROUND_RED | FOREGROUND_INTENSITY
+#define TGREEN FOREGROUND_GREEN | FOREGROUND_INTENSITY
+#define TYELLOW FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY
+#define TNORMAL FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE
+#define TWHITE TNORMAL | FOREGROUND_INTENSITY
+#define TBLUE FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY
+
+inline void sc(WORD color) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color); }
+
+/* Handles colors in printf */
+int printf_c(const char * format, ...)
+{
+ // Better hope we're not multithreaded, otherwise we'll have chickens crossing the road other side to get the to :P
+ static char message[500];
+ static char temp[500];
+ int color1, color2;
+
+ /* parse arguments */
+ va_list ap;
+ va_start(ap, format);
+ vsnprintf(message, 500, format, ap);
+ va_end(ap);
+
+ /* search for unix-style escape sequences */
+ int t;
+ int c = 0;
+ const char * p = message;
+ while (*p != 0)
+ {
+ if (*p == '\033')
+ {
+ // Escape sequence -> copy into the temp buffer, and parse the color.
+ p++;
+ t = 0;
+ while ((*p) && (*p != 'm'))
+ {
+ temp[t++] = *p;
+ ++p;
+ }
+
+ temp[t] = 0;
+ p++;
+
+ if (*temp == '[')
+ {
+ if (sscanf(temp, "[%u;%u", &color1, &color2) == 2)
+ {
+ switch(color2)
+ {
+ case 32: // Green
+ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY); // Yellow
+ break;
+
+ default: // Unknown
+ // White
+ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
+ break;
+ }
+ }
+ else
+ {
+ switch (*(temp+1))
+ {
+ case '0':
+ // Returning to normal colour.
+ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
+ break;
+
+ case '1':
+ // White
+ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), TWHITE);
+ break;
+
+ default:
+ char message[50];
+ sprintf(message, "Unknown color code: %s", temp);
+ MessageBox(0, message, message, MB_OK);
+ break;
+ }
+ }
+ }
+ }
+
+ putchar(*p);
+ ++c;
+ ++p;
+ }
+
+ return c;
+}
+
+#endif
+
diff --git a/win/configure.cpp b/win/configure.cpp
index 25c9e62cf..adb10a6b9 100644
--- a/win/configure.cpp
+++ b/win/configure.cpp
@@ -1 +1,509 @@
-/* +------------------------------------+ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * * InspIRCd: (C) 2002-2007 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see * the file COPYING for details. * * --------------------------------------------------- */ #define _CRT_SECURE_NO_DEPRECATE #include <windows.h> #include <stdio.h> #include <string> #include <time.h> #include "colours.h" using namespace std; void Run(); void Banner(); void WriteCompileModules(); void WriteCompileCommands(); /* detects if we are running windows xp or higher (5.1) */ bool iswinxp() { OSVERSIONINFO vi; vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&vi); if(vi.dwMajorVersion >= 5) return true; return false; } int get_int_option(const char * text, int def) { static char buffer[500]; int ret; printf_c("%s\n[\033[1;32m%u\033[0m] -> ", text, def); fgets(buffer, 500, stdin); if(sscanf(buffer, "%u", &ret) != 1) ret = def; printf("\n"); return ret; } bool get_bool_option(const char * text, bool def) { static char buffer[500]; char ret[100]; printf_c("%s [\033[1;32m%c\033[0m] -> ", text, def ? 'y' : 'n'); fgets(buffer, 500, stdin); if(sscanf(buffer, "%s", ret) != 1) strcpy(ret, def ? "y" : "n"); printf("\n"); return !strncmp(ret, "y", 1); } void get_string_option(const char * text, char * def, char * buf) { static char buffer[500]; printf_c("%s\n[\033[1;32m%s\033[0m] -> ", text, def); fgets(buffer, 500, stdin); if(sscanf(buffer, "%s", buf) != 1) strcpy(buf, def); printf("\n"); } // escapes a string for use in a c++ file bool escape_string(char * str, size_t size) { size_t len = strlen(str); char * d_str = (char*)malloc(len * 2); size_t i = 0; size_t j = 0; for(; i < len; ++i) { if(str[i] == '\\') { d_str[j++] = '\\'; d_str[j++] = '\\'; } else { d_str[j++] = str[i]; } } d_str[j++] = 0; if(j > size) { free(d_str); return false; } strcpy(str, d_str); free(d_str); return true; } /* gets the svn revision */ int get_svn_revision(char * buffer, size_t len) { /* again.. I am lazy :p cbf to pipe output of svn info to us, so i'll just read the file */ /* 8 dir 7033 */ char buf[1000]; FILE * f = fopen("..\\.svn\\entries", "r"); if(!f) goto bad_rev; if(!fgets(buf, 1000, f)) goto bad_rev; if(!fgets(buf, 1000, f)) goto bad_rev; if(!fgets(buf, 1000, f)) goto bad_rev; if(!fgets(buf, 1000, f)) goto bad_rev; int rev = atoi(buf); if(rev == 0) goto bad_rev; sprintf(buffer, "%u", rev); fclose(f); return rev; bad_rev: strcpy(buffer, "non-svn"); if(f) fclose(f); return 0; } int __stdcall WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd ) { FILE * j = fopen("inspircd_config.h", "r"); if (j) { if (MessageBox(0, "inspircd_config.h already exists. Remove it and build from clean?", "Configure program", MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2) != IDYES) { fclose(j); exit(0); } } AllocConsole(); // pipe standard handles to this console freopen("CONIN$", "r", stdin); freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); Banner(); Run(); WriteCompileCommands(); WriteCompileModules(); FreeConsole(); return 0; } void Banner() { printf_c("\nWelcome to the \033[1mInspIRCd\033[0m Configuration program! (\033[1minteractive mode\033[0m)\n" "\033[1mPackage maintainers: Type ./configure --help for non-interactive help\033[0m\n\n"); printf_c("*** If you are unsure of any of these values, leave it blank for ***\n" "*** standard settings that will work, and your server will run ***\n" "*** using them. Please consult your IRC network admin if in doubt. ***\n\n" "Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter\n" "a new value. Please note: You will \033[1mHAVE\033[0m to read the docs\n" "dir, otherwise you won't have a config file!\n\n"); } void Run() { int max_fd = 1024; bool use_iocp = false; bool support_ip6links = false; char mod_path[MAX_PATH]; char config_file[MAX_PATH]; char library_dir[MAX_PATH]; char base_path[MAX_PATH]; char bin_dir[MAX_PATH]; char revision_text[MAX_PATH]; int max_clients = 1024; int nicklen = 31; int chanlen = 64; int modechanges = 20; int identlen = 12; int quitlen = 255; int topiclen = 500; int kicklen = 255; int rllen = 128; int awaylen = 200; int revision = get_svn_revision(revision_text, MAX_PATH); char version[514]; // grab version FILE * fI = fopen("..\\src\\version.sh", "r"); if(fI) { fgets(version, 514, fI); fgets(version, 514, fI); char * p2 = version; while(*p2 != '\"') ++p2; ++p2; strcpy(version, p2); p2 = version; while(*p2 != '\"') ++p2; *p2 = 0; fclose(fI); } else strcpy(version, "InspIRCD-Unknown"); #ifdef WIN64 printf_c("Your operating system is: \033[1;32mwindows_x64 \033[0m\n"); #else printf_c("Your operating system is: \033[1;32mwindows_x32 \033[0m\n"); #endif printf_c("InspIRCd revision ID: \033[1;32m%s \033[0m\n\n", revision ? revision_text : "(Non-SVN build)"); max_fd = get_int_option("What is the maximum file descriptor count you would like to allow?", 1024); // detect windows if(iswinxp()) { printf_c("You are running Windows 2000 or above, and IOCP support is most likely available.\n" "This removes the socket number limitation of select and is much more efficent.\n" "If you are unsure, answer yes.\n\n"); use_iocp = get_bool_option("Do you want to use the IOCP implementation?", true); } support_ip6links = get_bool_option("\nYou have chosen to build an \033[1;32mIPV4-only\033[0m server.\nWould you like to enable support for linking to IPV6-enabled InspIRCd servers?\nIf you are using a recent operating system and are unsure, answer yes.\nIf you answer 'no' here, your InspIRCd server will be unable\nto parse IPV6 addresses (e.g. for CIDR bans)", true); printf_c("\033[1mAll paths are relative to the binary directory.\033[0m\n"); get_string_option("In what directory do you wish to install the InspIRCd base?", "..", base_path); get_string_option("In what directory are the configuration files?", "../conf", config_file); get_string_option("In what directory are the modules to be compiled to?", "../modules", mod_path); get_string_option("In what directory is the IRCd binary to be placed?", ".", bin_dir); get_string_option("In what directory are the IRCd libraries to be placed?", "../lib", library_dir); printf_c("The following questions will ask you for various figures relating\n" "To your IRCd install. Please note that these should usually be left\n" "as defaults unless you have a real reason to change them. If they\n" "changed, then the values must be identical on all servers on your\n" "network, or malfunctions and/or crashes may occur, with the exception\n" "of the 'maximum number of clients' setting which may be different on\n" "different servers on the network.\n\n"); max_clients = get_int_option("Please enter the maximum number of clients at any one time?", 1024); nicklen = get_int_option("Please enter the maximum length of nicknames?", 31); chanlen = get_int_option("Please enter the maximum length of channel names?", 64); modechanges = get_int_option("Please enter the maximum number of mode changes in one line?", 20); identlen = get_int_option("Please enter the maximum length of an ident (username)?", 12); quitlen = get_int_option("Please enter the maximum length of a quit message?", 255); topiclen = get_int_option("Please enter the maximum length of a channel topic?", 307); kicklen = get_int_option("Please enter the maximum length of a kick message?", 255); rllen = get_int_option("Please enter the maximum length of a GECOS (real name)?", 128); awaylen = get_int_option("Please enter the maximum length of an away message?", 200); printf_c("\n\033[1;32mPre-build configuration is complete!\n\n"); sc(TNORMAL); // dump all the options back out printf_c("\033[0mBase install path:\033[1;32m %s\n", base_path); printf_c("\033[0mConfig path:\033[1;32m %s\n", config_file); printf_c("\033[0mModule path:\033[1;32m %s\n", mod_path); printf_c("\033[0mLibrary path:\033[1;32m %s\n", library_dir); printf_c("\033[0mSocket Engine:\033[1;32m %s\n", use_iocp ? "iocp" : "select"); printf_c("\033[0mMax file descriptors:\033[1;32m %u\n", max_fd); printf_c("\033[0mMax connections:\033[1;32m %u\n", max_clients); printf_c("\033[0mMax nickname length:\033[1;32m %u\n", nicklen); printf_c("\033[0mMax channel length:\033[1;32m %u\n", chanlen); printf_c("\033[0mMax mode length:\033[1;32m %u\n", modechanges); printf_c("\033[0mMax ident length:\033[1;32m %u\n", identlen); printf_c("\033[0mMax quit length:\033[1;32m %u\n", quitlen); printf_c("\033[0mMax topic length:\033[1;32m %u\n", topiclen); printf_c("\033[0mMax kick length:\033[1;32m %u\n", kicklen); printf_c("\033[0mMax name length:\033[1;32m %u\n", rllen); printf_c("\033[0mMax away length:\033[1;32m %u\n", awaylen); printf("\n"); sc(TNORMAL); if(get_bool_option("Are these settings correct?", true) == false) { Run(); return; } printf("\n"); // escape the pathes escape_string(config_file, MAX_PATH); escape_string(mod_path, MAX_PATH); escape_string(library_dir, MAX_PATH); printf("\nWriting inspircd_config.h..."); FILE * f = fopen("inspircd_config.h", "w"); fprintf(f, "/* Auto generated by configure, do not modify! */\n"); fprintf(f, "#ifndef __CONFIGURATION_AUTO__\n"); fprintf(f, "#define __CONFIGURATION_AUTO__\n\n"); if(use_iocp) fprintf(f, "#define CONFIG_USE_IOCP 1\n\n"); fprintf(f, "#define CONFIG_FILE \"%s/inspircd.conf\"\n", config_file); fprintf(f, "#define MOD_PATH \"%s\"\n", mod_path); fprintf(f, "#define MAX_DESCRIPTORS %u\n", max_fd); fprintf(f, "#define MAXCLIENTS %u\n", max_clients); fprintf(f, "#define MAXCLIENTS_S \"%u\"\n", max_clients); fprintf(f, "#define SOMAXCONN_S \"128\"\n"); fprintf(f, "#define NICKMAX %u\n", nicklen+1); fprintf(f, "#define CHANMAX %u\n", chanlen+1); fprintf(f, "#define MAXMODES %u\n", modechanges); fprintf(f, "#define IDENTMAX %u\n", identlen); fprintf(f, "#define MAXQUIT %u\n", quitlen); fprintf(f, "#define MAXTOPIC %u\n", topiclen); fprintf(f, "#define MAXKICK %u\n", kicklen); fprintf(f, "#define MAXGECOS %u\n", rllen); fprintf(f, "#define MAXAWAY %u\n", awaylen); fprintf(f, "#define LIBRARYDIR \"%s\"\n", library_dir); fprintf(f, "#define VERSION \"%s\"\n", version); fprintf(f, "#define REVISION \"%s\"\n", revision_text); if(support_ip6links) fprintf(f, "#define SUPPORT_IP6LINKS 1\n"); OSVERSIONINFO vi; vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&vi); #ifdef WIN64 fprintf(f, "#define SYSTEM \"Windows_x64 %u.%u.%u %s\"\n", vi.dwMajorVersion, vi.dwMinorVersion, vi.dwBuildNumber, vi.szCSDVersion); #else fprintf(f, "#define SYSTEM \"Windows_x32 %u.%u.%u %s\"\n", vi.dwMajorVersion, vi.dwMinorVersion, vi.dwBuildNumber, vi.szCSDVersion); #endif fprintf(f, "#define MAXBUF 514\n"); fprintf(f, "\n#include \"inspircd_win32wrapper.h\"\n\n"); fprintf(f, "#endif\n\n"); fclose(f); sc(TGREEN); printf(" done\n"); sc(TNORMAL); printf("Writing inspircd_se_config.h..."); f = fopen("inspircd_se_config.h", "w"); fprintf(f, "/* Auto generated by configure, do not modify or commit to svn! */\n"); fprintf(f, "#ifndef __CONFIGURATION_SOCKETENGINE__\n"); fprintf(f, "#define __CONFIGURATION_SOCKETENGINE__\n\n"); fprintf(f, "#include \"socketengine_%s.h\"\n\n", use_iocp ? "iocp" : "select"); fprintf(f, "#endif\n\n"); fclose(f); sc(TGREEN); printf(" done\n"); sc(TNORMAL); printf("Writing command and module compilation scripts..."); WriteCompileCommands(); WriteCompileModules(); sc(TGREEN); printf(" done\n"); sc(TNORMAL); printf("\nconfigure is done.. exiting!\n"); } void WriteCompileCommands() { char commands[300][100]; int command_count = 0; printf("\n Finding Command Sources...\n"); WIN32_FIND_DATA fd; HANDLE fh = FindFirstFile("..\\src\\cmd_*.cpp", &fd); if(fh == INVALID_HANDLE_VALUE) printf_c("\033[1;32m No command sources could be found! This \033[1m*could*\033[1;32m be a bad thing.. :P\033[0m"); else { sc(TGREEN); do { strcpy(commands[command_count], fd.cFileName); commands[command_count][strlen(fd.cFileName) - 4] = 0; printf(" %s\n", commands[command_count]); ++command_count; } while(FindNextFile(fh, &fd)); sc(TNORMAL); } // Write our spiffy new makefile :D // I am such a lazy fucker :P FILE * f = fopen("..\\src\\commands.mak", "w"); time_t t = time(NULL); fprintf(f, "# Generated at %s\n", ctime(&t)); fprintf(f, "all: makedir "); // dump modules.. first time :) for(int i = 0; i < command_count; ++i) fprintf(f, "%s.so ", commands[i]); fprintf(f, "\n.cpp.obj:\n"); #ifdef WIN64 // /MACHINE:X64 #ifdef _DEBUG fprintf(f, " cl /nologo /LD /Od /I \".\" /I \"../include\" /I \"../include/modes\" /I \"../include/commands\" /I \"../win\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /Gm /RTC1 /MTd /Fo\"Debug/\" /Fd\"Debug/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\win\\inspircd_memory_functions.cpp /link ..\\bin\\debug_x64\\bin\\inspircd.lib /OUT:\"..\\bin\\debug_x64\\lib\\$*.so\" /PDB:\"..\\bin\\debug_x64\\lib\\$*.pdb\" /MACHINE:X64 /IMPLIB:\"..\\bin\\debug_x64\\lib\\$*.lib\"\n\n"); CreateDirectory("..\\src\\debug", NULL); CreateDirectory("..\\bin\\debug\\bin", NULL); CreateDirectory("..\\bin\\debug\\lib", NULL); CreateDirectory("..\\bin\\debug\\modules", NULL); #else fprintf(f, " cl /nologo /LD /Od /I \".\" /I \"../include\" /I \"../include/modes\" /I \"../include/commands\" /I \"../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /EHsc /Gm /MT /Fo\"Release/\" /Fd\"Release/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\win\\inspircd_memory_functions.cpp /link ..\\bin\\release_x64\\bin\\inspircd.lib /OUT:\"..\\bin\\release_x64\\lib\\$*.so\" /PDB:\"..\\bin\\release_x64\\lib\\$*.pdb\" /MACHINE:X64 /IMPLIB:\"..\\bin\\release_x64\\lib\\$*.lib\"\n\n"); CreateDirectory("..\\src\\release", NULL); CreateDirectory("..\\bin\\release\\bin", NULL); CreateDirectory("..\\bin\\release\\lib", NULL); CreateDirectory("..\\bin\\release\\modules", NULL); #endif #else #ifdef _DEBUG fprintf(f, " cl /nologo /LD /Od /I \".\" /I \"../include\" /I \"../include/modes\" /I \"../include/commands\" /I \"../win\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /Gm /RTC1 /MTd /Fo\"Debug/\" /Fd\"Debug/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\win\\inspircd_memory_functions.cpp /link ..\\bin\\debug\\bin\\inspircd.lib /OUT:\"..\\bin\\debug\\lib\\$*.so\" /PDB:\"..\\bin\\debug\\lib\\$*.pdb\" /IMPLIB:\"..\\bin\\debug\\lib\\$*.lib\"\n\n"); CreateDirectory("..\\src\\debug", NULL); CreateDirectory("..\\bin\\debug\\bin", NULL); CreateDirectory("..\\bin\\debug\\lib", NULL); CreateDirectory("..\\bin\\debug\\modules", NULL); #else fprintf(f, " cl /nologo /LD /Od /I \".\" /I \"../include\" /I \"../include/modes\" /I \"../include/commands\" /I \"../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /EHsc /Gm /MT /Fo\"Release/\" /Fd\"Release/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\win\\inspircd_memory_functions.cpp /link ..\\bin\\release\\bin\\inspircd.lib /OUT:\"..\\bin\\release\\lib\\$*.so\" /PDB:\"..\\bin\\release\\lib\\$*.pdb\" /IMPLIB:\"..\\bin\\release\\lib\\$*.lib\"\n\n"); CreateDirectory("..\\src\\release", NULL); CreateDirectory("..\\bin\\release\\bin", NULL); CreateDirectory("..\\bin\\release\\lib", NULL); CreateDirectory("..\\bin\\release\\modules", NULL); #endif #endif fprintf(f, "makedir:\n if not exist debug mkdir debug\n\n"); // dump modules.. again the second and last time :) for(int i = 0; i < command_count; ++i) fprintf(f, "%s.so : %s.obj\n", commands[i], commands[i]); fprintf(f, "\n"); fclose(f); } void WriteCompileModules() { char modules[300][100]; int module_count = 0; printf("Finding Modules...\n"); WIN32_FIND_DATA fd; HANDLE fh = FindFirstFile("..\\src\\modules\\m_*.cpp", &fd); if(fh == INVALID_HANDLE_VALUE) printf_c("\033[1;32m No module sources could be found! This \033[1m*could*\033[1;32m be a bad thing.. :P\033[0m"); else { sc(TGREEN); do { strcpy(modules[module_count], fd.cFileName); modules[module_count][strlen(fd.cFileName) - 4] = 0; printf(" %s\n", modules[module_count]); ++module_count; } while(FindNextFile(fh, &fd)); sc(TNORMAL); } // Write our spiffy new makefile :D // I am such a lazy fucker :P FILE * f = fopen("..\\src\\modules\\modules.mak", "w"); time_t t = time(NULL); fprintf(f, "# Generated at %s\n", ctime(&t)); fprintf(f, "all: makedir "); // dump modules.. first time :) for(int i = 0; i < module_count; ++i) fprintf(f, "%s.so ", modules[i]); fprintf(f, "\n.cpp.obj:\n"); #ifdef WIN64 // /MACHINE:X64 #ifdef _DEBUG fprintf(f, " cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /Gm /RTC1 /MTd /Fo\"Debug/\" /Fd\"Debug/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\debug_x64\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\debug_x64\\modules\\$*.so\" /PDB:\"..\\..\\bin\\debug_x64\\modules\\$*.pdb\" /MACHINE:X64 /IMPLIB:\"..\\..\\bin\\debug_x64\\modules\\$*.lib\"\n\n"); CreateDirectory("..\\src\\modules\\debug_x64", NULL); #else fprintf(f, " cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /EHsc /Gm /MT /Fo\"Release/\" /Fd\"Release/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\release_x64\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\release_x64\\modules\\$*.so\" /PDB:\"..\\..\\bin\\release_x64\\modules\\$*.pdb\" /MACHINE:X64 /IMPLIB:\"..\\..\\bin\\release_x64\\modules\\$*.lib\"\n\n"); CreateDirectory("..\\src\\modules\\release_x64", NULL); #endif #else #ifdef _DEBUG fprintf(f, " cl /nologo -Dssize_t=long /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /Gm /RTC1 /MTd /Fo\"Debug/\" /Fd\"Debug/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\debug\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\debug\\modules\\$*.so\" /PDB:\"..\\..\\bin\\debug\\modules\\$*.pdb\" /IMPLIB:\"..\\..\\bin\\debug\\modules\\$*.lib\"\n\n"); CreateDirectory("..\\src\\modules\\debug", NULL); #else fprintf(f, " cl /nologo -Dssize_t=long /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /EHsc /Gm /MT /Fo\"Release/\" /Fd\"Release/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\release\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\release\\modules\\$*.so\" /PDB:\"..\\..\\bin\\release\\modules\\$*.pdb\" /IMPLIB:\"..\\..\\bin\\release\\modules\\$*.lib\"\n\n"); CreateDirectory("..\\src\\modules\\release", NULL); #endif #endif fprintf(f, "makedir:\n if not exist debug mkdir debug\n\n"); // dump modules.. again the second and last time :) for(int i = 0; i < module_count; ++i) fprintf(f, "%s.so : %s.obj\n", modules[i], modules[i]); fprintf(f, "\n"); fclose(f); } \ No newline at end of file
+/* +------------------------------------+
+ * | Inspire Internet Relay Chat Daemon |
+ * +------------------------------------+
+ *
+ * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * See: http://www.inspircd.org/wiki/index.php/Credits
+ *
+ * This program is free but copyrighted software; see
+ * the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+#define _CRT_SECURE_NO_DEPRECATE
+
+#include <windows.h>
+#include <stdio.h>
+#include <string>
+#include <time.h>
+#include "colours.h"
+
+using namespace std;
+void Run();
+void Banner();
+void WriteCompileModules();
+void WriteCompileCommands();
+
+/* detects if we are running windows xp or higher (5.1) */
+bool iswinxp()
+{
+ OSVERSIONINFO vi;
+ vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&vi);
+ if(vi.dwMajorVersion >= 5)
+ return true;
+
+ return false;
+}
+
+int get_int_option(const char * text, int def)
+{
+ static char buffer[500];
+ int ret;
+ printf_c("%s\n[\033[1;32m%u\033[0m] -> ", text, def);
+ fgets(buffer, 500, stdin);
+ if(sscanf(buffer, "%u", &ret) != 1)
+ ret = def;
+
+ printf("\n");
+ return ret;
+}
+
+bool get_bool_option(const char * text, bool def)
+{
+ static char buffer[500];
+ char ret[100];
+ printf_c("%s [\033[1;32m%c\033[0m] -> ", text, def ? 'y' : 'n');
+ fgets(buffer, 500, stdin);
+ if(sscanf(buffer, "%s", ret) != 1)
+ strcpy(ret, def ? "y" : "n");
+
+ printf("\n");
+ return !strncmp(ret, "y", 1);
+}
+
+void get_string_option(const char * text, char * def, char * buf)
+{
+ static char buffer[500];
+ printf_c("%s\n[\033[1;32m%s\033[0m] -> ", text, def);
+ fgets(buffer, 500, stdin);
+ if(sscanf(buffer, "%s", buf) != 1)
+ strcpy(buf, def);
+
+ printf("\n");
+}
+
+// escapes a string for use in a c++ file
+bool escape_string(char * str, size_t size)
+{
+ size_t len = strlen(str);
+ char * d_str = (char*)malloc(len * 2);
+
+ size_t i = 0;
+ size_t j = 0;
+
+ for(; i < len; ++i)
+ {
+ if(str[i] == '\\')
+ {
+ d_str[j++] = '\\';
+ d_str[j++] = '\\';
+ }
+ else
+ {
+ d_str[j++] = str[i];
+ }
+ }
+
+ d_str[j++] = 0;
+
+ if(j > size)
+ {
+ free(d_str);
+ return false;
+ }
+
+ strcpy(str, d_str);
+ free(d_str);
+ return true;
+}
+
+/* gets the svn revision */
+int get_svn_revision(char * buffer, size_t len)
+{
+ /* again.. I am lazy :p cbf to pipe output of svn info to us, so i'll just read the file */
+ /*
+ 8
+
+ dir
+ 7033
+ */
+ char buf[1000];
+ FILE * f = fopen("..\\.svn\\entries", "r");
+ if(!f) goto bad_rev;
+
+ if(!fgets(buf, 1000, f)) goto bad_rev;
+ if(!fgets(buf, 1000, f)) goto bad_rev;
+ if(!fgets(buf, 1000, f)) goto bad_rev;
+ if(!fgets(buf, 1000, f)) goto bad_rev;
+ int rev = atoi(buf);
+ if(rev == 0) goto bad_rev;
+ sprintf(buffer, "%u", rev);
+ fclose(f);
+ return rev;
+
+bad_rev:
+ strcpy(buffer, "non-svn");
+ if(f) fclose(f);
+ return 0;
+}
+
+int __stdcall WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd )
+{
+ FILE * j = fopen("inspircd_config.h", "r");
+ if (j)
+ {
+ if (MessageBox(0, "inspircd_config.h already exists. Remove it and build from clean?", "Configure program", MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2) != IDYES)
+ {
+ fclose(j);
+ exit(0);
+ }
+ }
+
+ AllocConsole();
+
+ // pipe standard handles to this console
+ freopen("CONIN$", "r", stdin);
+ freopen("CONOUT$", "w", stdout);
+ freopen("CONOUT$", "w", stderr);
+
+ Banner();
+ Run();
+ WriteCompileCommands();
+ WriteCompileModules();
+ FreeConsole();
+ return 0;
+}
+
+void Banner()
+{
+ printf_c("\nWelcome to the \033[1mInspIRCd\033[0m Configuration program! (\033[1minteractive mode\033[0m)\n"
+ "\033[1mPackage maintainers: Type ./configure --help for non-interactive help\033[0m\n\n");
+ printf_c("*** If you are unsure of any of these values, leave it blank for ***\n"
+ "*** standard settings that will work, and your server will run ***\n"
+ "*** using them. Please consult your IRC network admin if in doubt. ***\n\n"
+ "Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter\n"
+ "a new value. Please note: You will \033[1mHAVE\033[0m to read the docs\n"
+ "dir, otherwise you won't have a config file!\n\n");
+
+}
+
+void Run()
+{
+ int max_fd = 1024;
+ bool use_iocp = false;
+ bool support_ip6links = false;
+ char mod_path[MAX_PATH];
+ char config_file[MAX_PATH];
+ char library_dir[MAX_PATH];
+ char base_path[MAX_PATH];
+ char bin_dir[MAX_PATH];
+ char revision_text[MAX_PATH];
+
+ int max_clients = 1024;
+ int nicklen = 31;
+ int chanlen = 64;
+ int modechanges = 20;
+ int identlen = 12;
+ int quitlen = 255;
+ int topiclen = 500;
+ int kicklen = 255;
+ int rllen = 128;
+ int awaylen = 200;
+ int revision = get_svn_revision(revision_text, MAX_PATH);
+ char version[514];
+
+ // grab version
+ FILE * fI = fopen("..\\src\\version.sh", "r");
+ if(fI)
+ {
+ fgets(version, 514, fI);
+ fgets(version, 514, fI);
+ char * p2 = version;
+ while(*p2 != '\"')
+ ++p2;
+ ++p2;
+ strcpy(version, p2);
+ p2 = version;
+ while(*p2 != '\"')
+ ++p2;
+ *p2 = 0;
+ fclose(fI);
+ }
+ else
+ strcpy(version, "InspIRCD-Unknown");
+#ifdef WIN64
+ printf_c("Your operating system is: \033[1;32mwindows_x64 \033[0m\n");
+#else
+ printf_c("Your operating system is: \033[1;32mwindows_x32 \033[0m\n");
+#endif
+ printf_c("InspIRCd revision ID: \033[1;32m%s \033[0m\n\n", revision ? revision_text : "(Non-SVN build)");
+
+ max_fd = get_int_option("What is the maximum file descriptor count you would like to allow?", 1024);
+
+ // detect windows
+ if(iswinxp())
+ {
+ printf_c("You are running Windows 2000 or above, and IOCP support is most likely available.\n"
+ "This removes the socket number limitation of select and is much more efficent.\n"
+ "If you are unsure, answer yes.\n\n");
+
+ use_iocp = get_bool_option("Do you want to use the IOCP implementation?", true);
+ }
+
+ support_ip6links = get_bool_option("\nYou have chosen to build an \033[1;32mIPV4-only\033[0m server.\nWould you like to enable support for linking to IPV6-enabled InspIRCd servers?\nIf you are using a recent operating system and are unsure, answer yes.\nIf you answer 'no' here, your InspIRCd server will be unable\nto parse IPV6 addresses (e.g. for CIDR bans)",
+ true);
+
+ printf_c("\033[1mAll paths are relative to the binary directory.\033[0m\n");
+ get_string_option("In what directory do you wish to install the InspIRCd base?", "..", base_path);
+ get_string_option("In what directory are the configuration files?", "../conf", config_file);
+ get_string_option("In what directory are the modules to be compiled to?", "../modules", mod_path);
+ get_string_option("In what directory is the IRCd binary to be placed?", ".", bin_dir);
+ get_string_option("In what directory are the IRCd libraries to be placed?", "../lib", library_dir);
+
+ printf_c("The following questions will ask you for various figures relating\n"
+ "To your IRCd install. Please note that these should usually be left\n"
+ "as defaults unless you have a real reason to change them. If they\n"
+ "changed, then the values must be identical on all servers on your\n"
+ "network, or malfunctions and/or crashes may occur, with the exception\n"
+ "of the 'maximum number of clients' setting which may be different on\n"
+ "different servers on the network.\n\n");
+
+
+ max_clients = get_int_option("Please enter the maximum number of clients at any one time?", 1024);
+ nicklen = get_int_option("Please enter the maximum length of nicknames?", 31);
+ chanlen = get_int_option("Please enter the maximum length of channel names?", 64);
+ modechanges = get_int_option("Please enter the maximum number of mode changes in one line?", 20);
+ identlen = get_int_option("Please enter the maximum length of an ident (username)?", 12);
+ quitlen = get_int_option("Please enter the maximum length of a quit message?", 255);
+ topiclen = get_int_option("Please enter the maximum length of a channel topic?", 307);
+ kicklen = get_int_option("Please enter the maximum length of a kick message?", 255);
+ rllen = get_int_option("Please enter the maximum length of a GECOS (real name)?", 128);
+ awaylen = get_int_option("Please enter the maximum length of an away message?", 200);
+
+ printf_c("\n\033[1;32mPre-build configuration is complete!\n\n"); sc(TNORMAL);
+
+ // dump all the options back out
+ printf_c("\033[0mBase install path:\033[1;32m %s\n", base_path);
+ printf_c("\033[0mConfig path:\033[1;32m %s\n", config_file);
+ printf_c("\033[0mModule path:\033[1;32m %s\n", mod_path);
+ printf_c("\033[0mLibrary path:\033[1;32m %s\n", library_dir);
+ printf_c("\033[0mSocket Engine:\033[1;32m %s\n", use_iocp ? "iocp" : "select");
+ printf_c("\033[0mMax file descriptors:\033[1;32m %u\n", max_fd);
+ printf_c("\033[0mMax connections:\033[1;32m %u\n", max_clients);
+ printf_c("\033[0mMax nickname length:\033[1;32m %u\n", nicklen);
+ printf_c("\033[0mMax channel length:\033[1;32m %u\n", chanlen);
+ printf_c("\033[0mMax mode length:\033[1;32m %u\n", modechanges);
+ printf_c("\033[0mMax ident length:\033[1;32m %u\n", identlen);
+ printf_c("\033[0mMax quit length:\033[1;32m %u\n", quitlen);
+ printf_c("\033[0mMax topic length:\033[1;32m %u\n", topiclen);
+ printf_c("\033[0mMax kick length:\033[1;32m %u\n", kicklen);
+ printf_c("\033[0mMax name length:\033[1;32m %u\n", rllen);
+ printf_c("\033[0mMax away length:\033[1;32m %u\n", awaylen);
+ printf("\n"); sc(TNORMAL);
+ if(get_bool_option("Are these settings correct?", true) == false)
+ {
+ Run();
+ return;
+ }
+ printf("\n");
+
+ // escape the pathes
+ escape_string(config_file, MAX_PATH);
+ escape_string(mod_path, MAX_PATH);
+ escape_string(library_dir, MAX_PATH);
+
+ printf("\nWriting inspircd_config.h...");
+ FILE * f = fopen("inspircd_config.h", "w");
+ fprintf(f, "/* Auto generated by configure, do not modify! */\n");
+ fprintf(f, "#ifndef __CONFIGURATION_AUTO__\n");
+ fprintf(f, "#define __CONFIGURATION_AUTO__\n\n");
+ if(use_iocp)
+ fprintf(f, "#define CONFIG_USE_IOCP 1\n\n");
+
+ fprintf(f, "#define CONFIG_FILE \"%s/inspircd.conf\"\n", config_file);
+ fprintf(f, "#define MOD_PATH \"%s\"\n", mod_path);
+ fprintf(f, "#define MAX_DESCRIPTORS %u\n", max_fd);
+ fprintf(f, "#define MAXCLIENTS %u\n", max_clients);
+ fprintf(f, "#define MAXCLIENTS_S \"%u\"\n", max_clients);
+ fprintf(f, "#define SOMAXCONN_S \"128\"\n");
+ fprintf(f, "#define NICKMAX %u\n", nicklen+1);
+ fprintf(f, "#define CHANMAX %u\n", chanlen+1);
+ fprintf(f, "#define MAXMODES %u\n", modechanges);
+ fprintf(f, "#define IDENTMAX %u\n", identlen);
+ fprintf(f, "#define MAXQUIT %u\n", quitlen);
+ fprintf(f, "#define MAXTOPIC %u\n", topiclen);
+ fprintf(f, "#define MAXKICK %u\n", kicklen);
+ fprintf(f, "#define MAXGECOS %u\n", rllen);
+ fprintf(f, "#define MAXAWAY %u\n", awaylen);
+ fprintf(f, "#define LIBRARYDIR \"%s\"\n", library_dir);
+ fprintf(f, "#define VERSION \"%s\"\n", version);
+ fprintf(f, "#define REVISION \"%s\"\n", revision_text);
+ if(support_ip6links)
+ fprintf(f, "#define SUPPORT_IP6LINKS 1\n");
+
+ OSVERSIONINFO vi;
+ vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&vi);
+#ifdef WIN64
+ fprintf(f, "#define SYSTEM \"Windows_x64 %u.%u.%u %s\"\n", vi.dwMajorVersion, vi.dwMinorVersion, vi.dwBuildNumber, vi.szCSDVersion);
+#else
+ fprintf(f, "#define SYSTEM \"Windows_x32 %u.%u.%u %s\"\n", vi.dwMajorVersion, vi.dwMinorVersion, vi.dwBuildNumber, vi.szCSDVersion);
+#endif
+ fprintf(f, "#define MAXBUF 514\n");
+
+ fprintf(f, "\n#include \"inspircd_win32wrapper.h\"\n\n");
+ fprintf(f, "#endif\n\n");
+ fclose(f);
+
+ sc(TGREEN); printf(" done\n"); sc(TNORMAL);
+ printf("Writing inspircd_se_config.h...");
+
+ f = fopen("inspircd_se_config.h", "w");
+ fprintf(f, "/* Auto generated by configure, do not modify or commit to svn! */\n");
+ fprintf(f, "#ifndef __CONFIGURATION_SOCKETENGINE__\n");
+ fprintf(f, "#define __CONFIGURATION_SOCKETENGINE__\n\n");
+ fprintf(f, "#include \"socketengine_%s.h\"\n\n", use_iocp ? "iocp" : "select");
+ fprintf(f, "#endif\n\n");
+ fclose(f);
+
+ sc(TGREEN); printf(" done\n"); sc(TNORMAL);
+ printf("Writing command and module compilation scripts...");
+ WriteCompileCommands();
+ WriteCompileModules();
+ sc(TGREEN); printf(" done\n"); sc(TNORMAL);
+
+ printf("\nconfigure is done.. exiting!\n");
+}
+
+void WriteCompileCommands()
+{
+ char commands[300][100];
+ int command_count = 0;
+ printf("\n Finding Command Sources...\n");
+ WIN32_FIND_DATA fd;
+ HANDLE fh = FindFirstFile("..\\src\\cmd_*.cpp", &fd);
+ if(fh == INVALID_HANDLE_VALUE)
+ printf_c("\033[1;32m No command sources could be found! This \033[1m*could*\033[1;32m be a bad thing.. :P\033[0m");
+ else
+ {
+ sc(TGREEN);
+ do
+ {
+ strcpy(commands[command_count], fd.cFileName);
+ commands[command_count][strlen(fd.cFileName) - 4] = 0;
+ printf(" %s\n", commands[command_count]);
+ ++command_count;
+ } while(FindNextFile(fh, &fd));
+ sc(TNORMAL);
+ }
+
+ // Write our spiffy new makefile :D
+ // I am such a lazy fucker :P
+ FILE * f = fopen("..\\src\\commands.mak", "w");
+
+ time_t t = time(NULL);
+ fprintf(f, "# Generated at %s\n", ctime(&t));
+ fprintf(f, "all: makedir ");
+
+ // dump modules.. first time :)
+ for(int i = 0; i < command_count; ++i)
+ fprintf(f, "%s.so ", commands[i]);
+
+ fprintf(f, "\n.cpp.obj:\n");
+#ifdef WIN64
+ // /MACHINE:X64
+ #ifdef _DEBUG
+ fprintf(f, " cl /nologo /LD /Od /I \".\" /I \"../include\" /I \"../include/modes\" /I \"../include/commands\" /I \"../win\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /Gm /RTC1 /MTd /Fo\"Debug/\" /Fd\"Debug/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\win\\inspircd_memory_functions.cpp /link ..\\bin\\debug_x64\\bin\\inspircd.lib /OUT:\"..\\bin\\debug_x64\\lib\\$*.so\" /PDB:\"..\\bin\\debug_x64\\lib\\$*.pdb\" /MACHINE:X64 /IMPLIB:\"..\\bin\\debug_x64\\lib\\$*.lib\"\n\n");
+ CreateDirectory("..\\src\\debug", NULL);
+ CreateDirectory("..\\bin\\debug\\bin", NULL);
+ CreateDirectory("..\\bin\\debug\\lib", NULL);
+ CreateDirectory("..\\bin\\debug\\modules", NULL);
+ #else
+ fprintf(f, " cl /nologo /LD /Od /I \".\" /I \"../include\" /I \"../include/modes\" /I \"../include/commands\" /I \"../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /EHsc /Gm /MT /Fo\"Release/\" /Fd\"Release/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\win\\inspircd_memory_functions.cpp /link ..\\bin\\release_x64\\bin\\inspircd.lib /OUT:\"..\\bin\\release_x64\\lib\\$*.so\" /PDB:\"..\\bin\\release_x64\\lib\\$*.pdb\" /MACHINE:X64 /IMPLIB:\"..\\bin\\release_x64\\lib\\$*.lib\"\n\n");
+ CreateDirectory("..\\src\\release", NULL);
+ CreateDirectory("..\\bin\\release\\bin", NULL);
+ CreateDirectory("..\\bin\\release\\lib", NULL);
+ CreateDirectory("..\\bin\\release\\modules", NULL);
+ #endif
+#else
+ #ifdef _DEBUG
+ fprintf(f, " cl /nologo /LD /Od /I \".\" /I \"../include\" /I \"../include/modes\" /I \"../include/commands\" /I \"../win\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /Gm /RTC1 /MTd /Fo\"Debug/\" /Fd\"Debug/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\win\\inspircd_memory_functions.cpp /link ..\\bin\\debug\\bin\\inspircd.lib /OUT:\"..\\bin\\debug\\lib\\$*.so\" /PDB:\"..\\bin\\debug\\lib\\$*.pdb\" /IMPLIB:\"..\\bin\\debug\\lib\\$*.lib\"\n\n");
+ CreateDirectory("..\\src\\debug", NULL);
+ CreateDirectory("..\\bin\\debug\\bin", NULL);
+ CreateDirectory("..\\bin\\debug\\lib", NULL);
+ CreateDirectory("..\\bin\\debug\\modules", NULL);
+ #else
+ fprintf(f, " cl /nologo /LD /Od /I \".\" /I \"../include\" /I \"../include/modes\" /I \"../include/commands\" /I \"../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /EHsc /Gm /MT /Fo\"Release/\" /Fd\"Release/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\win\\inspircd_memory_functions.cpp /link ..\\bin\\release\\bin\\inspircd.lib /OUT:\"..\\bin\\release\\lib\\$*.so\" /PDB:\"..\\bin\\release\\lib\\$*.pdb\" /IMPLIB:\"..\\bin\\release\\lib\\$*.lib\"\n\n");
+ CreateDirectory("..\\src\\release", NULL);
+ CreateDirectory("..\\bin\\release\\bin", NULL);
+ CreateDirectory("..\\bin\\release\\lib", NULL);
+ CreateDirectory("..\\bin\\release\\modules", NULL);
+ #endif
+#endif
+
+ fprintf(f, "makedir:\n if not exist debug mkdir debug\n\n");
+
+ // dump modules.. again the second and last time :)
+ for(int i = 0; i < command_count; ++i)
+ fprintf(f, "%s.so : %s.obj\n", commands[i], commands[i]);
+
+ fprintf(f, "\n");
+ fclose(f);
+}
+
+void WriteCompileModules()
+{
+ char modules[300][100];
+ int module_count = 0;
+
+ printf("Finding Modules...\n");
+ WIN32_FIND_DATA fd;
+ HANDLE fh = FindFirstFile("..\\src\\modules\\m_*.cpp", &fd);
+ if(fh == INVALID_HANDLE_VALUE)
+ printf_c("\033[1;32m No module sources could be found! This \033[1m*could*\033[1;32m be a bad thing.. :P\033[0m");
+ else
+ {
+ sc(TGREEN);
+ do
+ {
+ strcpy(modules[module_count], fd.cFileName);
+ modules[module_count][strlen(fd.cFileName) - 4] = 0;
+ printf(" %s\n", modules[module_count]);
+ ++module_count;
+ } while(FindNextFile(fh, &fd));
+ sc(TNORMAL);
+ }
+
+ // Write our spiffy new makefile :D
+ // I am such a lazy fucker :P
+ FILE * f = fopen("..\\src\\modules\\modules.mak", "w");
+
+ time_t t = time(NULL);
+ fprintf(f, "# Generated at %s\n", ctime(&t));
+ fprintf(f, "all: makedir ");
+
+ // dump modules.. first time :)
+ for(int i = 0; i < module_count; ++i)
+ fprintf(f, "%s.so ", modules[i]);
+
+ fprintf(f, "\n.cpp.obj:\n");
+#ifdef WIN64
+ // /MACHINE:X64
+ #ifdef _DEBUG
+ fprintf(f, " cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /Gm /RTC1 /MTd /Fo\"Debug/\" /Fd\"Debug/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\debug_x64\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\debug_x64\\modules\\$*.so\" /PDB:\"..\\..\\bin\\debug_x64\\modules\\$*.pdb\" /MACHINE:X64 /IMPLIB:\"..\\..\\bin\\debug_x64\\modules\\$*.lib\"\n\n");
+ CreateDirectory("..\\src\\modules\\debug_x64", NULL);
+ #else
+ fprintf(f, " cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /EHsc /Gm /MT /Fo\"Release/\" /Fd\"Release/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\release_x64\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\release_x64\\modules\\$*.so\" /PDB:\"..\\..\\bin\\release_x64\\modules\\$*.pdb\" /MACHINE:X64 /IMPLIB:\"..\\..\\bin\\release_x64\\modules\\$*.lib\"\n\n");
+ CreateDirectory("..\\src\\modules\\release_x64", NULL);
+ #endif
+#else
+ #ifdef _DEBUG
+ fprintf(f, " cl /nologo -Dssize_t=long /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /Gm /RTC1 /MTd /Fo\"Debug/\" /Fd\"Debug/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\debug\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\debug\\modules\\$*.so\" /PDB:\"..\\..\\bin\\debug\\modules\\$*.pdb\" /IMPLIB:\"..\\..\\bin\\debug\\modules\\$*.lib\"\n\n");
+ CreateDirectory("..\\src\\modules\\debug", NULL);
+ #else
+ fprintf(f, " cl /nologo -Dssize_t=long /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /EHsc /Gm /MT /Fo\"Release/\" /Fd\"Release/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\release\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\release\\modules\\$*.so\" /PDB:\"..\\..\\bin\\release\\modules\\$*.pdb\" /IMPLIB:\"..\\..\\bin\\release\\modules\\$*.lib\"\n\n");
+ CreateDirectory("..\\src\\modules\\release", NULL);
+ #endif
+#endif
+
+ fprintf(f, "makedir:\n if not exist debug mkdir debug\n\n");
+
+ // dump modules.. again the second and last time :)
+ for(int i = 0; i < module_count; ++i)
+ fprintf(f, "%s.so : %s.obj\n", modules[i], modules[i]);
+
+ fprintf(f, "\n");
+ fclose(f);
+}
diff --git a/win/inspircd.nsi b/win/inspircd.nsi
index 092fae309..96b2e498e 100644
--- a/win/inspircd.nsi
+++ b/win/inspircd.nsi
@@ -1 +1,272 @@
-; * +------------------------------------+ ; * | Inspire Internet Relay Chat Daemon | ; * +------------------------------------+ ; * ; * InspIRCd: (C) 2002-2007 InspIRCd Development Team ; * See: http://www.inspircd.org/wiki/index.php/Credits ; * ; * This program is free but copyrighted software; see ; * the file COPYING for details. ; * ; * --------------------------------------------------- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; SET THE BUILD TO BE PACKAGED HERE ;;;; !define BUILD "release" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; HM NIS Edit Wizard helper defines !define PRODUCT_NAME "InspIRCd" !define PRODUCT_VERSION "1.1" !define PRODUCT_PUBLISHER "InspIRCd Development Team" !define PRODUCT_WEB_SITE "http://www.inspircd.org/" !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\inspircd.exe" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" !define DOT_MAJOR "2" !define DOT_MINOR "0" SetCompressor bzip2 ; MUI 1.67 compatible ------ !include "MUI.nsh" ; MUI Settings !define MUI_ABORTWARNING !define MUI_ICON "inspircd.ico" !define MUI_UNICON "inspircd.ico" ; Welcome page !insertmacro MUI_PAGE_WELCOME ; License page !define MUI_LICENSEPAGE_CHECKBOX !insertmacro MUI_PAGE_LICENSE "..\docs\COPYING" ; directory page Page directory ; Components page !insertmacro MUI_PAGE_COMPONENTS ; Instfiles page !insertmacro MUI_PAGE_INSTFILES ; Finish page !define MUI_FINISHPAGE_RUN "$INSTDIR\InspGUI.exe" !insertmacro MUI_PAGE_FINISH ; Uninstaller pages !insertmacro MUI_UNPAGE_INSTFILES ; Language files !insertmacro MUI_LANGUAGE "English" ; Reserve files !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS ; MUI end ------ Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" OutFile "Setup.exe" InstallDir "$PROGRAMFILES\InspIRCd" InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" ShowInstDetails show ShowUnInstDetails show Function IsDotNetInstalled StrCpy $0 "0" StrCpy $1 "SOFTWARE\Microsoft\.NETFramework" ;registry entry to look in. StrCpy $2 0 StartEnum: ;Enumerate the versions installed. EnumRegKey $3 HKLM "$1\policy" $2 ;If we don't find any versions installed, it's not here. StrCmp $3 "" noDotNet notEmpty ;We found something. notEmpty: ;Find out if the RegKey starts with 'v'. ;If it doesn't, goto the next key. StrCpy $4 $3 1 0 StrCmp $4 "v" +1 goNext StrCpy $4 $3 1 1 ;It starts with 'v'. Now check to see how the installed major version ;relates to our required major version. ;If it's equal check the minor version, if it's greater, ;we found a good RegKey. IntCmp $4 ${DOT_MAJOR} +1 goNext yesDotNetReg ;Check the minor version. If it's equal or greater to our requested ;version then we're good. StrCpy $4 $3 1 3 IntCmp $4 ${DOT_MINOR} yesDotNetReg goNext yesDotNetReg goNext: ;Go to the next RegKey. IntOp $2 $2 + 1 goto StartEnum yesDotNetReg: ;Now that we've found a good RegKey, let's make sure it's actually ;installed by getting the install path and checking to see if the ;mscorlib.dll exists. EnumRegValue $2 HKLM "$1\policy\$3" 0 ;$2 should equal whatever comes after the major and minor versions ;(ie, v1.1.4322) StrCmp $2 "" noDotNet ReadRegStr $4 HKLM $1 "InstallRoot" ;Hopefully the install root isn't empty. StrCmp $4 "" noDotNet ;build the actuall directory path to mscorlib.dll. StrCpy $4 "$4$3.$2\mscorlib.dll" IfFileExists $4 yesDotNet noDotNet noDotNet: MessageBox MB_OK "You do not have have v${DOT_MAJOR}.${DOT_MINOR} or greater of the .NET framework installed. This is required for the InspIRCd Monitor, however you can still launch the IRCd manually." yesDotNet: ;Everything checks out. Go on with the rest of the installation. FunctionEnd Section "Binary Executable" SEC01 Call IsDotNetInstalled SetOutPath "$INSTDIR" SetOverwrite ifnewer File "..\bin\${BUILD}\InspGUI.exe" CreateDirectory "$SMPROGRAMS\InspIRCd" CreateShortCut "$SMPROGRAMS\InspIRCd\InspIRCd.lnk" "$INSTDIR\InspGUI.exe" SetOutPath "$INSTDIR\bin" SetOverwrite ifnewer File "..\bin\${BUILD}\bin\inspircd.exe" SectionEnd Section "Config Files" SEC02 SetOutPath "$INSTDIR\conf" File "..\conf\inspircd.motd.example" File "..\conf\inspircd.helpop-full.example" File "..\conf\inspircd.helpop.example" File "..\conf\inspircd.filter.example" File "..\docs\inspircd.conf.example" File "..\conf\inspircd.censor.example" File "..\conf\inspircd.rules.example" File "..\conf\inspircd.quotes.example" SectionEnd Section "Command Handlers" SEC03 SetOutPath "$INSTDIR\lib" File "..\bin\${BUILD}\lib\cmd_*.so" SectionEnd Section "Modules" SEC04 SetOutPath "$INSTDIR\modules" File "..\bin\${BUILD}\modules\m_*.so" SectionEnd Section "SSL Modules" SEC05 SetOutPath "$INSTDIR\bin" SetOverwrite ifnewer File "..\bin\${BUILD}\bin\libgcrypt-11.dll" File "..\bin\${BUILD}\bin\libgnutls-13.dll" File "..\bin\${BUILD}\bin\libgnutls-extra-13.dll" File "..\bin\${BUILD}\bin\libgnutls-openssl-13.dll" File "..\bin\${BUILD}\bin\libgpg-error-0.dll" File "..\bin\${BUILD}\bin\libopencdk-8.dll" File "..\bin\${BUILD}\bin\libtasn1-3.dll" SetOutPath "$INSTDIR\modules" File "d:\temp\m_ssl_gnutls.so" File "d:\temp\m_sslinfo.so" File "d:\temp\m_ssl_oper_cert.so" SetOutPath "$INSTDIR\conf" SetOverwrite off File "key.pem" File "cert.pem" SectionEnd Section "Regexp Modules" SEC06 SetOutPath "$INSTDIR\bin" SetOverwrite ifnewer File "..\bin\${BUILD}\bin\pcre.dll" SetOutPath "$INSTDIR\modules" File "d:\temp\m_filter_pcre.so" SectionEnd Section -AdditionalIcons SetOutPath $INSTDIR WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" CreateShortCut "$SMPROGRAMS\InspIRCd\InspIRCd Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url" CreateShortCut "$SMPROGRAMS\InspIRCd\Uninstall.lnk" "$INSTDIR\uninst.exe" SectionEnd Section -Post WriteUninstaller "$INSTDIR\uninst.exe" WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\bin\inspircd.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\bin\inspircd.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" MessageBox MB_ICONINFORMATION|MB_OK "InspIRCd was successfully installed. Remember to edit your configuration file in $INSTDIR\conf!" SectionEnd ; Section descriptions !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SEC01} "Actual executable" !insertmacro MUI_DESCRIPTION_TEXT ${SEC03} "Command modules" !insertmacro MUI_DESCRIPTION_TEXT ${SEC02} "Default configuration files" !insertmacro MUI_DESCRIPTION_TEXT ${SEC04} "Optional non-SSL modules" !insertmacro MUI_DESCRIPTION_TEXT ${SEC05} "SSL modules and GnuTLS DLL libraries" !insertmacro MUI_DESCRIPTION_TEXT ${SEC06} "Regular expression module and PCRE DLL library" !insertmacro MUI_FUNCTION_DESCRIPTION_END Function un.onUninstSuccess HideWindow MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was successfully removed from your computer." FunctionEnd Function .onInit SectionSetFlags ${SEC01} 17 SectionSetFlags ${SEC03} 17 StrCpy $INSTDIR "$PROGRAMFILES\InspIRCd" FunctionEnd Function un.onInit MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely remove $(^Name) and all of its components?" IDYES +2 Abort FunctionEnd Section Uninstall Delete "$INSTDIR\${PRODUCT_NAME}.url" Delete "$INSTDIR\uninst.exe" Delete "$INSTDIR\modules\m_*.so" Delete "$INSTDIR\lib\cmd_*.so" Delete "$INSTDIR\conf\inspircd.quotes.example" Delete "$INSTDIR\conf\inspircd.rules.example" Delete "$INSTDIR\conf\inspircd.censor.example" Delete "$INSTDIR\conf\inspircd.conf.example" Delete "$INSTDIR\conf\inspircd.filter.example" Delete "$INSTDIR\conf\inspircd.helpop.example" Delete "$INSTDIR\conf\inspircd.helpop-full.example" Delete "$INSTDIR\conf\inspircd.motd.example" Delete "$INSTDIR\bin\inspircd.exe" Delete "$INSTDIR\bin\*.dll" Delete "$INSTDIR\InspGUI.exe" Delete "$SMPROGRAMS\InspIRCd\Uninstall.lnk" Delete "$SMPROGRAMS\InspIRCd\InspIRCd Website.lnk" Delete "$SMPROGRAMS\InspIRCd\InspIRCd.lnk" RMDir "$SMPROGRAMS\InspIRCd" RMDir "$INSTDIR\modules" RMDir "$INSTDIR\lib" RMDir "$INSTDIR\conf" RMDir "$INSTDIR\bin" RMDir "$INSTDIR" DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" SetAutoClose true SectionEnd \ No newline at end of file
+; * +------------------------------------+
+; * | Inspire Internet Relay Chat Daemon |
+; * +------------------------------------+
+; *
+; * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+; * See: http://www.inspircd.org/wiki/index.php/Credits
+; *
+; * This program is free but copyrighted software; see
+; * the file COPYING for details.
+; *
+; * ---------------------------------------------------
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ ;;;; SET THE BUILD TO BE PACKAGED HERE ;;;;
+
+!define BUILD "release"
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; HM NIS Edit Wizard helper defines
+!define PRODUCT_NAME "InspIRCd"
+!define PRODUCT_VERSION "1.1"
+!define PRODUCT_PUBLISHER "InspIRCd Development Team"
+!define PRODUCT_WEB_SITE "http://www.inspircd.org/"
+!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\inspircd.exe"
+!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
+!define PRODUCT_UNINST_ROOT_KEY "HKLM"
+!define DOT_MAJOR "2"
+!define DOT_MINOR "0"
+
+SetCompressor bzip2
+
+; MUI 1.67 compatible ------
+!include "MUI.nsh"
+
+; MUI Settings
+!define MUI_ABORTWARNING
+!define MUI_ICON "inspircd.ico"
+!define MUI_UNICON "inspircd.ico"
+
+; Welcome page
+!insertmacro MUI_PAGE_WELCOME
+; License page
+!define MUI_LICENSEPAGE_CHECKBOX
+!insertmacro MUI_PAGE_LICENSE "..\docs\COPYING"
+; directory page
+Page directory
+; Components page
+!insertmacro MUI_PAGE_COMPONENTS
+; Instfiles page
+!insertmacro MUI_PAGE_INSTFILES
+; Finish page
+!define MUI_FINISHPAGE_RUN "$INSTDIR\InspGUI.exe"
+!insertmacro MUI_PAGE_FINISH
+
+; Uninstaller pages
+!insertmacro MUI_UNPAGE_INSTFILES
+
+; Language files
+!insertmacro MUI_LANGUAGE "English"
+
+; Reserve files
+!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
+
+; MUI end ------
+
+Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
+OutFile "Setup.exe"
+InstallDir "$PROGRAMFILES\InspIRCd"
+InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
+ShowInstDetails show
+ShowUnInstDetails show
+
+Function IsDotNetInstalled
+
+ StrCpy $0 "0"
+ StrCpy $1 "SOFTWARE\Microsoft\.NETFramework" ;registry entry to look in.
+ StrCpy $2 0
+
+ StartEnum:
+ ;Enumerate the versions installed.
+ EnumRegKey $3 HKLM "$1\policy" $2
+
+ ;If we don't find any versions installed, it's not here.
+ StrCmp $3 "" noDotNet notEmpty
+
+ ;We found something.
+ notEmpty:
+ ;Find out if the RegKey starts with 'v'.
+ ;If it doesn't, goto the next key.
+ StrCpy $4 $3 1 0
+ StrCmp $4 "v" +1 goNext
+ StrCpy $4 $3 1 1
+
+ ;It starts with 'v'. Now check to see how the installed major version
+ ;relates to our required major version.
+ ;If it's equal check the minor version, if it's greater,
+ ;we found a good RegKey.
+ IntCmp $4 ${DOT_MAJOR} +1 goNext yesDotNetReg
+ ;Check the minor version. If it's equal or greater to our requested
+ ;version then we're good.
+ StrCpy $4 $3 1 3
+ IntCmp $4 ${DOT_MINOR} yesDotNetReg goNext yesDotNetReg
+
+ goNext:
+ ;Go to the next RegKey.
+ IntOp $2 $2 + 1
+ goto StartEnum
+
+ yesDotNetReg:
+ ;Now that we've found a good RegKey, let's make sure it's actually
+ ;installed by getting the install path and checking to see if the
+ ;mscorlib.dll exists.
+ EnumRegValue $2 HKLM "$1\policy\$3" 0
+ ;$2 should equal whatever comes after the major and minor versions
+ ;(ie, v1.1.4322)
+ StrCmp $2 "" noDotNet
+ ReadRegStr $4 HKLM $1 "InstallRoot"
+ ;Hopefully the install root isn't empty.
+ StrCmp $4 "" noDotNet
+ ;build the actuall directory path to mscorlib.dll.
+ StrCpy $4 "$4$3.$2\mscorlib.dll"
+ IfFileExists $4 yesDotNet noDotNet
+
+ noDotNet:
+ MessageBox MB_OK "You do not have have v${DOT_MAJOR}.${DOT_MINOR} or greater of the .NET framework installed. This is required for the InspIRCd Monitor, however you can still launch the IRCd manually."
+
+ yesDotNet:
+ ;Everything checks out. Go on with the rest of the installation.
+
+FunctionEnd
+
+Section "Binary Executable" SEC01
+ Call IsDotNetInstalled
+ SetOutPath "$INSTDIR"
+ SetOverwrite ifnewer
+ File "..\bin\${BUILD}\InspGUI.exe"
+ CreateDirectory "$SMPROGRAMS\InspIRCd"
+ CreateShortCut "$SMPROGRAMS\InspIRCd\InspIRCd.lnk" "$INSTDIR\InspGUI.exe"
+ SetOutPath "$INSTDIR\bin"
+ SetOverwrite ifnewer
+ File "..\bin\${BUILD}\bin\inspircd.exe"
+SectionEnd
+
+Section "Config Files" SEC02
+ SetOutPath "$INSTDIR\conf"
+ File "..\conf\inspircd.motd.example"
+ File "..\conf\inspircd.helpop-full.example"
+ File "..\conf\inspircd.helpop.example"
+ File "..\conf\inspircd.filter.example"
+ File "..\docs\inspircd.conf.example"
+ File "..\conf\inspircd.censor.example"
+ File "..\conf\inspircd.rules.example"
+ File "..\conf\inspircd.quotes.example"
+SectionEnd
+
+Section "Command Handlers" SEC03
+ SetOutPath "$INSTDIR\lib"
+ File "..\bin\${BUILD}\lib\cmd_*.so"
+SectionEnd
+
+Section "Modules" SEC04
+ SetOutPath "$INSTDIR\modules"
+ File "..\bin\${BUILD}\modules\m_*.so"
+SectionEnd
+
+Section "SSL Modules" SEC05
+ SetOutPath "$INSTDIR\bin"
+ SetOverwrite ifnewer
+ File "..\bin\${BUILD}\bin\libgcrypt-11.dll"
+ File "..\bin\${BUILD}\bin\libgnutls-13.dll"
+ File "..\bin\${BUILD}\bin\libgnutls-extra-13.dll"
+ File "..\bin\${BUILD}\bin\libgnutls-openssl-13.dll"
+ File "..\bin\${BUILD}\bin\libgpg-error-0.dll"
+ File "..\bin\${BUILD}\bin\libopencdk-8.dll"
+ File "..\bin\${BUILD}\bin\libtasn1-3.dll"
+ SetOutPath "$INSTDIR\modules"
+ File "d:\temp\m_ssl_gnutls.so"
+ File "d:\temp\m_sslinfo.so"
+ File "d:\temp\m_ssl_oper_cert.so"
+ SetOutPath "$INSTDIR\conf"
+ SetOverwrite off
+ File "key.pem"
+ File "cert.pem"
+SectionEnd
+
+Section "Regexp Modules" SEC06
+ SetOutPath "$INSTDIR\bin"
+ SetOverwrite ifnewer
+ File "..\bin\${BUILD}\bin\pcre.dll"
+ SetOutPath "$INSTDIR\modules"
+ File "d:\temp\m_filter_pcre.so"
+SectionEnd
+
+Section -AdditionalIcons
+ SetOutPath $INSTDIR
+ WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
+ CreateShortCut "$SMPROGRAMS\InspIRCd\InspIRCd Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
+ CreateShortCut "$SMPROGRAMS\InspIRCd\Uninstall.lnk" "$INSTDIR\uninst.exe"
+SectionEnd
+
+Section -Post
+ WriteUninstaller "$INSTDIR\uninst.exe"
+ WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\bin\inspircd.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\bin\inspircd.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
+ MessageBox MB_ICONINFORMATION|MB_OK "InspIRCd was successfully installed. Remember to edit your configuration file in $INSTDIR\conf!"
+SectionEnd
+
+; Section descriptions
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+ !insertmacro MUI_DESCRIPTION_TEXT ${SEC01} "Actual executable"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SEC03} "Command modules"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SEC02} "Default configuration files"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SEC04} "Optional non-SSL modules"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SEC05} "SSL modules and GnuTLS DLL libraries"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SEC06} "Regular expression module and PCRE DLL library"
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+
+Function un.onUninstSuccess
+ HideWindow
+ MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was successfully removed from your computer."
+FunctionEnd
+
+Function .onInit
+ SectionSetFlags ${SEC01} 17
+ SectionSetFlags ${SEC03} 17
+ StrCpy $INSTDIR "$PROGRAMFILES\InspIRCd"
+FunctionEnd
+
+Function un.onInit
+ MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely remove $(^Name) and all of its components?" IDYES +2
+ Abort
+FunctionEnd
+
+Section Uninstall
+ Delete "$INSTDIR\${PRODUCT_NAME}.url"
+ Delete "$INSTDIR\uninst.exe"
+ Delete "$INSTDIR\modules\m_*.so"
+ Delete "$INSTDIR\lib\cmd_*.so"
+ Delete "$INSTDIR\conf\inspircd.quotes.example"
+ Delete "$INSTDIR\conf\inspircd.rules.example"
+ Delete "$INSTDIR\conf\inspircd.censor.example"
+ Delete "$INSTDIR\conf\inspircd.conf.example"
+ Delete "$INSTDIR\conf\inspircd.filter.example"
+ Delete "$INSTDIR\conf\inspircd.helpop.example"
+ Delete "$INSTDIR\conf\inspircd.helpop-full.example"
+ Delete "$INSTDIR\conf\inspircd.motd.example"
+ Delete "$INSTDIR\bin\inspircd.exe"
+ Delete "$INSTDIR\bin\*.dll"
+ Delete "$INSTDIR\InspGUI.exe"
+ Delete "$SMPROGRAMS\InspIRCd\Uninstall.lnk"
+ Delete "$SMPROGRAMS\InspIRCd\InspIRCd Website.lnk"
+ Delete "$SMPROGRAMS\InspIRCd\InspIRCd.lnk"
+
+ RMDir "$SMPROGRAMS\InspIRCd"
+ RMDir "$INSTDIR\modules"
+ RMDir "$INSTDIR\lib"
+ RMDir "$INSTDIR\conf"
+ RMDir "$INSTDIR\bin"
+ RMDir "$INSTDIR"
+
+ DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
+ DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
+ SetAutoClose true
+SectionEnd
diff --git a/win/inspircd_memory_functions.cpp b/win/inspircd_memory_functions.cpp
index 29c37a42e..afff4287e 100644
--- a/win/inspircd_memory_functions.cpp
+++ b/win/inspircd_memory_functions.cpp
@@ -1 +1,44 @@
-/* +------------------------------------+ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * * InspIRCd: (C) 2002-2007 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see * the file COPYING for details. * * --------------------------------------------------- */ #include "inspircd_win32wrapper.h" #include <exception> #include <new> #include <new.h> /** On windows, all dll files and executables have their own private heap, * whereas on POSIX systems, shared objects loaded into an executable share * the executable's heap. This means that if we pass an arbitrary pointer to * a windows DLL which is not allocated in that dll, without some form of * marshalling, we get a page fault. To fix this, these overrided operators * new and delete use the windows HeapAlloc and HeapFree functions to claim * memory from the windows global heap. This makes windows 'act like' POSIX * when it comes to memory usage between dlls and exes. */ void * ::operator new(size_t iSize) { void* ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, iSize); /* zero memory for unix compatibility */ /* This is the correct behaviour according to C++ standards for out of memory, * not returning null -- Brain */ if (!ptr) throw std::bad_alloc(); else return ptr; } void ::operator delete(void * ptr) { HeapFree(GetProcessHeap(), 0, ptr); } \ No newline at end of file
+/* +------------------------------------+
+ * | Inspire Internet Relay Chat Daemon |
+ * +------------------------------------+
+ *
+ * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * See: http://www.inspircd.org/wiki/index.php/Credits
+ *
+ * This program is free but copyrighted software; see
+ * the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+#include "inspircd_win32wrapper.h"
+#include <exception>
+#include <new>
+#include <new.h>
+
+/** On windows, all dll files and executables have their own private heap,
+ * whereas on POSIX systems, shared objects loaded into an executable share
+ * the executable's heap. This means that if we pass an arbitrary pointer to
+ * a windows DLL which is not allocated in that dll, without some form of
+ * marshalling, we get a page fault. To fix this, these overrided operators
+ * new and delete use the windows HeapAlloc and HeapFree functions to claim
+ * memory from the windows global heap. This makes windows 'act like' POSIX
+ * when it comes to memory usage between dlls and exes.
+ */
+
+void * ::operator new(size_t iSize)
+{
+ void* ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, iSize); /* zero memory for unix compatibility */
+ /* This is the correct behaviour according to C++ standards for out of memory,
+ * not returning null -- Brain
+ */
+ if (!ptr)
+ throw std::bad_alloc();
+ else
+ return ptr;
+}
+
+void ::operator delete(void * ptr)
+{
+ HeapFree(GetProcessHeap(), 0, ptr);
+}
diff --git a/win/inspircd_win32wrapper.cpp b/win/inspircd_win32wrapper.cpp
index 1557c8f6e..b3af867cf 100644
--- a/win/inspircd_win32wrapper.cpp
+++ b/win/inspircd_win32wrapper.cpp
@@ -1 +1,513 @@
-/* +------------------------------------+ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * * InspIRCd: (C) 2002-2007 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see * the file COPYING for details. * * --------------------------------------------------- */ #include "inspircd_win32wrapper.h" #include "inspircd.h" #include <string> #include <errno.h> #include <assert.h> using namespace std; #ifndef INADDR_NONE #define INADDR_NONE 0xffffffff #endif HANDLE hIPCPipe; int inet_aton(const char *cp, struct in_addr *addr) { unsigned long ip = inet_addr(cp); addr->s_addr = ip; return (addr->s_addr == INADDR_NONE) ? 0 : 1; } const char *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; } int geteuid() { return 1; } int inet_pton(int af, const char *src, void *dst) { sockaddr_in sa; int len = sizeof(SOCKADDR); int rv = WSAStringToAddress((LPSTR)src, af, NULL, (LPSOCKADDR)&sa, &len); if(rv >= 0) { if(WSAGetLastError() == 10022) // Invalid Argument rv = 0; else rv = 1; } memcpy(dst, &sa.sin_addr, sizeof(struct in_addr)); return rv; } char * strtok_r(char *_String, const char *_Control, char **_Context) { unsigned char *str; const unsigned char *ctl = (const unsigned char*)_Control; unsigned char map[32]; if (_Context == 0 || !_Control) return 0; if (!(_String != NULL || *_Context != NULL)) return 0; memset(map, 0, 32); do { map[*ctl >> 3] |= (1 << (*ctl & 7)); } while (*ctl++); /* If string is NULL, set str to the saved * pointer (i.e., continue breaking tokens out of the string * from the last strtok call) */ if (_String != NULL) { str = (unsigned char*)_String; } else { str = (unsigned char*)*_Context; } /* Find beginning of token (skip over leading delimiters). Note that * there is no token iff this loop sets str to point to the terminal * null (*str == 0) */ while ((map[*str >> 3] & (1 << (*str & 7))) && *str != 0) { str++; } _String = (char*)str; /* Find the end of the token. If it is not the end of the string, * put a null there. */ for ( ; *str != 0 ; str++ ) { if (map[*str >> 3] & (1 << (*str & 7))) { *str++ = 0; break; } } /* Update context */ *_Context = (char*)str; /* Determine if a token has been found. */ if (_String == (char*)str) { return NULL; } else { return _String; } } void setcolor(int color_code) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color_code); } DIR * opendir(const char * path) { std::string search_path = string(path) + "\\*.*"; WIN32_FIND_DATA fd; HANDLE f = FindFirstFile(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; } } dirent * readdir(DIR * handle) { if (handle->first) handle->first = false; else { if (!FindNextFile(handle->find_handle, &handle->find_data)) return 0; } strncpy(handle->dirent_pointer.d_name, handle->find_data.cFileName, MAX_PATH); return &handle->dirent_pointer; } void closedir(DIR * handle) { FindClose(handle->find_handle); delete handle; } const char * dlerror() { static char errormessage[500]; DWORD error = GetLastError(); SetLastError(0); if (error == 0) return 0; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)errormessage, 500, 0); return errormessage; } #define TRED FOREGROUND_RED | FOREGROUND_INTENSITY #define TGREEN FOREGROUND_GREEN | FOREGROUND_INTENSITY #define TYELLOW FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY #define TNORMAL FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE #define TWHITE TNORMAL | FOREGROUND_INTENSITY #define TBLUE FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY /* Handles colors in printf */ int printf_c(const char * format, ...) { // Better hope we're not multithreaded, otherwise we'll have chickens crossing the road other side to get the to :P static char message[MAXBUF]; static char temp[MAXBUF]; int color1, color2; /* parse arguments */ va_list ap; va_start(ap, format); vsnprintf(message, 500, format, ap); va_end(ap); /* search for unix-style escape sequences */ int t; int c = 0; const char * p = message; while (*p != 0) { if (*p == '\033') { // Escape sequence -> copy into the temp buffer, and parse the color. p++; t = 0; while ((*p) && (*p != 'm')) { temp[t++] = *p; ++p; } temp[t] = 0; p++; if (*temp == '[') { if (sscanf(temp, "[%u;%u", &color1, &color2) == 2) { switch(color2) { case 32: // Green SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY); // Yellow break; default: // Unknown // White SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; } } else { switch (*(temp+1)) { case '0': // Returning to normal colour. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); break; case '1': // White SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), TWHITE); break; default: char message[50]; sprintf(message, "Unknown color code: %s", temp); MessageBox(0, message, message, MB_OK); break; } } } } putchar(*p); ++c; ++p; } return c; } int arg_counter = 1; char optarg[514]; int getopt_long_only(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 || arg_counter == ___argc) // No arguments (apart from filename) return -1; const char * opt = ___argv[arg_counter]; int return_val = 0; // 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 ((arg_counter + 1) != ___argc) { // grab the parameter from the next argument (if its not another argument) if (strnicmp(___argv[arg_counter+1], "--", 2) != 0) { arg_counter++; // Trash this next argument, we won't be needing it. par = ___argv[arg_counter]; } } // increment the argument for next time arg_counter++; // 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; } /* IPC Messages */ #define IPC_MESSAGE_REHASH 1 #define IPC_MESSAGE_DIE 2 #define IPC_MESSAGE_RESTART 3 void InitIPC() { static DWORD buflen = 1024; static const char * pipename = "\\\\.\\mailslot\\Inspircd"; hIPCPipe = CreateMailslot(pipename, buflen, 0, 0); if (hIPCPipe == INVALID_HANDLE_VALUE) printf("IPC Pipe could not be created. Are you sure you didn't start InspIRCd twice?\n"); } void CheckIPC(InspIRCd * Instance) { if (hIPCPipe == INVALID_HANDLE_VALUE) return; DWORD bytes; DWORD action; BOOL res = ReadFile(hIPCPipe, &action, sizeof(DWORD), &bytes, 0); if (!res) { if (GetLastError() != ERROR_SEM_TIMEOUT) Instance->Log(DEFAULT, "IPC Pipe Error %u: %s", GetLastError(), dlerror()); return; } switch (action) { case IPC_MESSAGE_REHASH: InspIRCd::Rehash(0); break; case IPC_MESSAGE_DIE: InspIRCd::Exit(0); break; case IPC_MESSAGE_RESTART: Instance->Restart("IPC_MESSAGE_RESTART received by mailslot."); break; } } void CloseIPC() { CloseHandle(hIPCPipe); } /* These three functions were created from looking at how ares does it * (...and they look far tidier in C++) */ /* Get active nameserver */ bool GetNameServer(HKEY regkey, const char *key, char* &output) { DWORD size = 0; DWORD result = RegQueryValueEx(regkey, key, 0, NULL, NULL, &size); if (((result != ERROR_SUCCESS) && (result != ERROR_MORE_DATA)) || (!size)) return false; output = new char[size+1]; if ((RegQueryValueEx(regkey, key, 0, NULL, (LPBYTE)output, &size) != ERROR_SUCCESS) || (!*output)) { delete output; return false; } return true; } /* Check a network interface for its nameserver */ bool GetInterface(HKEY regkey, const char *key, char* &output) { char buf[39]; DWORD size = 39; int idx = 0; HKEY top; while (RegEnumKeyEx(regkey, idx++, buf, &size, 0, NULL, NULL, NULL) != ERROR_NO_MORE_ITEMS) { size = 39; if (RegOpenKeyEx(regkey, buf, 0, KEY_QUERY_VALUE, &top) != ERROR_SUCCESS) continue; int rc = GetNameServer(top, key, output); RegCloseKey(top); if (rc) return true; } return false; } std::string FindNameServerWin() { std::string returnval = "127.0.0.1"; HKEY top, key; char* dns = NULL; /* Lets see if the correct registry hive and tree exist */ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, KEY_READ, &top) == ERROR_SUCCESS) { /* If they do, attempt to get the nameserver name */ RegOpenKeyEx(top, "Interfaces", 0, KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS, &key); if ((GetNameServer(top, "NameServer", dns)) || (GetNameServer(top, "DhcpNameServer", dns)) || (GetInterface(key, "NameServer", dns)) || (GetInterface(key, "DhcpNameServer", dns))) { if (dns) { returnval = dns; delete dns; } } RegCloseKey(key); RegCloseKey(top); } return returnval; } void ClearConsole() { COORD coordScreen = { 0, 0 }; /* here's where we'll home the cursor */ HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); DWORD cCharsWritten; CONSOLE_SCREEN_BUFFER_INFO csbi; /* to get buffer info */ DWORD dwConSize; /* number of character cells in the current buffer */ /* get the number of character cells in the current buffer */ if (GetConsoleScreenBufferInfo( hConsole, &csbi )) { dwConSize = csbi.dwSize.X * csbi.dwSize.Y; /* fill the entire screen with blanks */ if (FillConsoleOutputCharacter( hConsole, (TCHAR) ' ', dwConSize, coordScreen, &cCharsWritten )) { /* get the current text attribute */ if (GetConsoleScreenBufferInfo( hConsole, &csbi )) { /* now set the buffer's attributes accordingly */ if (FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )) { /* put the cursor at (0, 0) */ SetConsoleCursorPosition( hConsole, coordScreen ); } } } } return; } \ No newline at end of file
+/* +------------------------------------+
+ * | Inspire Internet Relay Chat Daemon |
+ * +------------------------------------+
+ *
+ * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * See: http://www.inspircd.org/wiki/index.php/Credits
+ *
+ * This program is free but copyrighted software; see
+ * the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+#include "inspircd_win32wrapper.h"
+#include "inspircd.h"
+#include <string>
+#include <errno.h>
+#include <assert.h>
+using namespace std;
+
+#ifndef INADDR_NONE
+#define INADDR_NONE 0xffffffff
+#endif
+
+HANDLE hIPCPipe;
+
+int inet_aton(const char *cp, struct in_addr *addr)
+{
+ unsigned long ip = inet_addr(cp);
+ addr->s_addr = ip;
+ return (addr->s_addr == INADDR_NONE) ? 0 : 1;
+}
+
+const char *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;
+}
+
+int geteuid()
+{
+ return 1;
+}
+
+int inet_pton(int af, const char *src, void *dst)
+{
+ sockaddr_in sa;
+ int len = sizeof(SOCKADDR);
+ int rv = WSAStringToAddress((LPSTR)src, af, NULL, (LPSOCKADDR)&sa, &len);
+ if(rv >= 0)
+ {
+ if(WSAGetLastError() == 10022) // Invalid Argument
+ rv = 0;
+ else
+ rv = 1;
+ }
+ memcpy(dst, &sa.sin_addr, sizeof(struct in_addr));
+ return rv;
+}
+
+char * strtok_r(char *_String, const char *_Control, char **_Context)
+{
+ unsigned char *str;
+ const unsigned char *ctl = (const unsigned char*)_Control;
+ unsigned char map[32];
+
+ if (_Context == 0 || !_Control)
+ return 0;
+
+ if (!(_String != NULL || *_Context != NULL))
+ return 0;
+
+ memset(map, 0, 32);
+
+ do {
+ map[*ctl >> 3] |= (1 << (*ctl & 7));
+ } while (*ctl++);
+
+ /* If string is NULL, set str to the saved
+ * pointer (i.e., continue breaking tokens out of the string
+ * from the last strtok call) */
+ if (_String != NULL)
+ {
+ str = (unsigned char*)_String;
+ }
+ else
+ {
+ str = (unsigned char*)*_Context;
+ }
+
+ /* Find beginning of token (skip over leading delimiters). Note that
+ * there is no token iff this loop sets str to point to the terminal
+ * null (*str == 0) */
+ while ((map[*str >> 3] & (1 << (*str & 7))) && *str != 0)
+ {
+ str++;
+ }
+
+ _String = (char*)str;
+
+ /* Find the end of the token. If it is not the end of the string,
+ * put a null there. */
+ for ( ; *str != 0 ; str++ )
+ {
+ if (map[*str >> 3] & (1 << (*str & 7)))
+ {
+ *str++ = 0;
+ break;
+ }
+ }
+
+ /* Update context */
+ *_Context = (char*)str;
+
+ /* Determine if a token has been found. */
+ if (_String == (char*)str)
+ {
+ return NULL;
+ }
+ else
+ {
+ return _String;
+ }
+}
+
+void setcolor(int color_code)
+{
+ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color_code);
+}
+
+DIR * opendir(const char * path)
+{
+ std::string search_path = string(path) + "\\*.*";
+ WIN32_FIND_DATA fd;
+ HANDLE f = FindFirstFile(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;
+ }
+}
+
+dirent * readdir(DIR * handle)
+{
+ if (handle->first)
+ handle->first = false;
+ else
+ {
+ if (!FindNextFile(handle->find_handle, &handle->find_data))
+ return 0;
+ }
+
+ strncpy(handle->dirent_pointer.d_name, handle->find_data.cFileName, MAX_PATH);
+ return &handle->dirent_pointer;
+}
+
+void closedir(DIR * handle)
+{
+ FindClose(handle->find_handle);
+ delete handle;
+}
+
+const char * dlerror()
+{
+ static char errormessage[500];
+ DWORD error = GetLastError();
+ SetLastError(0);
+ if (error == 0)
+ return 0;
+
+ FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)errormessage, 500, 0);
+ return errormessage;
+}
+
+#define TRED FOREGROUND_RED | FOREGROUND_INTENSITY
+#define TGREEN FOREGROUND_GREEN | FOREGROUND_INTENSITY
+#define TYELLOW FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY
+#define TNORMAL FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE
+#define TWHITE TNORMAL | FOREGROUND_INTENSITY
+#define TBLUE FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY
+
+/* Handles colors in printf */
+int printf_c(const char * format, ...)
+{
+ // Better hope we're not multithreaded, otherwise we'll have chickens crossing the road other side to get the to :P
+ static char message[MAXBUF];
+ static char temp[MAXBUF];
+ int color1, color2;
+
+ /* parse arguments */
+ va_list ap;
+ va_start(ap, format);
+ vsnprintf(message, 500, format, ap);
+ va_end(ap);
+
+ /* search for unix-style escape sequences */
+ int t;
+ int c = 0;
+ const char * p = message;
+ while (*p != 0)
+ {
+ if (*p == '\033')
+ {
+ // Escape sequence -> copy into the temp buffer, and parse the color.
+ p++;
+ t = 0;
+ while ((*p) && (*p != 'm'))
+ {
+ temp[t++] = *p;
+ ++p;
+ }
+
+ temp[t] = 0;
+ p++;
+
+ if (*temp == '[')
+ {
+ if (sscanf(temp, "[%u;%u", &color1, &color2) == 2)
+ {
+ switch(color2)
+ {
+ case 32: // Green
+ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY); // Yellow
+ break;
+
+ default: // Unknown
+ // White
+ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
+ break;
+ }
+ }
+ else
+ {
+ switch (*(temp+1))
+ {
+ case '0':
+ // Returning to normal colour.
+ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
+ break;
+
+ case '1':
+ // White
+ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), TWHITE);
+ break;
+
+ default:
+ char message[50];
+ sprintf(message, "Unknown color code: %s", temp);
+ MessageBox(0, message, message, MB_OK);
+ break;
+ }
+ }
+ }
+ }
+
+ putchar(*p);
+ ++c;
+ ++p;
+ }
+
+ return c;
+}
+
+int arg_counter = 1;
+char optarg[514];
+int getopt_long_only(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 || arg_counter == ___argc) // No arguments (apart from filename)
+ return -1;
+
+ const char * opt = ___argv[arg_counter];
+ int return_val = 0;
+
+ // 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 ((arg_counter + 1) != ___argc)
+ {
+ // grab the parameter from the next argument (if its not another argument)
+ if (strnicmp(___argv[arg_counter+1], "--", 2) != 0)
+ {
+ arg_counter++; // Trash this next argument, we won't be needing it.
+ par = ___argv[arg_counter];
+ }
+ }
+
+ // increment the argument for next time
+ arg_counter++;
+
+ // 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;
+}
+
+/* IPC Messages */
+#define IPC_MESSAGE_REHASH 1
+#define IPC_MESSAGE_DIE 2
+#define IPC_MESSAGE_RESTART 3
+
+void InitIPC()
+{
+ static DWORD buflen = 1024;
+ static const char * pipename = "\\\\.\\mailslot\\Inspircd";
+ hIPCPipe = CreateMailslot(pipename, buflen, 0, 0);
+ if (hIPCPipe == INVALID_HANDLE_VALUE)
+ printf("IPC Pipe could not be created. Are you sure you didn't start InspIRCd twice?\n");
+}
+
+void CheckIPC(InspIRCd * Instance)
+{
+ if (hIPCPipe == INVALID_HANDLE_VALUE)
+ return;
+
+ DWORD bytes;
+ DWORD action;
+
+ BOOL res = ReadFile(hIPCPipe, &action, sizeof(DWORD), &bytes, 0);
+ if (!res)
+ {
+ if (GetLastError() != ERROR_SEM_TIMEOUT)
+ Instance->Log(DEFAULT, "IPC Pipe Error %u: %s", GetLastError(), dlerror());
+ return;
+ }
+
+ switch (action)
+ {
+ case IPC_MESSAGE_REHASH:
+ InspIRCd::Rehash(0);
+ break;
+
+ case IPC_MESSAGE_DIE:
+ InspIRCd::Exit(0);
+ break;
+
+ case IPC_MESSAGE_RESTART:
+ Instance->Restart("IPC_MESSAGE_RESTART received by mailslot.");
+ break;
+ }
+}
+
+void CloseIPC()
+{
+ CloseHandle(hIPCPipe);
+}
+
+
+/* These three functions were created from looking at how ares does it
+ * (...and they look far tidier in C++)
+ */
+
+/* Get active nameserver */
+bool GetNameServer(HKEY regkey, const char *key, char* &output)
+{
+ DWORD size = 0;
+ DWORD result = RegQueryValueEx(regkey, key, 0, NULL, NULL, &size);
+ if (((result != ERROR_SUCCESS) && (result != ERROR_MORE_DATA)) || (!size))
+ return false;
+
+ output = new char[size+1];
+
+ if ((RegQueryValueEx(regkey, key, 0, NULL, (LPBYTE)output, &size) != ERROR_SUCCESS) || (!*output))
+ {
+ delete output;
+ return false;
+ }
+ return true;
+}
+
+/* Check a network interface for its nameserver */
+bool GetInterface(HKEY regkey, const char *key, char* &output)
+{
+ char buf[39];
+ DWORD size = 39;
+ int idx = 0;
+ HKEY top;
+
+ while (RegEnumKeyEx(regkey, idx++, buf, &size, 0, NULL, NULL, NULL) != ERROR_NO_MORE_ITEMS)
+ {
+ size = 39;
+ if (RegOpenKeyEx(regkey, buf, 0, KEY_QUERY_VALUE, &top) != ERROR_SUCCESS)
+ continue;
+ int rc = GetNameServer(top, key, output);
+ RegCloseKey(top);
+ if (rc)
+ return true;
+ }
+ return false;
+}
+
+
+std::string FindNameServerWin()
+{
+ std::string returnval = "127.0.0.1";
+ HKEY top, key;
+ char* dns = NULL;
+
+ /* Lets see if the correct registry hive and tree exist */
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, KEY_READ, &top) == ERROR_SUCCESS)
+ {
+ /* If they do, attempt to get the nameserver name */
+ RegOpenKeyEx(top, "Interfaces", 0, KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS, &key);
+ if ((GetNameServer(top, "NameServer", dns)) || (GetNameServer(top, "DhcpNameServer", dns))
+ || (GetInterface(key, "NameServer", dns)) || (GetInterface(key, "DhcpNameServer", dns)))
+ {
+ if (dns)
+ {
+ returnval = dns;
+ delete dns;
+ }
+ }
+ RegCloseKey(key);
+ RegCloseKey(top);
+ }
+ return returnval;
+}
+
+
+void ClearConsole()
+{
+ COORD coordScreen = { 0, 0 }; /* here's where we'll home the cursor */
+ HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
+ DWORD cCharsWritten;
+ CONSOLE_SCREEN_BUFFER_INFO csbi; /* to get buffer info */
+ DWORD dwConSize; /* number of character cells in the current buffer */
+
+ /* get the number of character cells in the current buffer */
+
+ if (GetConsoleScreenBufferInfo( hConsole, &csbi ))
+ {
+ dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
+ /* fill the entire screen with blanks */
+ if (FillConsoleOutputCharacter( hConsole, (TCHAR) ' ', dwConSize, coordScreen, &cCharsWritten ))
+ {
+ /* get the current text attribute */
+ if (GetConsoleScreenBufferInfo( hConsole, &csbi ))
+ {
+ /* now set the buffer's attributes accordingly */
+ if (FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten ))
+ {
+ /* put the cursor at (0, 0) */
+ SetConsoleCursorPosition( hConsole, coordScreen );
+ }
+ }
+ }
+ }
+ return;
+}
diff --git a/win/inspircd_win32wrapper.h b/win/inspircd_win32wrapper.h
index ee0feb77e..fb6882378 100644
--- a/win/inspircd_win32wrapper.h
+++ b/win/inspircd_win32wrapper.h
@@ -1 +1,189 @@
-/* +------------------------------------+ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * * InspIRCd: (C) 2002-2007 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see * the file COPYING for details. * * --------------------------------------------------- */ /* Windows Port Wrapper Functions/Definitions By Burlex */ #ifndef INSPIRCD_WIN32WRAPPER_H #define INSPIRCD_WIN32WRAPPER_H /* Define the WINDOWS macro. This means we're building on windows to the rest of the server. I think this is more reasonable than using WIN32, especially if we're gonna be doing 64-bit compiles */ #define WINDOWS 1 /* Make builds smaller, leaner and faster */ #define VC_EXTRALEAN /* They just have to be *different*, don't they. */ #define PATH_MAX MAX_PATH /* Begone shitty 'safe STL' warnings */ #define _SCL_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #define _AFX_SECURE_NO_WARNINGS #define _ATL_SECURE_NO_WARNINGS /* Macros for exporting symbols - dependant on what is being compiled */ #ifdef DLL_BUILD #define CoreExport __declspec(dllimport) #define DllExport __declspec(dllexport) #else #define CoreExport __declspec(dllexport) #define DllExport __declspec(dllimport) #endif /* Disable the deprecation warnings.. it spams :P */ #define _CRT_SECURE_NO_DEPRECATE #define _SCL_SECURE_NO_DEPRECATE #include <string> /* Say we're building on windows 2000. Anyone running something older than this * reeeeeeeally needs to upgrade! */ #define _WIN32_WINNT 0x500 /* Normal windows (platform-specific) includes */ #include <winsock2.h> #include <windows.h> #include <ws2tcpip.h> #include <sys/types.h> #include <sys/stat.h> #include <direct.h> #include <process.h> #include <stdio.h> #include <algorithm> /* strcasecmp is not defined on windows by default */ #define strcasecmp _stricmp /* Error macros need to be redirected to winsock error codes */ #define ETIMEDOUT WSAETIMEDOUT #define ECONNREFUSED WSAECONNREFUSED #define EADDRINUSE WSAEADDRINUSE #define EINPROGRESS WSAEWOULDBLOCK /* Remember file descriptors are treated differently on windows ;) */ __inline int close(int socket) { return closesocket(socket); } /* Convert formatted (xxx.xxx.xxx.xxx) string to in_addr struct */ CoreExport int inet_pton(int af, const char * src, void * dst); /* Convert struct to formatted (xxx.xxx.xxx.xxx) string */ CoreExport const char * inet_ntop(int af, const void * src, char * dst, socklen_t cnt); /* Safe printf functions aren't defined in VC2003 */ #define snprintf _snprintf #define vsnprintf _vsnprintf /* Recursive token function doesn't exist in VC++ */ CoreExport char * strtok_r(char *_String, const char *_Control, char **_Context); /* Unix-style sleep (argument is in seconds) */ __inline void sleep(int seconds) { Sleep(seconds * 1000); } /* IPV4 only convert string to address struct */ CoreExport int inet_aton(const char *, struct in_addr *); /* Unix-style get running user id */ CoreExport int geteuid(); /* Handles colors in printf */ CoreExport int printf_c(const char * format, ...); /* getopt() wrapper */ # define no_argument 0 # define required_argument 1 # define optional_argument 2 struct option { char *name; int has_arg; int *flag; int val; }; extern char optarg[514]; int getopt_long_only (int ___argc, char *const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind); /* Accept Handlers */ struct udp_overlap; CoreExport int __accept_socket(SOCKET s, sockaddr * addr, int * addrlen, void * acceptevent); CoreExport int __getsockname(SOCKET s, sockaddr * name, int * namelen, void * acceptevent); CoreExport int __recvfrom(SOCKET s, char * buf, int len, int flags, struct sockaddr * from, int * fromlen, udp_overlap * ov); /* Module Loading */ #define dlopen(path, state) (void*)LoadLibrary(path) #define dlsym(handle, export) (void*)GetProcAddress((HMODULE)handle, export) #define dlclose(handle) FreeLibrary((HMODULE)handle) const char * dlerror(); /* Unix-style directory searching functions */ #define chmod(filename, mode) struct dirent { char d_name[MAX_PATH]; }; struct DIR { dirent dirent_pointer; HANDLE find_handle; WIN32_FIND_DATA find_data; bool first; }; CoreExport DIR * opendir(const char * path); CoreExport dirent * readdir(DIR * handle); CoreExport void closedir(DIR * handle); /* Disable these stupid warnings.. */ #pragma warning(disable:4800) #pragma warning(disable:4251) #pragma warning(disable:4275) #pragma warning(disable:4244) // warning C4244: '=' : conversion from 'long' to 'short', possible loss of data #pragma warning(disable:4267) // warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data #pragma warning(disable:4805) // warning C4805: '!=' : unsafe mix of type 'char' and type 'bool' in operation #pragma warning(disable:4311) // warning C4311: 'type cast' : pointer truncation from 'accept_overlap *' to 'int' #pragma warning(disable:4312) // warning C4312: 'type cast' : conversion from 'int' to 'HANDLE' of greater size #pragma warning(disable:4355) // warning C4355: 'this' : used in base member initializer list #pragma warning(disable:4996) // warning C4996: 'std::_Traits_helper::move_s' was declared deprecated /* Mehhhh... typedefs. */ typedef unsigned char uint8_t; typedef unsigned long long uint64_t; typedef signed char int8_t; typedef signed long int32_t; typedef signed long long int64_t; /* Shared memory allocation functions */ void * ::operator new(size_t iSize); void ::operator delete(void * ptr); /* IPC Handlers */ class InspIRCd; void InitIPC(); void CheckIPC(InspIRCd * Instance); void CloseIPC(); /* Look up the nameserver in use from the registry on windows */ std::string FindNameServerWin(); /* Clear a windows console */ void ClearConsole(); #endif \ No newline at end of file
+/* +------------------------------------+
+ * | Inspire Internet Relay Chat Daemon |
+ * +------------------------------------+
+ *
+ * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * See: http://www.inspircd.org/wiki/index.php/Credits
+ *
+ * This program is free but copyrighted software; see
+ * the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+/* Windows Port
+ Wrapper Functions/Definitions
+ By Burlex */
+
+#ifndef INSPIRCD_WIN32WRAPPER_H
+#define INSPIRCD_WIN32WRAPPER_H
+
+/* Define the WINDOWS macro. This means we're building on windows to the rest of the server.
+ I think this is more reasonable than using WIN32, especially if we're gonna be doing 64-bit compiles */
+#define WINDOWS 1
+
+/* Make builds smaller, leaner and faster */
+#define VC_EXTRALEAN
+
+/* They just have to be *different*, don't they. */
+#define PATH_MAX MAX_PATH
+
+/* Begone shitty 'safe STL' warnings */
+#define _SCL_SECURE_NO_WARNINGS
+#define _CRT_SECURE_NO_WARNINGS
+#define _AFX_SECURE_NO_WARNINGS
+#define _ATL_SECURE_NO_WARNINGS
+
+/* Macros for exporting symbols - dependant on what is being compiled */
+
+#ifdef DLL_BUILD
+#define CoreExport __declspec(dllimport)
+#define DllExport __declspec(dllexport)
+#else
+#define CoreExport __declspec(dllexport)
+#define DllExport __declspec(dllimport)
+#endif
+
+/* Disable the deprecation warnings.. it spams :P */
+#define _CRT_SECURE_NO_DEPRECATE
+#define _SCL_SECURE_NO_DEPRECATE
+
+#include <string>
+
+/* Say we're building on windows 2000. Anyone running something older than this
+ * reeeeeeeally needs to upgrade! */
+
+#define _WIN32_WINNT 0x500
+
+/* Normal windows (platform-specific) includes */
+#include <winsock2.h>
+#include <windows.h>
+#include <ws2tcpip.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <direct.h>
+#include <process.h>
+#include <stdio.h>
+#include <algorithm>
+
+/* strcasecmp is not defined on windows by default */
+#define strcasecmp _stricmp
+
+/* Error macros need to be redirected to winsock error codes */
+#define ETIMEDOUT WSAETIMEDOUT
+#define ECONNREFUSED WSAECONNREFUSED
+#define EADDRINUSE WSAEADDRINUSE
+#define EINPROGRESS WSAEWOULDBLOCK
+
+/* Remember file descriptors are treated differently on windows ;) */
+__inline int close(int socket) { return closesocket(socket); }
+
+/* Convert formatted (xxx.xxx.xxx.xxx) string to in_addr struct */
+CoreExport int inet_pton(int af, const char * src, void * dst);
+
+/* Convert struct to formatted (xxx.xxx.xxx.xxx) string */
+CoreExport const char * inet_ntop(int af, const void * src, char * dst, socklen_t cnt);
+
+/* Safe printf functions aren't defined in VC2003 */
+#define snprintf _snprintf
+#define vsnprintf _vsnprintf
+
+/* Recursive token function doesn't exist in VC++ */
+CoreExport char * strtok_r(char *_String, const char *_Control, char **_Context);
+
+/* Unix-style sleep (argument is in seconds) */
+__inline void sleep(int seconds) { Sleep(seconds * 1000); }
+
+/* IPV4 only convert string to address struct */
+CoreExport int inet_aton(const char *, struct in_addr *);
+
+/* Unix-style get running user id */
+CoreExport int geteuid();
+
+/* Handles colors in printf */
+CoreExport int printf_c(const char * format, ...);
+
+/* getopt() wrapper */
+# define no_argument 0
+# define required_argument 1
+# define optional_argument 2
+struct option
+{
+ char *name;
+ int has_arg;
+ int *flag;
+ int val;
+};
+extern char optarg[514];
+int getopt_long_only (int ___argc, char *const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind);
+
+/* Accept Handlers */
+struct udp_overlap;
+CoreExport int __accept_socket(SOCKET s, sockaddr * addr, int * addrlen, void * acceptevent);
+CoreExport int __getsockname(SOCKET s, sockaddr * name, int * namelen, void * acceptevent);
+CoreExport int __recvfrom(SOCKET s, char * buf, int len, int flags, struct sockaddr * from, int * fromlen, udp_overlap * ov);
+
+/* Module Loading */
+#define dlopen(path, state) (void*)LoadLibrary(path)
+#define dlsym(handle, export) (void*)GetProcAddress((HMODULE)handle, export)
+#define dlclose(handle) FreeLibrary((HMODULE)handle)
+const char * dlerror();
+
+/* Unix-style directory searching functions */
+#define chmod(filename, mode)
+struct dirent
+{
+ char d_name[MAX_PATH];
+};
+
+struct DIR
+{
+ dirent dirent_pointer;
+ HANDLE find_handle;
+ WIN32_FIND_DATA find_data;
+ bool first;
+};
+
+CoreExport DIR * opendir(const char * path);
+CoreExport dirent * readdir(DIR * handle);
+CoreExport void closedir(DIR * handle);
+
+/* Disable these stupid warnings.. */
+#pragma warning(disable:4800)
+#pragma warning(disable:4251)
+#pragma warning(disable:4275)
+#pragma warning(disable:4244) // warning C4244: '=' : conversion from 'long' to 'short', possible loss of data
+#pragma warning(disable:4267) // warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data
+#pragma warning(disable:4805) // warning C4805: '!=' : unsafe mix of type 'char' and type 'bool' in operation
+#pragma warning(disable:4311) // warning C4311: 'type cast' : pointer truncation from 'accept_overlap *' to 'int'
+#pragma warning(disable:4312) // warning C4312: 'type cast' : conversion from 'int' to 'HANDLE' of greater size
+#pragma warning(disable:4355) // warning C4355: 'this' : used in base member initializer list
+#pragma warning(disable:4996) // warning C4996: 'std::_Traits_helper::move_s' was declared deprecated
+
+/* Mehhhh... typedefs. */
+
+typedef unsigned char uint8_t;
+typedef unsigned long long uint64_t;
+typedef signed char int8_t;
+typedef signed long int32_t;
+typedef signed long long int64_t;
+
+/* Shared memory allocation functions */
+void * ::operator new(size_t iSize);
+void ::operator delete(void * ptr);
+
+/* IPC Handlers */
+class InspIRCd;
+
+void InitIPC();
+void CheckIPC(InspIRCd * Instance);
+void CloseIPC();
+
+/* Look up the nameserver in use from the registry on windows */
+std::string FindNameServerWin();
+
+/* Clear a windows console */
+void ClearConsole();
+
+#endif
+
diff --git a/win/key.pem b/win/key.pem
index 2cb3eda40..09b298260 100644
--- a/win/key.pem
+++ b/win/key.pem
@@ -1 +1,15 @@
------BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgQDIbKvMTTogBZxTi1yn4ncVK09Wr+F2AxP63HWTzxnEwNhcURSa UqpCzVIfcpr7/jKn+8I17MzaMvG8m+sPKngPK5WMN440p12uitkS+uzkLbJ7J/Z3 35ar6nZOtbIO+aTDRzUTnNHGHRgdQj4GGvx89l0u7vQM3R2f9Oe2lWlc1wIDAQAB AoGABh+/7hmr/X9+Y9Udyylxzw1IOtNb9cGpUiB7XT1WQbtMwSFfGkoNVsY0TK6x SqLdRGG+cOxf5AjrdwJin8+B5JLsoFUJ79ouUSye4IpywH6pQPzTW5L/Pqw+lM81 YZB/I7OKwSOkmFvKM8l9Y3U/UdvPeVPU44jAsnTyN9gZ/q0CQQDb+qGe7T8AIm1U rz9Wf8/BBQy6ShoaL5sv0dqLE1/CWkGPnkhm8HA/6udlUiVNBcWlirKeSuzctC23 u/mGU179AkEA6T5TyZ798qKyKpZXqNzyfnq5RMjCdr12rtk+sTYThbHndGonhjKk PqWgQ/Aq3t33J740jsNpz6za6/hPRGp1YwJANE4o5eAljcOh2XP+DHRBkvS/bQA3 qqhNLxan70/BAjZxxlNthcR//EK/mJDqu6C2uUD8bbUFEwlooXp5v13NhQJALGbN FIjL1zDZsfnE3kSRdTpvooSFYI1Y1phMsveUZ9MiOKssswNY+QQWqlhCEQM4VbyD zNmufvZtBpbSoDeT+QJAasQ/yEgYJnC+nbWmiJVuIFYFiWkxYToSUv4yFq2zHj6O hVVCUr60FTMzqzS4BXzWVQVX2ylDJA40dUBTZ9HI7g== -----END RSA PRIVATE KEY----- \ No newline at end of file
+-----BEGIN RSA PRIVATE KEY-----
+MIICWwIBAAKBgQDIbKvMTTogBZxTi1yn4ncVK09Wr+F2AxP63HWTzxnEwNhcURSa
+UqpCzVIfcpr7/jKn+8I17MzaMvG8m+sPKngPK5WMN440p12uitkS+uzkLbJ7J/Z3
+35ar6nZOtbIO+aTDRzUTnNHGHRgdQj4GGvx89l0u7vQM3R2f9Oe2lWlc1wIDAQAB
+AoGABh+/7hmr/X9+Y9Udyylxzw1IOtNb9cGpUiB7XT1WQbtMwSFfGkoNVsY0TK6x
+SqLdRGG+cOxf5AjrdwJin8+B5JLsoFUJ79ouUSye4IpywH6pQPzTW5L/Pqw+lM81
+YZB/I7OKwSOkmFvKM8l9Y3U/UdvPeVPU44jAsnTyN9gZ/q0CQQDb+qGe7T8AIm1U
+rz9Wf8/BBQy6ShoaL5sv0dqLE1/CWkGPnkhm8HA/6udlUiVNBcWlirKeSuzctC23
+u/mGU179AkEA6T5TyZ798qKyKpZXqNzyfnq5RMjCdr12rtk+sTYThbHndGonhjKk
+PqWgQ/Aq3t33J740jsNpz6za6/hPRGp1YwJANE4o5eAljcOh2XP+DHRBkvS/bQA3
+qqhNLxan70/BAjZxxlNthcR//EK/mJDqu6C2uUD8bbUFEwlooXp5v13NhQJALGbN
+FIjL1zDZsfnE3kSRdTpvooSFYI1Y1phMsveUZ9MiOKssswNY+QQWqlhCEQM4VbyD
+zNmufvZtBpbSoDeT+QJAasQ/yEgYJnC+nbWmiJVuIFYFiWkxYToSUv4yFq2zHj6O
+hVVCUr60FTMzqzS4BXzWVQVX2ylDJA40dUBTZ9HI7g==
+-----END RSA PRIVATE KEY-----
diff --git a/win/makeinstaller.bat b/win/makeinstaller.bat
index cd3895a1e..e7ba79abd 100644
--- a/win/makeinstaller.bat
+++ b/win/makeinstaller.bat
@@ -1 +1,7 @@
-@mkdir d:\temp\ move ..\bin\release\modules\m_ssl_gnutls.so d:\temp\ move ..\bin\release\modules\m_sslinfo.so d:\temp\ move ..\bin\release\modules\m_ssl_oper_cert.so d:\temp\ move ..\bin\release\modules\m_filter_pcre.so d:\temp "C:\Program Files\NSIS\makensisw.exe" "inspircd.nsi" move d:\temp\*.so ..\bin\release\modules\ \ No newline at end of file
+@mkdir d:\temp\
+move ..\bin\release\modules\m_ssl_gnutls.so d:\temp\
+move ..\bin\release\modules\m_sslinfo.so d:\temp\
+move ..\bin\release\modules\m_ssl_oper_cert.so d:\temp\
+move ..\bin\release\modules\m_filter_pcre.so d:\temp
+"C:\Program Files\NSIS\makensisw.exe" "inspircd.nsi"
+move d:\temp\*.so ..\bin\release\modules\