]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - configure
Fix bug experienced by satmd, remove space indents + tidy a little
[user/henk/code/inspircd.git] / configure
index 389aa64066173eb7f7f455a6219f6f54c7632329..8af40ef104704863db4e33310c68cd194811761b 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,7 +1,8 @@
 #!/usr/bin/perl
+
 # InspIRCd Configuration Script
 #
-# Copyright 2003 The ChatSpike Development Team
+# Copyright 2002-2006 The ChatSpike Development Team
 # <brain@chatspike.net>
 # <Craig@chatspike.net>
 #
 #
 ########################################
 
-chomp($topdir = `pwd`);
+require 5.6.0;
+use Cwd;
+use Getopt::Long;
+
+GetOptions (
+       'enable-gnutls' => \$opt_use_gnutls,
+       'enable-openssl' => \$opt_use_openssl,
+       'disable-interactive' => \$opt_nointeractive,
+       'with-nick-length=i' => \$opt_nick_length,
+       'with-channel-length=i' => \$opt_chan_length,
+       'with-max-channels=i' => \$opt_maxchans,
+       'with-max-oper-channels=i' => \$opt_opermaxchans,
+       'with-max-clients' => \$opt_maxclients,
+       'enable-optimization' => \$opt_optimise,
+       'enable-epoll' => \$opt_epoll,
+       'enable-kqueue' => \$opt_kqueue,
+       'disable-epoll' => \$opt_noepoll,
+       'disable-kqueue' => \$opt_nokqueue,
+       'enable-ipv6' => \$opt_ipv6,
+       'enable-remote-ipv6' => \$opt_ipv6links,
+       'disable-remote-ipv6' => \$opt_noipv6links,
+       'with-cc=s' => \$opt_cc,
+       'with-ident-length=i' => \$opt_ident,
+       'with-quit-length=i' => \$opt_quit,
+       'with-topic-length=i' => \$opt_topic,
+       'with-kick-length=i' => \$opt_kick,
+       'with-gecos-length=i' => \$opt_gecos,
+       'with-away-length=i' => \$opt_away,
+       'with-max-modes=i' => \$opt_modes,
+       'prefix=s' => \$opt_base_dir,
+       'config-dir=s' => \$opt_config_dir,
+       'module-dir=s' => \$opt_module_dir,
+       'binary-dir=s' => \$opt_binary_dir,
+       'library-dir=s' => \$opt_library_dir,
+       'help'  => sub { showhelp(); },
+       'modupdate' => sub { modupdate(); },
+       'update' => sub { update(); },
+       'svnupdate' => sub { svnupdate(); },
+       'clean' => sub { clean(); },
+);
+
+my $non_interactive = (
+       (defined $opt_library_dir) ||
+       (defined $opt_base_dir) ||
+       (defined $opt_config_dir) ||
+       (defined $opt_module_dir) ||
+       (defined $opt_base_dir) ||
+       (defined $opt_binary_dir) ||
+       (defined $opt_nointeractive) ||
+       (defined $opt_away) ||
+       (defined $opt_gecos) ||
+       (defined $opt_kick) ||
+       (defined $opt_maxclients) ||
+       (defined $opt_modes) ||
+       (defined $opt_topic) ||
+       (defined $opt_quit) ||
+       (defined $opt_ident) ||
+       (defined $opt_cc) ||
+       (defined $opt_ipv6) ||
+       (defined $opt_ipv6links) ||
+       (defined $opt_noipv6links) ||
+       (defined $opt_kqueue) ||
+       (defined $opt_epoll) ||
+       (defined $opt_maxchans) ||
+       (defined $opt_opermaxchans) ||
+       (defined $opt_chan_length) ||
+       (defined $opt_nick_length) ||
+       (defined $opt_optimise) ||
+       (defined $opt_use_openssl) ||
+       (defined $opt_nokqueue) ||
+       (defined $opt_noepoll) ||
+       (defined $opt_use_gnutls)
+);
+my $interactive = !$non_interactive;
+
+
+chomp($topdir = getcwd());
 $this = resolve_directory($topdir);                                            # PWD, Regardless.
 @modlist = ();                                                                 # Declare for Module List..
 %config = ();                                                                  # Initiate Configuration Hash..
 $config{ME}                 = resolve_directory($topdir);                      # Present Working Directory
-$config{BASE_DIR}           = $config{ME};                                      # Use CWD as 'Base' Directory.
-$config{CONFIG_DIR}         = resolve_directory($config{ME}."/conf");          # Configuration Directory
-$config{MODULE_DIR}         = resolve_directory($config{ME}."/modules");       # Modules Directory
-$config{BINARY_DIR}         = resolve_directory($config{ME}."/bin");           # Binary Directory
-$config{LIBRARY_DIR}        = resolve_directory($config{ME}."/lib");           # Library Directory
+
+$config{BASE_DIR}           = $config{ME};
+
+if (defined $opt_base_dir)
+{
+       $config{BASE_DIR} = $opt_base_dir;
+}
+
+$config{CONFIG_DIR}         = resolve_directory($config{BASE_DIR}."/conf");            # Configuration Directory
+$config{MODULE_DIR}         = resolve_directory($config{BASE_DIR}."/modules");         # Modules Directory
+$config{BINARY_DIR}         = resolve_directory($config{BASE_DIR}."/bin");             # Binary Directory
+$config{LIBRARY_DIR}        = resolve_directory($config{BASE_DIR}."/lib");             # Library Directory
+
+if (defined $opt_config_dir)
+{
+       $config{CONFIG_DIR} = $opt_config_dir;
+}
+if (defined $opt_module_dir)
+{
+       $config{MODULE_DIR} = $opt_module_dir;
+}
+if (defined $opt_binary_dir)
+{
+       $config{BINARY_DIR} = $opt_binary_dir;
+}
+if (defined $opt_library_dir)
+{
+       $config{LIBRARY_DIR} = $opt_library_dir;
+}
 chomp($config{HAS_GNUTLS}   = `libgnutls-config --version 2>/dev/null | cut -c 1,2,3`); # GNUTLS Version.
 chomp($config{HAS_OPENSSL}  = `openssl version 2>/dev/null`);                  # Openssl version
-$config{USE_GNUTLS}         = "n";                                             # Use gnutls.
+$config{USE_GNUTLS}        = "n";
+if (defined $opt_use_gnutls)
+{
+       $config{USE_GNUTLS} = "y";                                              # Use gnutls.
+}
 $config{USE_OPENSSL}        = "n";                                             # Use openssl.
+if (defined $opt_use_openssl)
+{
+       $config{USE_OPENSSL} = "y";
+}
 $config{OPTIMITEMP}         = "0";                                             # Default Optimisation Value
 $config{OPTIMISATI}         = "-g";                                            # Optimisation Flag
+if (defined $opt_optimise)
+{
+       $config{OPTIMISATI} = "-O" . $opt_optimise;
+       $config{OPTIMITEMP} = $opt_optimise;
+}
 $config{NICK_LENGT}         = "31";                                            # Default Nick Length
+if (defined $opt_nick_length)
+{
+       $config{NICK_LENGT} = $opt_nick_length;
+}
 $config{CHAN_LENGT}         = "64";                                            # Default Channel Name Length
+if (defined $opt_chan_length)
+{
+       $config{CHAN_LENGT} = $opt_chan_length;
+}
 $config{MAX_CHANNE}         = "20";                                            # Default Max. Channels per user
+if (defined $opt_maxchans)
+{
+       $config{MAX_CHANNE} = $opt_maxchans;
+}
 $config{MAX_OPERCH}         = "60";                                            # Default Max. Channels per oper
+if (defined $opt_opermaxchans)
+{
+       $config{MAX_OPERCH} = $opt_opermaxchans;
+}
 $config{MAXI_MODES}         = "20";                                            # Default Max. Number of Modes set at once.
+if (defined $opt_modes)
+{
+       $config{MAXI_MODES} = $opt_modes;
+}
 $config{HAS_STRLCPY}        = "false";                                         # strlcpy Check.
+$config{HAS_STDINT}         = "false";                                         # stdint.h check
 $config{USE_KQUEUE}         = "y";                                             # kqueue enabled
+if (defined $opt_kqueue)
+{
+       $config{USE_KQUEUE} = "y";
+}
+if (defined $opt_nokqueue)
+{
+       $config{USE_KQUEUE} = "n";
+}
 $config{USE_EPOLL}          = "y";                                             # epoll enabled
-$config{THREADED_DNS}       = "n";                                             # threaded dns (experimental)
+if (defined $opt_epoll)
+{
+       $config{USE_EPOLL} = "y";
+}
+if (defined $opt_noepoll)
+{
+       $config{USE_EPOLL} = "n";
+}
+$config{IPV6}               = "n";                                             # IPv6 support (experimental)
+if (defined $opt_ipv6)
+{
+       $config{IPV6} = "y";
+}
+$config{SUPPORT_IP6LINKS}   = "y";                                             # IPv4 supporting IPv6 links (experimental)
+if (defined $opt_ipv6links)
+{
+       $config{SUPPORT_IP6LINKS} = "y";
+}
+if (defined $opt_noipv6links)
+{
+       $config{SUPPORT_IP6LINKS} = "n";
+}
 $config{STATIC_LINK}       = "no";                                             # are doing static modules?
 chomp($config{MAX_CLIENT_T} = `sh -c \"ulimit -n\"`);                          # FD Limit
 chomp($config{MAX_DESCRIPTORS} = `sh -c \"ulimit -n\"`);                       # Hard FD Limit
-chomp($config{GCCVER}       = `gcc -dumpversion | cut -c 1`);                  # Major GCC Version
-chomp($config{GCC34}        = `gcc -dumpversion | cut -c 3`);                  # Minor GCC Version
-chomp($config{OSNAME}       = `/bin/uname`);                                   # Operating System Name
+chomp($config{GCCVER}       = `g++ -dumpversion | cut -c 1`);                  # Major GCC Version
+chomp($config{OSNAME}       = `uname`);                                        # Operating System Name
 $config{CC}                = "g++";                                            # C++ compiler
-$config{MAKEORDER}         = "ircd mods config bininst";                       # build order
+if (defined $opt_cc)
+{
+       $config{CC} = $opt_cc;
+}
+$exec = $config{CC} . " -dumpversion | cut -c 1";
+chomp($config{GCCVER}       = `$exec`);                                                # Major GCC Version
+$config{MAKEORDER}         = "ircd mods";                                      # build order
 $config{STATICLIBS}         = "";                                              # library archive path
 $config{MAX_IDENT}          = "12";                                            # max ident size
 $config{MAX_QUIT}           = "255";                                           # max quit message size
@@ -51,23 +220,61 @@ $config{MAX_TOPIC}          = "307";                                               # max topic size
 $config{MAX_KICK}           = "255";                                           # max kick message size
 $config{MAX_GECOS}          = "128";                                           # max GECOS size
 $config{MAX_AWAY}           = "200";                                           # max AWAY size
+if (defined $opt_ident)
+{
+       $config{MAX_IDENT} = $opt_ident;
+}
+if (defined $opt_quit)
+{
+       $config{MAX_QUIT} = $opt_quit;
+}
+if (defined $opt_topic)
+{
+       $config{MAX_TOPIC} = $opt_topic;
+}
+if (defined $opt_kick)
+{
+       $config{MAX_KICK} = $opt_kick;
+}
+if (defined $opt_gecos)
+{
+       $config{MAX_GECOS} = $opt_gecos;
+}
+if (defined $opt_away)
+{
+       $config{MAX_AWAY} = $opt_away;
+}
 
-$config{HAS_OPENSSL} =~ /OpenSSL (\S+) \d+ \S+ \d{4}/;
+$no_svn = 0;
+
+$config{HAS_OPENSSL} =~ /OpenSSL ([-[:digit:].]+)([a-z])?(\-[a-z][0-9])? (\w{3}|[0-9]+) (\w{3}|[0-9]+) [0-9]{4}/;
 $config{HAS_OPENSSL} = $1;
 
+if ($config{GCCVER} eq "") {
+       print $config{CC} . " was not found! You require g++ (the GNU C++ compiler, part of GCC) to build InspIRCd!\n";
+       exit;
+}
+
 # Minihack! Convert Cygwin to 'Cyg-Static' so i can
 # Keep my dynamic module experiments here for later
 # concideration!
 
-if ($config{OSNAME} =~ /CYGWIN/) {
+if ($config{OSNAME} =~ /CYGWIN/)
+{
        $config{OSNAME} = "CYG-STATIC";
 }
-
-if ((!$config{OSNAME}) || ($config{OSNAME} eq "")) {
+elsif($config{OSNAME} =~ /^MINGW32/)
+{
+       $config{OSNAME} = "MINGW32";
+}
+elsif ((!$config{OSNAME}) || ($config{OSNAME} eq ""))
+{
        chomp($config{OSNAME} = `/usr/bin/uname`);
-       if ((!$config{OSNAME}) || ($config{OSNAME} eq "")){
+       
+       if((!$config{OSNAME}) || ($config{OSNAME} eq ""))
+       {
                $config{OSNAME} = "Unknown";
-       }
+       }       
 }
 
 if (!$config{MAX_CLIENT_T}) { 
@@ -78,12 +285,18 @@ if (!$config{MAX_CLIENT_T}) {
 # Get and Set some important vars..
 getmodules();
 
-my $arg = $ARGV[0];                                            # Do Some Argument Checks..
-if ($arg eq "-clean") {
-       system("rm -rf .config.cache");
-}               # Remove the config.cache file.
+sub clean
+{
+       if ($arg eq "-clean") {
+               system("rm -rf .config.cache");
+       }
+}
 
-if ($arg eq "-update") {
+sub update
+{
+       chomp($topdir = getcwd());
+       $this = resolve_directory($topdir);                                             # PWD, Regardless.
+       getmodules();
        # Does the cache file exist?
        if (!getcache()) {
                # No, No it doesn't.. *BASH*
@@ -95,38 +308,62 @@ if ($arg eq "-update") {
                getosflags();
                $has_epoll = $config{HAS_EPOLL};
                $has_kqueue = $config{HAS_KQUEUE};
-               writefiles();
+               writefiles(1);
                print "Complete.\n";
                exit;
        }
 }
 
-if ($arg eq "-modupdate") {
-       # Does the cache file exist?
-       if (!getcache()) {
-               # No, No it doesn't.. *BASH*
-               print "You have not run ./configure before. Please do this before trying to run the update script.\n";
-               exit 0;
-       } else {
-               # We've Loaded the cache file and all our variables..
-               print "Updating Files..\n";
-               getosflags();
-               $has_epoll = $config{HAS_EPOLL};
-               $has_kqueue = $config{HAS_KQUEUE};
-               if ($config{STATIC_LINK} eq "yes") {
-                       write_static_modules_makefile();
-               } else {
-                       write_dynamic_modules_makefile();
-               }
-               print "Complete.\n";
+sub modupdate
+{
+       chomp($topdir = getcwd());
+       $this = resolve_directory($topdir);                                             # PWD, Regardless.
+       getmodules();
+        # Does the cache file exist?
+        if (!getcache()) {
+                # No, No it doesn't.. *BASH*
+                print "You have not run ./configure before. Please do this before trying to run the update script.\n";
+                exit 0;
+        } else {
+                # We've Loaded the cache file and all our variables..
+                print "Updating Files..\n";
+                getosflags();
+                $has_epoll = $config{HAS_EPOLL};
+                $has_kqueue = $config{HAS_KQUEUE};
+                writefiles(0);
+                print "Complete.\n";
+                exit;
+        }
+}
+
+
+
+sub svnupdate
+{
+       my $fail = 0;
+       open(FH,"<.svn/entries") or $fail = 1;
+       if ($fail) {
+               print "This is not an SVN copy of InspIRCd.\n";
                exit;
        }
+       system("svn update");
+       system("perl configure -update");
+       if ($ARGV[1] eq "rebuild") {
+               system("make install");
+       }
+       exit;
 }
 
-print "Checking for cache from previous configure...\n";
-getcache();
-print "Checking operating system version...\n";
-getosflags();
+print "Running non-interactive configure...\n" unless $interactive;
+print "Checking for cache from previous configure... ";
+print ((getcache() eq "true") ? "found\n" : "not found\n");
+print "Checking operating system version... ";
+print getosflags() . "\n";
+
+if (defined $opt_maxclients)
+{
+       $config{MAX_CLIENT} = $opt_maxclients;
+}
 
 if (!$config{MAX_CLIENT}) { 
        # If the cache hasn't set the max clients, copy the variable of MAX_CLIENT_T, this
@@ -135,6 +372,17 @@ if (!$config{MAX_CLIENT}) {
        $config{MAX_CLIENT} = $config{MAX_CLIENT_T};
 }
 
+printf "Checking if stdint.h exists... ";
+$config{HAS_STDINT} = "true";
+my $fail = 0;
+open(STDINT, "</usr/include/stdint.h") or $config{HAS_STDINT} = "false";
+if ($config{HAS_STDINT} eq "true") {
+       close(STDINT);
+}
+print "yes\n" if $config{HAS_STDINT} eq "true";
+print "no\n" if $config{HAS_STDINT} eq "false";
+
+
 printf "Checking if strlcpy exists... ";
 # Perform the strlcpy() test..
 $config{HAS_STRLCPY} = "false";
@@ -153,6 +401,7 @@ if (!$fail) {
 print "yes\n" if $config{HAS_STRLCPY} eq "true";
 print "no\n" if $config{HAS_STRLCPY} eq "false";
 
+
 printf "Checking if kqueue exists... ";
 $has_kqueue = 0;
 $fail = 0;
@@ -218,348 +467,361 @@ if (($config{HAS_OPENSSL}) && (($config{HAS_OPENSSL} >= 0.8) || ($config{HAS_OPE
 ################################################################################
 
 # Clear the Screen..
-system("clear");
-# Display Splash Logo..
-show_splash();
-chomp($wholeos = `uname -mnr`);
+if ($interactive)
+{
+       system("clear");
+       chomp($wholeos = `uname -sr`);
 
-# Display Introduction Message..
-print "
-Welcome to the InspIRCd Configuration program!
+       my $rev = getrevision();
+       # Display Introduction Message..
+       print "
+Welcome to the \033[1mInspIRCd\033[0m Configuration program! (\033[1minteractive mode\033[0m)
+\033[1mPackage maintainers: Type ./configure --help for non-interactive help\033[0m
 
 *** If you are unsure of any of these values, leave it blank for    ***
 *** standard settings that will work, and your server will run      ***
-*** using them. If you are running this server as part of a         ***
-*** larger network, you must consult with your network admins       ***
-*** for the proper values to use, or server links will be unstable! ***
+*** using them. Please consult your IRC network admin if in doubt.  ***
 
 Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter
 a new value. Please note: You will \033[1mHAVE\033[0m to read the docs
 dir, otherwise you won't have a config file!
 
-Your operating system is: \033[1;32m$config{OSNAME}\033[0m ($wholeos), fdmax: $config{MAX_CLIENT_T}\n\n";
+Your operating system is: \033[1;32m$config{OSNAME}\033[0m ($wholeos)
+Maximum file descriptors: \033[1;32m$config{MAX_CLIENT_T}\033[0m
+Your InspIRCd revision ID is \033[1;32mr$rev\033[0m";
+       if ($rev eq "r0") {
+               print " (Non-SVN build)";
+       }
+       print ".\n\n";
 
-$config{CHANGE_COMPILER} = "n";
-print "I have detected the following compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.$config{GCC34}\033[0m)\n";
+       $config{CHANGE_COMPILER} = "n";
+       print "I have detected the following compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.x\033[0m)\n";
 
-while (($config{GCCVER} < 3) || ($config{GCCVER} eq "")) {
-       print "\033[1;32mIMPORTANT!\033[0m A GCC 2.x compiler has been detected, and
+       while (($config{GCCVER} < 3) || ($config{GCCVER} eq "")) {
+               print "\033[1;32mIMPORTANT!\033[0m A GCC 2.x compiler has been detected, and
 should NOT be used. You should probably specify a newer compiler.\n\n";
-       yesno(CHANGE_COMPILER,"Do you want to change the compiler?");
-       if ($config{CHANGE_COMPILER} =~ /y/i) {
-               print "What command do you want to use to invoke your compiler?\n";
-               print "[\033[1;32m$config{CC}\033[0m] -> ";
-               chomp($config{CC} = <STDIN>);
-               if ($config{CC} eq "") {
-                       $config{CC} = "g++";
-               }
-               chomp($foo = `$config{CC} -dumpversion | cut -c 1`);
-               if ($foo ne "") {
-                       chomp($config{GCCVER}       = `$config{CC} -dumpversion | cut -c 1`); # we must redo these if we change
-                       chomp($config{GCC34}        = `$config{CC} -dumpversion | cut -c 3`); # the compiler path
-                       print "Queried compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.$config{GCC34}\033[0m)\n";
-                       if ($config{GCCVER} < 3) {
-                               print "\033[1;32mGCC 2.x WILL NOT WORK!\033[0m. Let's try that again, shall we?\n";
+               yesno(CHANGE_COMPILER,"Do you want to change the compiler?");
+               if ($config{CHANGE_COMPILER} =~ /y/i) {
+                       print "What command do you want to use to invoke your compiler?\n";
+                       print "[\033[1;32m$config{CC}\033[0m] -> ";
+                       chomp($config{CC} = <STDIN>);
+                       if ($config{CC} eq "") {
+                               $config{CC} = "g++";
+                       }
+                       chomp($foo = `$config{CC} -dumpversion | cut -c 1`);
+                       if ($foo ne "") {
+                               chomp($config{GCCVER}       = `$config{CC} -dumpversion | cut -c 1`); # we must redo these if we change compilers
+                               print "Queried compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.x\033[0m)\n";
+                               if ($config{GCCVER} < 3) {
+                                       print "\033[1;32mGCC 2.x WILL NOT WORK!\033[0m. Let's try that again, shall we?\n";
+                               }
+                       }
+                       else {
+                               print "\033[1;32mWARNING!\033[0m Could not execute the compiler you specified. You may want to try again.\n";
                        }
-               }
-               else {
-                       print "\033[1;32mWARNING!\033[0m Could not execute the compiler you specified. You may want to try again.\n";
                }
        }
-}
 
-print "\n";
+       print "\n";
 
-# Directory Settings..
-my $tmpbase = $config{BASE_DIR};
-dir_check("do you wish to install the InspIRCd base", "BASE_DIR");
-if ($tmpbase ne $config{BASE_DIR}) {
-       $config{CONFIG_DIR}         = resolve_directory($config{BASE_DIR}."/conf");           # Configuration Directory
-       $config{MODULE_DIR}         = resolve_directory($config{BASE_DIR}."/modules");        # Modules Directory
-       $config{BINARY_DIR}         = resolve_directory($config{BASE_DIR}."/bin");            # Binary Directory
-       $config{LIBRARY_DIR}        = resolve_directory($config{BASE_DIR}."/lib");            # Library Directory
-}
+       # Directory Settings..
+       my $tmpbase = $config{BASE_DIR};
+       dir_check("do you wish to install the InspIRCd base", "BASE_DIR");
+       if ($tmpbase ne $config{BASE_DIR}) {
+               $config{CONFIG_DIR}         = resolve_directory($config{BASE_DIR}."/conf");           # Configuration Dir
+               $config{MODULE_DIR}         = resolve_directory($config{BASE_DIR}."/modules");        # Modules Directory
+               $config{BINARY_DIR}         = resolve_directory($config{BASE_DIR}."/bin");            # Binary Directory
+               $config{LIBRARY_DIR}        = resolve_directory($config{BASE_DIR}."/lib");            # Library Directory
+       }
 
-dir_check("are the configuration files", "CONFIG_DIR");
-dir_check("are the modules to be compiled to", "MODULE_DIR");
-dir_check("is the IRCd binary to be placed", "BINARY_DIR");
-dir_check("are the IRCd libraries to be placed", "LIBRARY_DIR");
+       dir_check("are the configuration files", "CONFIG_DIR");
+       dir_check("are the modules to be compiled to", "MODULE_DIR");
+       dir_check("is the IRCd binary to be placed", "BINARY_DIR");
+       dir_check("are the IRCd libraries to be placed", "LIBRARY_DIR");
 
-if ($has_kqueue) {
-       yesno(USE_KQUEUE,"You are running a BSD operating system, and kqueue\nwas detected. Would you like to enable kqueue support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable kqueue?");
-       print "\n";
-}
-if ($has_epoll) {
-       yesno(USE_EPOLL,"You are running a Linux 2.6+ operating system, and epoll\nwas detected. Would you like to enable epoll support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable epoll?");
-       print "\n";
-}
-$chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y"));
-if (!$chose_hiperf) {
-       print "No high-performance socket engines are available, or you chose\n";
-       print "not to enable one. Defaulting to select() engine.\n\n";
-}
+       if ($has_kqueue) {
+               yesno(USE_KQUEUE,"You are running a BSD operating system, and kqueue\nwas detected. Would you like to enable kqueue support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable kqueue?");
+               print "\n";
+       }
+       if ($has_epoll) {
+               yesno(USE_EPOLL,"You are running a Linux 2.6+ operating system, and epoll\nwas detected. Would you like to enable epoll support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable epoll?");
+               print "\n";
+       }
+       $chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y"));
+       if (!$chose_hiperf) {
+               print "No high-performance socket engines are available, or you chose\n";
+               print "not to enable one. Defaulting to select() engine.\n\n";
+       }
 
-yesno(THREADED_DNS,"Would you like to enable the experimental multi-threaded DNS lookup?");
-print "\n";
+       yesno(IPV6,"Would you like to build InspIRCd with IPv6 support?");
+       print "\n";
 
-if (($config{HAS_GNUTLS} eq "y") && ($config{HAS_OPENSSL} eq "y")) {
-       print "I have detected both GnuTLS and OpenSSL on your system.\n";
-       print "I will default to GnuTLS. If you wish to use OpenSSL\n";
-       print "instead, you should enable the OpenSSL module yourself\n";
-       print "by copying it from src/modules/extra to src/modules.\n\n";
-}
+       if ($config{IPV6} eq "y") {
+               print "You have chosen to build an \033[1;32mIPV6-only\033[0m server.\nTo accept IPV4 users, you must use the '::ffff:' notation of addresses.\n\n";
+               $config{SUPPORT_IP6LINKS} = "y";
+       } else {
+               yesno(SUPPORT_IP6LINKS,"You have chosen to build an \033[1;32mIPV4-only\033[0m server.\nWould you like to enable support for linking to IPV6-enabled\nInspIRCd servers which are using '::ffff:' notation?\nIf you are using a recent operating\nsystem and are unsure, answer yes.");
+               print "\n";
+       }
 
-if ($config{HAS_GNUTLS} eq "y") {
-       yesno(USE_GNUTLS, "Would you like to enable SSL Support?");
-       if ($config{USE_GNUTLS} eq "y") {
-               print "\nUsing GnuTLS SSL module.\n";
+       if (($config{HAS_GNUTLS} eq "y") && ($config{HAS_OPENSSL} eq "y")) {
+               print "I have detected both GnuTLS and OpenSSL on your system.\n";
+               print "I will default to GnuTLS. If you wish to use OpenSSL\n";
+               print "instead, you should enable the OpenSSL module yourself\n";
+               print "by copying it from src/modules/extra to src/modules.\n\n";
        }
-} elsif ($config{HAS_OPENSSL} eq "y") {
-       yesno(USE_OPENSSL, "Would you like to enable SSL Support?");
+
+       if ($config{HAS_GNUTLS} eq "y") {
+               yesno(USE_GNUTLS, "Would you like to enable SSL Support?");
+               if ($config{USE_GNUTLS} eq "y") {
+                       print "\nUsing GnuTLS SSL module.\n";
+               }
+       } elsif ($config{HAS_OPENSSL} eq "y") {
+                       yesno(USE_OPENSSL, "Would you like to enable SSL Support?");
        if ($config{USE_OPENSSL} eq "y") {
-               print "\nUsing OpenSSL SSL module.\nYou will get better performance if you move to GnuTLS in the future.\n";
+                       print "\nUsing OpenSSL SSL module.\nYou will get better performance if you move to GnuTLS in the future.\n";
+               }
        }
-}
 
-print "\nThe following questions will ask you for various figures relating\n";
-print "To your IRCd install. Please note that these should usually be left\n";
-print "as defaults unless you have a real reason to change them. If they\n";
-print "changed, then the values must be identical on all servers on your\n";
-print "network, or malfunctions and/or crashes may occur, with the exception\n";
-print "of the 'maximum number of clients' setting which may be different on\n";
-print "different servers on the network.\n\n";
+       print "\nThe following questions will ask you for various figures relating\n";
+       print "To your IRCd install. Please note that these should usually be left\n";
+       print "as defaults unless you have a real reason to change them. If they\n";
+       print "changed, then the values must be identical on all servers on your\n";
+       print "network, or malfunctions and/or crashes may occur, with the exception\n";
+       print "of the 'maximum number of clients' setting which may be different on\n";
+       print "different servers on the network.\n\n";
 
-# File Descriptor Settings..
-my $continue = 0;
-while (!$continue) {
-       print "Maximum number of clients at any one time ($config{MAX_CLIENT_T})\n";
-       print "[\033[1;32m$config{MAX_CLIENT}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_CLIENT};
-       }
-       if ($var =~ /^\d+$/) {
-               if (($var > $config{MAX_CLIENT_T}) && ($fd_scan_failed ne true)) {
-                       # Client has entered a larger number than the 'discovered' value
-                       # Confirm.
-                       print "WARNING: Our scans have indicated that you are attempting
+       # File Descriptor Settings..
+       my $continue = 0;
+       while (!$continue) {
+               print "Maximum number of clients at any one time ($config{MAX_CLIENT_T})\n";
+               print "[\033[1;32m$config{MAX_CLIENT}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_CLIENT};
+               }
+               if ($var =~ /^\d+$/) {
+                       if (($var > $config{MAX_CLIENT_T}) && ($fd_scan_failed ne true)) {
+                               # Client has entered a larger number than the 'discovered' value
+                               # Confirm.
+                               print "WARNING: Our scans have indicated that you are attempting
 to use more sockets than there are avaliable. Are you sure
 you wish to do this? It may cause the IRCd to malfunction [y/n]
 [\033[1;32mn\033[0m] -> $c";
-                       chomp($tmp = <STDIN>);
-                       if ($tmp ne "y") {
-                               print "Please enter the correct value.\n\n";
-                               next;
+                               chomp($tmp = <STDIN>);
+                               if ($tmp ne "y") {
+                                       print "Please enter the correct value.\n\n";
+                                       next;
+                               }
                        }
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+                       next;
                }
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
-               next;
-       }
-       # If we get here, we should be good to go.
-       $config{MAX_CLIENT} = $var;
-       $continue = 1;
-       print "\n";
-}
-
-my $continue = 0;
-while (!$continue) {
-       print "What is the maximum length of nicknames?\n";
-       print "[\033[1;32m$config{NICK_LENGT}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{NICK_LENGT};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{NICK_LENGT} = $var;
+               # If we get here, we should be good to go.
+               $config{MAX_CLIENT} = $var;
                $continue = 1;
                print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum length of channel names?\n";
-       print "[\033[1;32m$config{CHAN_LENGT}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{CHAN_LENGT};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{CHAN_LENGT} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+       my $continue = 0;
+       while (!$continue) {
+               print "What is the maximum length of nicknames?\n";
+               print "[\033[1;32m$config{NICK_LENGT}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{NICK_LENGT};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{NICK_LENGT} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum number of channels a normal user may join at any one time?\n";
-       print "[\033[1;32m$config{MAX_CHANNE}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_CHANNE};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAX_CHANNE} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum length of channel names?\n";
+               print "[\033[1;32m$config{CHAN_LENGT}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{CHAN_LENGT};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{CHAN_LENGT} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum number of channels an oper may join at any one time?\n";
-       print "[\033[1;32m$config{MAX_OPERCH}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_OPERCH};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAX_OPERCH} = $var;
-               $continue = 1;
-               print "\n";
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum number of channels a normal user may join at any one time?\n";
+               print "[\033[1;32m$config{MAX_CHANNE}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_CHANNE};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAX_CHANNE} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum number of mode changes in one line?\n";
-       print "[\033[1;32m$config{MAXI_MODES}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAXI_MODES};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAXI_MODES} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum number of channels an oper may join at any one time?\n";
+               print "[\033[1;32m$config{MAX_OPERCH}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_OPERCH};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAX_OPERCH} = $var;
+                       $continue = 1;
+                       print "\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum length of an ident (username)?\n";
-       print "[\033[1;32m$config{MAX_IDENT}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_IDENT};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAX_IDENT} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum number of mode changes in one line?\n";
+               print "[\033[1;32m$config{MAXI_MODES}\033[0m] -> ";
+                       chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAXI_MODES};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAXI_MODES} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum length of a quit message?\n";
-       print "[\033[1;32m$config{MAX_QUIT}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_QUIT};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAX_QUIT} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum length of an ident (username)?\n";
+               print "[\033[1;32m$config{MAX_IDENT}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_IDENT};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAX_IDENT} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum length of a channel topic?\n";
-       print "[\033[1;32m$config{MAX_TOPIC}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_TOPIC};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAX_TOPIC} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum length of a quit message?\n";
+               print "[\033[1;32m$config{MAX_QUIT}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_QUIT};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAX_QUIT} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum length of a kick message?\n";
-       print "[\033[1;32m$config{MAX_KICK}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_KICK};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAX_KICK} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum length of a channel topic?\n";
+               print "[\033[1;32m$config{MAX_TOPIC}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_TOPIC};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAX_TOPIC} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum length of a GECOS (real name) field?\n";
-       print "[\033[1;32m$config{MAX_GECOS}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_GECOS};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAX_GECOS} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum length of a kick message?\n";
+               print "[\033[1;32m$config{MAX_KICK}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_KICK};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAX_KICK} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum length of an away message?\n";
-       print "[\033[1;32m$config{MAX_AWAY}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_AWAY};
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum length of a GECOS (real name) field?\n";
+               print "[\033[1;32m$config{MAX_GECOS}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_GECOS};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAX_GECOS} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAX_AWAY} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum length of an away message?\n";
+               print "[\033[1;32m$config{MAX_AWAY}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_AWAY};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAX_AWAY} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-# Code Optimisation
-print "Enter the Level Of Binary optimisation. This is a number between 0 and 3.
+       # Code Optimisation
+       print "Enter the Level Of Binary optimisation. This is a number between 0 and 3.
 The InspIRCd Team will NOT support any bug reports above 0. Also note,
 the IRCd behaviour will be different depending on this value. Please
 read the documentation for more information.
@@ -569,51 +831,64 @@ value will default to 0 if you either don't enter a number, or enter
 a value outside the range.
 
 As always, if you are unsure, just press enter and accept the default.\n\n";
-print "[\033[1;32m$config{OPTIMITEMP}\033[0m] -> ";
-chomp($var = <STDIN>);
-if ($var eq "") {
-       $var = $config{OPTIMITEMP};
-}
-
-if ($var eq "1") {
-       $config{OPTIMITEMP} = 1;
-       $config{OPTIMISATI} = "-O";
-} elsif ($var eq "2") {
-       $config{OPTIMITEMP} = 2;
-       $config{OPTIMISATI} = "-O2";
-} elsif ($var eq "3") {
-       $config{OPTIMITEMP} = 3;
-       $config{OPTIMISATI} = "-O3";
-} else {
-       $config{OPTIMITEMP} = 0;
-       $config{OPTIMISATI} = "-g";
+       print "[\033[1;32m$config{OPTIMITEMP}\033[0m] -> ";
+       chomp($var = <STDIN>);
+       if ($var eq "") {
+               $var = $config{OPTIMITEMP};
+       }
+
+       if ($var eq "1") {
+               $config{OPTIMITEMP} = 1;
+               $config{OPTIMISATI} = "-O";
+       } elsif ($var eq "2") {
+               $config{OPTIMITEMP} = 2;
+               $config{OPTIMISATI} = "-O2";
+       } elsif ($var eq "3") {
+               $config{OPTIMITEMP} = 3;
+               $config{OPTIMISATI} = "-O3";
+       } else {
+               $config{OPTIMITEMP} = 0;
+               $config{OPTIMISATI} = "-g";
+       }
 }
 
 print "\n\033[1;32mPre-build configuration is complete!\033[0m\n\n";
-print "\033[0mBase install path:\033[1;32m\t\t$config{BASE_DIR}\n";
-print "\033[0mConfig path:\033[1;32m\t\t\t$config{CONFIG_DIR}\n";
-print "\033[0mModule path:\033[1;32m\t\t\t$config{MODULE_DIR}\n";
-print "\033[0mLibrary path:\033[1;32m\t\t\t$config{LIBRARY_DIR}\n";
-print "\033[0mMax connections:\033[1;32m\t\t$config{MAX_CLIENT}\n";
-print "\033[0mMax User Channels:\033[1;32m\t\t$config{MAX_CHANNE}\n";
-print "\033[0mMax Oper Channels:\033[1;32m\t\t$config{MAX_OPERCH}\n";
-print "\033[0mMax nickname length:\033[1;32m\t\t$config{NICK_LENGT}\n";
-print "\033[0mMax channel length:\033[1;32m\t\t$config{CHAN_LENGT}\n";
-print "\033[0mMax mode length:\033[1;32m\t\t$config{MAXI_MODES}\n";
-print "\033[0mMax ident length:\033[1;32m\t\t$config{MAX_IDENT}\n";
-print "\033[0mMax quit length:\033[1;32m\t\t$config{MAX_QUIT}\n";
-print "\033[0mMax topic length:\033[1;32m\t\t$config{MAX_TOPIC}\n";
-print "\033[0mMax kick length:\033[1;32m\t\t$config{MAX_KICK}\n";
-print "\033[0mMax name length:\033[1;32m\t\t$config{MAX_GECOS}\n";
-print "\033[0mMax away length:\033[1;32m\t\t$config{MAX_AWAY}\n";
-print "\033[0mGCC Version Found:\033[1;32m\t\t$config{GCCVER}.$config{GCC34}\n";
+print "\033[0mBase install path:\033[1;32m\t\t$config{BASE_DIR}\033[0m\n";
+print "\033[0mConfig path:\033[1;32m\t\t\t$config{CONFIG_DIR}\033[0m\n";
+print "\033[0mModule path:\033[1;32m\t\t\t$config{MODULE_DIR}\033[0m\n";
+print "\033[0mLibrary path:\033[1;32m\t\t\t$config{LIBRARY_DIR}\033[0m\n";
+print "\033[0mMax connections:\033[1;32m\t\t$config{MAX_CLIENT}\033[0m\n";
+print "\033[0mMax User Channels:\033[1;32m\t\t$config{MAX_CHANNE}\033[0m\n";
+print "\033[0mMax Oper Channels:\033[1;32m\t\t$config{MAX_OPERCH}\033[0m\n";
+print "\033[0mMax nickname length:\033[1;32m\t\t$config{NICK_LENGT}\033[0m\n";
+print "\033[0mMax channel length:\033[1;32m\t\t$config{CHAN_LENGT}\033[0m\n";
+print "\033[0mMax mode length:\033[1;32m\t\t$config{MAXI_MODES}\033[0m\n";
+print "\033[0mMax ident length:\033[1;32m\t\t$config{MAX_IDENT}\033[0m\n";
+print "\033[0mMax quit length:\033[1;32m\t\t$config{MAX_QUIT}\033[0m\n";
+print "\033[0mMax topic length:\033[1;32m\t\t$config{MAX_TOPIC}\033[0m\n";
+print "\033[0mMax kick length:\033[1;32m\t\t$config{MAX_KICK}\033[0m\n";
+print "\033[0mMax name length:\033[1;32m\t\t$config{MAX_GECOS}\033[0m\n";
+print "\033[0mMax away length:\033[1;32m\t\t$config{MAX_AWAY}\033[0m\n";
+print "\033[0mGCC Version Found:\033[1;32m\t\t$config{GCCVER}.x\033[0m\n";
 print "\033[0mOptimization Flag:\033[1;32m\t\t$config{OPTIMISATI}\033[0m\n";
 print "\033[0mCompiler program:\033[1;32m\t\t$config{CC}\033[0m\n";
 print "\033[0mStatic modules:\033[1;32m\t\t\t$config{STATIC_LINK}\033[0m\n";
-print "\033[0mMultithread DNS:\033[1;32m\t\t$config{THREADED_DNS}\033[0m\n";
+print "\033[0mIPv6 Support:\033[1;32m\t\t\t$config{IPV6}\033[0m\n";
+print "\033[0mIPv6 to IPv4 Links:\033[1;32m\t\t$config{SUPPORT_IP6LINKS}\033[0m\n";
 print "\033[0mGnuTLS Support:\033[1;32m\t\t\t$config{USE_GNUTLS}\033[0m\n";
 print "\033[0mOpenSSL Support:\033[1;32m\t\t$config{USE_OPENSSL}\033[0m\n\n";
 
+if (($config{USE_GNUTLS} eq "y") && ($config{HAS_GNUTLS} ne "y"))
+{
+       print "Sorry, but i couldn't detect gnutls. Make sure gnutls-config is in your path.\n";
+       exit(0);
+}
+if (($config{USE_OPENSSL} eq "y") && ($config{HAS_OPENSSL} ne "y"))
+{
+       print "Sorry, but i couldn't detect openssl. Make sure openssl is in your path.\n";
+       exit(0);
+}
+
 if ($config{USE_GNUTLS} eq "y") {
        $failed = 0;
        open(TMP, "<src/modules/m_ssl_gnutls.cpp") or $failed = 1;
@@ -622,16 +897,19 @@ if ($config{USE_GNUTLS} eq "y") {
                print "Symlinking src/modules/m_ssl_gnutls.cpp from extra/\n";
                chdir("src/modules");
                system("ln -s extra/m_ssl_gnutls.cpp");
+               system("ln -s extra/ssl_cert.h");
                chdir("../..");
        }
        getmodules();
-       $failed = 0;
-       open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
-       close(TMP);
-       open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
-       close(TMP);
-       if ($failed) {
-               print "SSL Certificates Not found, Generating.. \n\n
+       if ($interactive)
+       {
+               $failed = 0;
+               open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
+               close(TMP);
+               open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
+               close(TMP);
+               if ($failed) {
+                       print "SSL Certificates Not found, Generating.. \n\n
 *************************************************************
 * Generating the Private Key may take some time, go grab a  *
 * Coffee. Even better, to generate some more entropy if it  *
@@ -639,15 +917,20 @@ if ($config{USE_GNUTLS} eq "y") {
 * few times and get that HD going :) Then answer the        *
 * Questions which follow. If you are unsure, just hit enter *
 *************************************************************\n\n";
-               system("certtool --generate-privkey --outfile key.pem");
-               system("certtool --generate-self-signed --load-privkey key.pem --outfile cert.pem");
-               print "\nCertificate generation complete, copying to config directory... ";
-               system("mv key.pem $config{CONFIG_DIR}/key.pem");
-               system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
-               print "Done.\n\n";
-       } else {
-               print "SSL Certificates found, skipping.\n\n"
-       }       
+                       system("certtool --generate-privkey --outfile key.pem");
+                       system("certtool --generate-self-signed --load-privkey key.pem --outfile cert.pem");
+                       print "\nCertificate generation complete, copying to config directory... ";
+                       system("mv key.pem $config{CONFIG_DIR}/key.pem");
+                       system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
+                       print "Done.\n\n";
+               } else {
+                       print "SSL Certificates found, skipping.\n\n"
+               }
+       }
+       else
+       {
+               print "Skipping SSL certificate generation\nin non-interactive mode.\n\n";
+       }
 } elsif ($config{USE_OPENSSL} eq "y") {
        $failed = 0;
        open(TMP, "<src/modules/m_ssl_openssl.cpp") or $failed = 1;
@@ -656,29 +939,37 @@ if ($config{USE_GNUTLS} eq "y") {
                print "Symlinking src/modules/m_ssl_openssl.cpp from extra/\n";
                chdir("src/modules");
                system("ln -s extra/m_ssl_openssl.cpp");
+               system("ln -s extra/ssl_cert.h");
                chdir("../..");
        }
        getmodules();
        $failed = 0;
-       open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
-       close(TMP);
-       open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
-       close(TMP);
-       if ($failed) {
-               print "SSL Certificates Not found, Generating.. \n\n
+       if ($interactive)
+       {
+               open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
+               close(TMP);
+               open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
+               close(TMP);
+               if ($failed) {
+                       print "SSL Certificates Not found, Generating.. \n\n
 *************************************************************
 * Generating the certificates may take some time, go grab a *
 * coffee, or something.                                     *
 *************************************************************\n\n";
-               system("openssl req -x509 -nodes -newkey rsa:1024 -keyout key.pem -out cert.pem");
-               system("openssl dhparam -out dhparams.pem 1024");
-               print "\nCertificate generation complete, copying to config directory... ";
-               system("mv key.pem $config{CONFIG_DIR}/key.pem");
-               system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
-               system("mv dhparams.pem $config{CONFIG_DIR}/dhparams.pem");
-               print "Done.\n\n";
-       } else {
-               print "SSL Certificates found, skipping.\n\n"
+                       system("openssl req -x509 -nodes -newkey rsa:1024 -keyout key.pem -out cert.pem");
+                       system("openssl dhparam -out dhparams.pem 1024");
+                       print "\nCertificate generation complete, copying to config directory... ";
+                       system("mv key.pem $config{CONFIG_DIR}/key.pem");
+                       system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
+                       system("mv dhparams.pem $config{CONFIG_DIR}/dhparams.pem");
+                       print "Done.\n\n";
+               } else {
+                       print "SSL Certificates found, skipping.\n\n"
+               }
+       }
+       else
+       {
+               print "Skipping SSL certificate generation\nin non-interactive mode.\n\n";
        }
 }
 if (($config{USE_GNUTLS} eq "n") && ($config{USE_OPENSSL} eq "n")) {
@@ -687,7 +978,7 @@ if (($config{USE_GNUTLS} eq "n") && ($config{USE_OPENSSL} eq "n")) {
 
 getosflags();
 makecache();
-writefiles();
+writefiles(1);
 
 print "\n\n";
 print "To build your server with these settings, please type '\033[1;32m$config{MAKEPROG}\033[0m' now.\n";
@@ -756,17 +1047,20 @@ sub dir_check {
                        # Convert it to a full path..
                        $var = resolve_directory($ENV{HOME} . "/" . $1);
                }
-               if (substr($var,0,1) ne "/")
+               elsif ((($config{OSNAME} == "MINGW32") and ($var !~ /^[A-Z]{1}:\\.*/)) and (substr($var,0,1) ne "/"))
                {
                        # Assume relative Path was given.. fill in the rest.
                        $var = $this . "/$var";
                }
+               
                $var = resolve_directory($var); 
                if (! -e $var) {
                        print "$var does not exist. Create it?\n[\033[1;32my\033[0m] ";
                        chomp($tmp = <STDIN>);
                        if (($tmp eq "") || ($tmp =~ /^y/i)) {
                                # Attempt to Create the Dir..
+                               
+                               system("mkdir -p \"$var\" >> /dev/null 2>&1");
                                $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256;
                                if ($chk != 0) {
                                        print "Unable to create directory. ($var)\n\n";
@@ -794,8 +1088,8 @@ sub dir_check {
 
 sub getosflags {
        if ($config{OSNAME} =~ /BSD$/) {
-               $config{LDLIBS} = "-Ldl -lstdc++";
-               $config{FLAGS}  = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
+               $config{LDLIBS} = "-lstdc++";
+               $config{FLAGS}  = "-fPIC -Wall -Woverloaded-virtual $config{OPTIMISATI}";
                $config{MAKEPROG} = "gmake";
                if ($config{OSNAME} eq "OpenBSD") {
                        chomp($foo = `eg++ -dumpversion | cut -c 1`);
@@ -804,35 +1098,49 @@ sub getosflags {
                        # compile as this standard version is 2.95.3!
                        if ($foo ne "") {
                                $config{CC} = "eg++";
-                               chomp($config{GCCVER}       = `eg++ -dumpversion | cut -c 1`); # we must redo these if we change
-                               chomp($config{GCC34}        = `eg++ -dumpversion | cut -c 3`); # the compiler path
+                               chomp($config{GCCVER}       = `eg++ -dumpversion | cut -c 1`); # we must redo these if we change the compiler path
                        }
+                       return "OpenBSD";
                }
+               return $config{OSNAME};
        } else {
                $config{LDLIBS} = "-ldl -lstdc++";
-               $config{FLAGS}  = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
+               $config{FLAGS}  = "-fPIC -Wall -Woverloaded-virtual $config{OPTIMISATI}";
                $config{MAKEPROG} = "make";
                if ($config{OSNAME} =~ /CYGWIN/) {
-                       $config{FLAGS}  = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
+                       $config{FLAGS}  = "-Wall -Woverloaded-virtual $config{OPTIMISATI}";
                        $config{LDLIBS} = "";
                        $config{MAKEPROG} = "/usr/bin/make";
-                       $config{MAKEORDER} = "ircd mods config bininst";
+                       $config{MAKEORDER} = "ircd mods";
+                       return "Cygwin";
                } elsif ($config{OSNAME} eq "CYG-STATIC") {
-                       $config{FLAGS} = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
+                       $config{FLAGS} = "-Wall -Woverloaded-virtual $config{OPTIMISATI}";
                        $config{LDLIBS} = "";
                        $config{MAKEPROG} = "/usr/bin/make";
-                       $config{MAKEORDER} = "mods ircd config bininst";
+                       $config{MAKEORDER} = "mods ircd";
                        $config{STATICLIBS} = "modules/mods.a";
                        $config{STATIC_LINK} = "yes";
+                       return "Cygwin-Static";
                }
+               return "Linux";
        }
-       if ($config{OSNAME} =~ /SunOS/) {
+       
+       if ($config{OSNAME} =~ /SunOS/)
+       {
                # solaris/sunos needs these
                # socket = bsd sockets api
                # nsl = dns stuff
                # rt = POSIX realtime extensions
                # resolv = inet_aton only (why isnt this in nsl?!)
                $config{LDLIBS} = $config{LDLIBS} . " -lsocket -lnsl -lrt -lresolv";
+               return "Solaris";
+       }
+       
+       if($config{OSNAME} eq "MINGW32")
+       {
+               # All code is position-independent on windows
+               $config{FLAGS} =~ s/-fPIC //;
+               return "MinGW";
        }
 }
 
@@ -850,6 +1158,7 @@ sub is_dir {
 
 sub getmodules {
        my $i = 0;
+       print "Detecting modules ";
        opendir(DIRHANDLE, "src/modules");
        foreach $name (sort readdir(DIRHANDLE)) {
                if ($name =~ /^m_(.+)\.cpp$/)
@@ -857,24 +1166,48 @@ sub getmodules {
                        $mod = $1;
                        if ($mod !~ /_static$/) {
                                $modlist[$i++] = $mod;
+                               print ".";
                        }
                }
        }
        closedir(DIRHANDLE);
+       print "\nOk, $i modules.\n";
+}
+
+sub getrevision {
+       if ($no_svn) {
+               return "0";
+       }
+       my $data = `svn info`;
+       
+       if ($data eq "") {
+               $no_svn = 1;
+               $rev = "0";
+               return $rev;
+       }
+       $data =~ /Revision: (\d+)/;
+       my $rev = $1;
+       if (!defined($rev)) {
+               $rev = "0";
+       }
+       return $rev;
 }
 
 sub writefiles {
-       print "Writing \033[1;32minspircd_config.h\033[0m\n";
+       my($writeheader) = @_;
        # First File.. inspircd_config.h
        chomp(my $incos = `uname -n -s -r`);
        chomp(my $version = `sh ./src/version.sh`);
-        chomp(my $revision = `./src/svn-rev.sh`);
-       $version = "$version (r$revision)";
-       chomp(my $revision2 = `./src/svn-rev.sh`);
-       open(FILEHANDLE, ">include/inspircd_config.h");
-       my $NL = $config{NICK_LENGT}+1;
-       my $CL = $config{CHAN_LENGT}+1;
-       print FILEHANDLE <<EOF;
+        chomp(my $revision = getrevision());
+       $version = "$version(r$revision)";
+       chomp(my $revision2 = getrevision());
+       if ($writeheader == 1)
+       {
+               print "Writing \033[1;32minspircd_config.h\033[0m\n";
+               open(FILEHANDLE, ">include/inspircd_config.h");
+               my $NL = $config{NICK_LENGT}+1;
+               my $CL = $config{CHAN_LENGT}+1;
+               print FILEHANDLE <<EOF;
 /* Auto generated by configure, do not modify! */
 #ifndef __CONFIGURATION_AUTO__
 #define __CONFIGURATION_AUTO__
@@ -897,58 +1230,77 @@ sub writefiles {
 #define MAXGECOS $config{MAX_GECOS}
 #define MAXAWAY $config{MAX_AWAY}
 #define OPTIMISATION $config{OPTIMITEMP}
+#define LIBRARYDIR "$config{LIBRARY_DIR}"
 #define SYSTEM "$incos"
 #define MAXBUF 514
 EOF
-       if ($config{OSNAME} =~ /SunOS/) {
-               print FILEHANDLE "#define IS_SOLARIS\n";
-       }
-       if ($config{OSNAME} =~ /CYGWIN/) {
-               print FILEHANDLE "#define IS_CYGWIN\n";
-               print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE        1024\n#endif\n";
-       }
-       if ($config{OSNAME} eq "CYG-STATIC") {
-               print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE    1024\n#endif\n";
-       }
-
-       if ($config{STATIC_LINK} eq "yes") {
-               print FILEHANDLE "#define STATIC_LINK\n";
-       }
-       if ($config{GCCVER} > 3) {
-               print FILEHANDLE "#define GCC3\n";
-               print FILEHANDLE "#define GCC34\n";
-       }
-       else
-       {
-               if ($config{GCCVER} == 3) {
+               if ($config{OSNAME} =~ /SunOS/) {
+                       print FILEHANDLE "#define IS_SOLARIS\n";
+               }
+               if ($config{OSNAME} =~ /CYGWIN/) {
+                       print FILEHANDLE "#define IS_CYGWIN\n";
+                       print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE        1024\n#endif\n";
+               }
+               if ($config{OSNAME} eq "MINGW32") {
+                       print FILEHANDLE "#define IS_MINGW\n";
+               }
+               if ($config{OSNAME} eq "CYG-STATIC") {
+                       print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE    1024\n#endif\n";
+               }
+               if ($config{STATIC_LINK} eq "yes") {
+                       print FILEHANDLE "#define STATIC_LINK\n";
+               }
+               if ($config{GCCVER} >= 3) {
                        print FILEHANDLE "#define GCC3\n";
-                       if ($config{GCC34} > 3) {
-                               print FILEHANDLE "#define GCC34\n";
-                       }
                }
+               if ($config{HAS_STRLCPY} eq "true") {
+                       print FILEHANDLE "#define HAS_STRLCPY\n";
+               }
+               if ($config{HAS_STDINT} eq "true") {
+                       print FILEHANDLE "#define HAS_STDINT\n";
+               }
+               if ($config{IPV6} =~ /y/i) {
+                       print FILEHANDLE "#define IPV6\n";
+               }
+               if ($config{SUPPORT_IP6LINKS} =~ /y/i) {
+                       print FILEHANDLE "#define SUPPORT_IP6LINKS\n";
+               }
+               my $use_hiperf = 0;
+               if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
+                       print FILEHANDLE "#define USE_KQUEUE\n";
+                       $se = "socketengine_kqueue";
+                       $use_hiperf = 1;
+               }
+               if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
+                       print FILEHANDLE "#define USE_EPOLL\n";
+                       $se = "socketengine_epoll";
+                       $use_hiperf = 1;
+               }
+               # user didn't choose either epoll or select for their OS.
+               # default them to USE_SELECT (ewwy puke puke)
+               if (!$use_hiperf) {
+                       print FILEHANDLE "#define USE_SELECT\n";
+                       $se = "socketengine_select";
+               }
+               print FILEHANDLE "\n#endif\n";
+               close(FILEHANDLE);
        }
-       if ($config{HAS_STRLCPY} eq "true") {
-               print FILEHANDLE "#define HAS_STRLCPY\n";
-       }
-       if ($config{THREADED_DNS} =~ /y/i) {
-               print FILEHANDLE "#define THREADED_DNS\n";
-       }
-       my $use_hiperf = 0;
-       if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
-               print FILEHANDLE "#define USE_KQUEUE\n";
-               $use_hiperf = 1;
-       }
-       if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
-               print FILEHANDLE "#define USE_EPOLL\n";
-               $use_hiperf = 1;
-       }
-       # user didn't choose either epoll or select for their OS.
-       # default them to USE_SELECT (ewwy puke puke)
-       if (!$use_hiperf) {
-               print FILEHANDLE "#define USE_SELECT\n";
+
+       if ($writeheader)
+       {
+               open(FILEHANDLE, ">include/inspircd_se_config.h");
+               print FILEHANDLE <<EOF;
+/* Auto generated by configure, do not modify or commit to svn! */
+#ifndef __CONFIGURATION_SOCKETENGINE__
+#define __CONFIGURATION_SOCKETENGINE__
+
+#include "$se.h"
+
+#endif
+EOF
+               close(FILEHANDLE);
        }
-       print FILEHANDLE "\n#endif\n";
-       close(FILEHANDLE);
+
 
        # Create a Modules List..
        my $modules = "";
@@ -974,9 +1326,7 @@ EOF
        }
 
        opendir(DIRHANDLE, $this);
-       if ($config{THREADED_DNS} =~ /y/i) {
-               $config{LDLIBS} = $config{LDLIBS} . " -pthread";
-       }
+
        foreach $name (sort readdir(DIRHANDLE)) {
                if ($name =~ /^\.(.+)\.inc$/) {
                        $file = $1;
@@ -1053,15 +1403,17 @@ sub getlinkerflags {
        return undef;
 }
 
-sub show_splash {
-  print "'\033[1;33m####\033[0m:'\033[1;33m##\033[0m::: \033[1;33m##\033[0m::'\033[1;33m######\033[0m::'\033[1;33m########\033[0m::'\033[1;33m####\033[0m:'\033[1;33m########\033[0m:::'\033[1;33m######\033[0m::'\033[1;33m########\033[0m::\n";
-  print ". \033[1;33m##\033[0m:: \033[1;33m###\033[0m:: \033[1;33m##\033[0m:'\033[1;33m##\033[0m... \033[1;33m##\033[0m: \033[1;33m##\033[0m.... \033[1;33m##\033[0m:. \033[1;33m##\033[0m:: \033[1;33m##\033[0m.... \033[1;33m##\033[0m:'\033[1;33m##\033[0m... \033[1;33m##\033[0m: \033[1;33m##\033[0m.... \033[1;33m##\033[0m:\n";
-  print ": \033[1;33m##\033[0m:: \033[1;33m####\033[0m: \033[1;33m##\033[0m: \033[1;33m##\033[0m:::..:: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:: \033[1;33m##\033[0m:: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m: \033[1;33m##\033[0m:::..:: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:\n";
-  print ": \033[1;33m##\033[0m:: \033[1;33m##\033[0m \033[1;33m##\033[0m \033[1;33m##\033[0m:. \033[1;33m######\033[0m:: \033[1;33m########\033[0m::: \033[1;33m##\033[0m:: \033[1;33m########\033[0m:: \033[1;33m##\033[0m::::::: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:\n";
-  print ": \033[1;33m##\033[0m:: \033[1;33m##\033[0m. \033[1;33m####\033[0m::..... \033[1;33m##\033[0m: \033[1;33m##\033[0m.....:::: \033[1;33m##\033[0m:: \033[1;33m##\033[0m.. \033[1;33m##\033[0m::: \033[1;33m##\033[0m::::::: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:\n";
-  print ": \033[1;33m##\033[0m:: \033[1;33m##\033[0m:. \033[1;33m###\033[0m:'\033[1;33m##\033[0m::: \033[1;33m##\033[0m: \033[1;33m##\033[0m::::::::: \033[1;33m##\033[0m:: \033[1;33m##\033[0m::. \033[1;33m##\033[0m:: \033[1;33m##\033[0m::: \033[1;33m##\033[0m: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:\n";
-  print "'\033[1;33m####\033[0m: \033[1;33m##\033[0m::. \033[1;33m##\033[0m:. \033[1;33m######\033[0m:: \033[1;33m##\033[0m::::::::'\033[1;33m####\033[0m: \033[1;33m##\033[0m:::. \033[1;33m##\033[0m:. \033[1;33m######\033[0m:: \033[1;33m########\033[0m::\n";
-  print "\033[0m\033[0m....::..::::..:::......:::..:::::::::....::..:::::..:::......:::........:::\n\n";
+sub getdependencies {
+       my ($file) = @_;
+       open(FLAGS, $file);
+       while (<FLAGS>) {
+               if ($_ =~ /^\/\* \$ModDep: (.+) \*\/$/) {
+                       close(FLAGS);
+                       return $1;
+               }
+       }
+       close(FLAGS);
+       return undef;
 }
 
 sub resolve_directory {
@@ -1144,14 +1496,15 @@ HEADER
                if ($i !~ /_static$/) {
                        $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
                        $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
+                       $deps = getdependencies("src/modules/m_".$i.".cpp");
 
                        ###
                        # Write Entry to the Makefile
                        ###
                        print FILEHANDLE <<EOCHEESE;
-m_$i.o: m_$i\_static.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h
-       \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c m_$i\_static.cpp
-       mv m_$i\_static.o ../m_$i.o
+m_$i.o: .m_$i\_static.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h $deps
+       \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c .m_$i\_static.cpp
+       mv .m_$i\_static.o ../m_$i.o
 
 EOCHEESE
                        ###
@@ -1159,7 +1512,7 @@ EOCHEESE
                        ###
                        print "Configuring module [\033[1;32mm_$i.so\033[0m] for static linking... ";
                        open(MODULE,"<src/modules/m_".$i.".cpp") or die("Could not open m_".$i.".cpp");
-                       open(MUNGED,">src/modules/m_".$i."_static.cpp") or die("Could not create m_".$i."_static.cpp");
+                       open(MUNGED,">src/modules/.m_".$i."_static.cpp") or die("Could not create .m_".$i."_static.cpp");
                        while (chomp($a = <MODULE>)) { 
                                $a =~ s/init_module/$i\_init/g;
                                print MUNGED "$a\n";
@@ -1217,18 +1570,19 @@ EOF
        ###
        $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
        $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
+       $deps = getdependencies("src/modules/m_".$i.".cpp");
        print FILEHANDLE <<EOCHEESE;
-m_$i.so: m_$i.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h ../../include/inspircd_config.h ../../include/inspircd.h ../../include/inspircd_io.h
+m_$i.so: m_$i.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h ../../include/inspircd_config.h ../../include/inspircd.h ../../include/configreader.h $deps
        \$(CC) -pipe -I../../include \$(FLAGS) $cmflags -export-dynamic -c m_$i.cpp
        \$(CC) \$(FLAGS) -shared $liflags -o m_$i.so m_$i.o $extra
 
 EOCHEESE
-       $crud = $crud . "       install -v -m 0700 m_$i.so \$(MODPATH)\n";
-       ###
+       $crud = $crud . "       install -m 0700 m_$i.so \$(MODPATH)\n";
+###
        # End Write Entry to the MakeFile
        ###
        }
-       print FILEHANDLE "modinst:\n" . $crud;
+       print FILEHANDLE "modinst:\n    \@echo \"Installing modules...\"\n" . $crud;
 }
 
 
@@ -1260,8 +1614,19 @@ sub write_static_makefile {
 CC = im a cheezeball
 
 CXXFLAGS = -I../include \${FLAGS}
+CPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* //' | grep -v svn)
+RELCPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* /modes\\//' | grep -v svn)
 
 EOM
+
+$se = "socketengine_select";
+if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
+       $se = "socketengine_kqueue";
+}       
+elsif (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
+       $se = "socketengine_epoll";
+}
+
        ###
        # This next section is for cygwin dynamic module builds.
        # Basically, what we do, is build the inspircd core as a library
@@ -1273,20 +1638,20 @@ EOM
 
        if ($config{OSNAME} =~ /CYGWIN/) {
                print FH <<EOM;
-all: timer.o aes.o command_parse.o cull_list.o userprocess.o socketengine.o socket.o hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_io.o message.o $cmdobjs commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o helperfuncs.o inspircd.exe
+all: timer.o aes.o command_parse.o cull_list.o userprocess.o socketengine.o socket.o hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o configreader.o inspsocket.o $cmdobjs commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o snomasks.o inspircd.exe
 
 inspircd.exe: inspircd.dll.a
        \$(CC) -o \$@ \$^
 
-inspircd.dll inspircd.dll.a: inspircd.o channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_io.o message.o $cmdobjs  commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o aes.o timer.o
+inspircd.dll inspircd.dll.a: inspircd.o channels.o mode.o xline.o inspstring.o dns.o base.o configreader.o inspsocket.o $cmdobjs  commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o aes.o timer.o snomasks.o
        \$(CC) -shared -Wl,--out-implib=inspircd.dll.a -o inspircd.dll \$^
 EOM
        } else {
                print FH <<EOM;
-all: timer.o aes.o command_parse.o cull_list.o userprocess.o socketengine.o socket.o hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_io.o message.o $cmdobjs commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o helperfuncs.o \$(MODULES) inspircd.exe
+all: timer.o aes.o command_parse.o cull_list.o userprocess.o socketengine.o socket.o hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o configreader.o inspsocket.o $cmdobjs commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o snomasks.o \$(MODULES) inspircd.exe
 
 inspircd.exe: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h ../include/base.h
-       \$(CC) -I../include \$(FLAGS) inspircd.cpp -o inspircd.exe \$(LDLIBS) channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_io.o message.o $cmdobjs commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o aes.o timer.o \$(MODULES)
+       \$(CC) -I../include \$(FLAGS) inspircd.cpp -o inspircd.exe \$(LDLIBS) channels.o mode.o xline.o inspstring.o dns.o base.o inspsocket.o configreader.o $cmdobjs commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o aes.o timer.o snomasks.o modes/modeclasses.a \$(MODULES)
 EOM
        }
 
@@ -1295,25 +1660,29 @@ EOM
 cull_list.o: cull_list.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/users.h ../include/channels.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
 
+snomasks.o: snomasks.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/channels.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c snomasks.cpp
+
 command_parse.o: command_parse.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
 
 userprocess.o: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
 
-socketengine.o: socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
-       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
+socketengine.o: $se.cpp socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/$se.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp $se.cpp
 
 hashcomp.o: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
 
 helperfuncs.o: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
-       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
+       \$(CC) -pipe -I/usr/local/include -L/usr/local/lib -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
 
 channels.o: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
 
-mode.o: mode.cpp ../include/base.h ../include/mode.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
+mode.o: mode.cpp ../include/base.h ../include/mode.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h \$(RELCPPFILES) modes/modeclasses.a
+       \${MAKE} -C "modes" DIRNAME="src/modes" \$(MAKEARGS)
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
 
 xline.o: xline.cpp ../include/base.h ../include/xline.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
@@ -1328,18 +1697,12 @@ dns.o: dns.cpp ../include/base.h ../include/dns.h ../include/inspircd.h ../inclu
 base.o: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
 
-inspircd_io.o: inspircd_io.cpp ../include/base.h ../include/inspircd_io.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
-       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_io.cpp
-
-message.o: message.cpp ../include/base.h ../include/message.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
-       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
+configreader.o: configreader.cpp ../include/base.h ../include/configreader.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c configreader.cpp
 
 commands.o: commands.cpp ../include/base.h ../include/commands.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h $srcobjs
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp $cmdobjs
 
-dnsqueue.o: dnsqueue.cpp ../include/base.h ../include/dnsqueue.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
-       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
-
 dynamic.o: dynamic.cpp ../include/base.h ../include/dynamic.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
 
@@ -1354,6 +1717,9 @@ wildcard.o: wildcard.cpp ../include/base.h ../include/wildcard.h ../include/insp
 
 socket.o: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
+       
+inspsocket.o: inspsocket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspsocket.cpp
 
 aes.o: aes.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c aes.cpp
@@ -1364,7 +1730,7 @@ timer.o: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h
 EOM
        foreach my $cmd (@cmdlist) {
                print FH <<ITEM;
-cmd_$cmd.o: cmd_$cmd.cpp ../include/base.h ../include/modules.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/cmd_$cmd.h
+cmd_$cmd.o: cmd_$cmd.cpp ../include/base.h ../include/modules.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/commands/cmd_$cmd.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
 ITEM
        }
@@ -1386,10 +1752,18 @@ sub write_dynamic_makefile {
        my $cmdobjs = "";
        my $srcobjs = "";
        foreach my $cmd (@cmdlist) {
-               $cmdobjs = $cmdobjs . "cmd_$cmd.o ";
+               $cmdobjs = $cmdobjs . "cmd_$cmd.so ";
                $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
        }
 
+       $se = "socketengine_select";
+       if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
+               $se = "socketengine_kqueue";
+       }
+       elsif (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
+               $se = "socketengine_epoll";
+       }
+
        open(FH,">src/Makefile") or die("Could not write src/Makefile");
        print FH <<EOM;
 # Insp Makefile :p
@@ -1402,15 +1776,21 @@ sub write_dynamic_makefile {
 CC = im a cheezeball
 
 CXXFLAGS = -I../include \${FLAGS}
+CPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* //' | grep -v svn)
+RELCPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* /modes\\//' | grep -v svn)
+
+all: libIRCDtimer.so libIRCDaes.so libIRCDcull_list.so libIRCDuserprocess.so libIRCDsocketengine.so libIRCDsocket.so libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so $cmdobjs libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so libIRCDsnomasks.so inspircd
 
-all: libIRCDtimer.so libIRCDaes.so libIRCDcull_list.so libIRCDuserprocess.so libIRCDsocketengine.so libIRCDsocket.so libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDio.so libIRCDmessage.so $cmdobjs libIRCDcommands.so libIRCDdnsqueue.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so inspircd
+inspircd: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h ../include/socket.h libIRCDtimer.so libIRCDaes.so libIRCDcull_list.so libIRCDuserprocess.so libIRCDsocketengine.so libIRCDsocket.so libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so $cmdobjs libIRCDsnomasks.so libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so
+       \$(CC) -I../include $extra -Wl,--rpath -Wl,/usr/local/lib -Wl,--rpath -Wl,$config{LIBRARY_DIR} \$(FLAGS) -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDhash.so libIRCDsocket.so libIRCDsocketengine.so libIRCDuserprocess.so libIRCDcull_list.so libIRCDcommand_parse.so libIRCDaes.so libIRCDtimer.so libIRCDsnomasks.so
 
-inspircd: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h ../include/socket.h
-       \$(CC) -I../include -Wl,--rpath -Wl,$config{LIBRARY_DIR} \$(FLAGS) -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDio.so libIRCDmessage.so libIRCDcommands.so libIRCDdnsqueue.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDhash.so libIRCDsocket.so libIRCDsocketengine.so libIRCDuserprocess.so libIRCDcull_list.so libIRCDcommand_parse.so libIRCDaes.so libIRCDtimer.so
+libIRCDsocketengine.so: $se.cpp socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/$se.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp $se.cpp
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocketengine.so socketengine.o $se.o
 
-libIRCDsocketengine.so: socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
-       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
-       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocketengine.so socketengine.o
+libIRCDsnomasks.so: snomasks.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/channels.h
+        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c snomasks.cpp
+         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsnomasks.so snomasks.o
 
 libIRCDcommand_parse.so: command_parse.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
@@ -1429,16 +1809,17 @@ libIRCDhash.so: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/
        \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhash.so hashcomp.o
 
 libIRCDhelper.so: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
-       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
+       \$(CC) -pipe -I/usr/local/include -L/usr/local/lib -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
        \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhelper.so helperfuncs.o
 
 libIRCDchannels.so: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
        \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDchannels.so channels.o
 
-libIRCDmode.so: mode.cpp ../include/base.h ../include/mode.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
+libIRCDmode.so: mode.cpp ../include/base.h ../include/mode.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h \$(RELCPPFILES)
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
-       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmode.so mode.o
+       \${MAKE} -C "modes" DIRNAME="src/modes" \$(MAKEARGS) CPPFILES="\$(CPPFILES)"
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmode.so mode.o modes/modeclasses.a
 
 libIRCDxline.so: xline.cpp ../include/base.h ../include/xline.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
@@ -1456,21 +1837,13 @@ libIRCDbase.so: base.cpp ../include/base.h ../include/globals.h ../include/inspi
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
        \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDbase.so base.o
 
-libIRCDio.so: inspircd_io.cpp ../include/base.h ../include/inspircd_io.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
-       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_io.cpp
-       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDio.so inspircd_io.o
+libIRCDconfigreader.so: configreader.cpp ../include/base.h ../include/configreader.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c configreader.cpp
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDconfigreader.so configreader.o
 
-libIRCDmessage.so: message.cpp ../include/base.h ../include/message.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
-       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
-       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmessage.so message.o
-
-libIRCDcommands.so: commands.cpp ../include/base.h ../include/commands.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h $srcobjs
+libIRCDcommands.so: commands.cpp ../include/base.h ../include/commands.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
-       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommands.so commands.o $cmdobjs
-
-libIRCDdnsqueue.so: dnsqueue.cpp ../include/base.h ../include/dnsqueue.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
-       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
-       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdnsqueue.so dnsqueue.o
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommands.so commands.o
 
 libIRCDdynamic.so: dynamic.cpp ../include/base.h ../include/dynamic.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
@@ -1492,6 +1865,10 @@ libIRCDsocket.so: socket.cpp ../include/base.h ../include/inspircd.h ../include/
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
        \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocket.so socket.o
 
+libIRCDinspsocket.so: inspsocket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspsocket.cpp
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDinspsocket.so inspsocket.o
+
 libIRCDaes.so: aes.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c aes.cpp
        \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDaes.so aes.o
@@ -1503,10 +1880,82 @@ libIRCDtimer.so: timer.cpp ../include/base.h ../include/inspircd.h ../include/gl
 EOM
        foreach my $cmd (@cmdlist) {
                print FH <<ITEM;
-cmd_$cmd.o: cmd_$cmd.cpp ../include/base.h ../include/modules.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/cmd_$cmd.h
+cmd_$cmd.so: cmd_$cmd.cpp ../include/base.h ../include/modules.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/commands/cmd_$cmd.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o cmd_$cmd.so cmd_$cmd.o
 
 ITEM
        }
        close(FH);
 }
+
+sub showhelp
+{
+       chomp($PWD = `pwd`);
+       print "Usage: configure [options]
+Options: [defaults in brackets after descriptions]
+
+When no options are specified, interactive
+configuration is started and you must specify
+any required values manually. If one or more
+options are specified, non-interactive configuration
+is started, and any omitted values are defaulted.
+
+Arguments with a single \"-\" symbol, as in
+InspIRCd 1.0.x, are also allowed.
+
+  --disable-interactive        Sets no options intself, but
+                               will disable any interactive prompting.
+  --update                     Update makefiles and dependencies
+  --modupdate                  Detect new modules and write makefiles
+  --svnupdate {rebuild}        Update working copy via subversion
+                               {and optionally rebuild it}
+  --clean                      Remove .config.cache file and go interactive
+  --enable-gnutls              Enable GnuTLS module [no]
+  --enable-openssl             Enable OpenSSL module [no]
+  --with-nick-length=[n]       Specify max. nick length [32]
+  --with-channel-length=[n]    Specify max. channel length [64]
+  --with-max-channels=[n]      Specify max. number of channels
+                               a normal user may join [20]
+  --with-max-oper-channels=[n] Specify max. number of channels
+                               an irc operator may join [60]
+  --with-max-clients=[n]       Specify maximum number of users
+                               which may connect locally
+  --enable-optimization=[n]    Optimize using -O[n] gcc flag
+  --enable-epoll               Enable epoll() where supported [set]
+  --enable-kqueue              Enable kqueue() where supported [set]
+  --disable-epoll              Do not enable epoll(), fall back
+                               to select() [not set]
+  --disable-kqueue             Do not enable kqueue(), fall back
+                               to select() [not set]
+  --enable-ipv6                Build ipv6 native InspIRCd [no]
+  --enable-remote-ipv6         Build with ipv6 support for remote
+                               servers on the network [yes]
+  --disable-remote-ipv6        Do not allow remote ipv6 servers [not set]
+  --with-cc=[filename]         Use an alternative g++ binary to
+                               build InspIRCd [g++]
+  --with-ident-length=[n]      Specify max length of ident [12]
+  --with-quit-length=[n]       Specify max length of quit [200]
+  --with-topic-length=[n]      Specify max length of topic [350]
+  --with-kick-length=[n]       Specify max length of kick [200]
+  --with-gecos-length=[n]      Specify max length of gecos [150]
+  --with-away-length=[n]       Specify max length of away [150]
+  --with-max-modes=[n]         Specify max modes per line which
+                               have parameters [20]
+  --prefix=[directory]         Base directory to install into (if defined,
+                               can automatically define config, module, bin
+                              and library dirs as subdirectories of prefix)
+                               [$PWD]
+  --config-dir=[directory]     Config file directory for config and SSL certs
+                               [$PWD/conf]
+  --module-dir=[directory]     Modules directory for loadable modules
+                               [$PWD/modules]
+  --binary-dir=[directory]     Binaries directory for core binary
+                               [$PWD/bin]
+  --library-dir=[directory]    Library directory for core libraries
+                               [$PWD/lib]
+  --help                       Show this help text and exit
+
+";
+       exit(0);
+}