]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - configure
* Seperate out socket engines into derived classes of SocketEngine.
[user/henk/code/inspircd.git] / configure
index e7c05a210d99815ce37675d368e7192fb4307ff1..22855727f43d71dff8b4e256fa1c660d1b34fee4 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,4 +1,5 @@
 #!/usr/bin/perl
+
 # InspIRCd Configuration Script
 #
 # Copyright 2003 The ChatSpike Development Team
@@ -33,14 +34,16 @@ $config{MAX_CHANNE}         = "20";                                         # Default Max.
 $config{MAX_OPERCH}         = "60";                                            # Default Max. Channels per oper
 $config{MAXI_MODES}         = "20";                                            # Default Max. Number of Modes set at once.
 $config{HAS_STRLCPY}        = "false";                                         # strlcpy Check.
+$config{HAS_STDINT}         = "false";                                         # stdint.h check
+$config{HAS_EXECINFO}       = "0";                                             # execinfo.h Check.
 $config{USE_KQUEUE}         = "y";                                             # kqueue enabled
 $config{USE_EPOLL}          = "y";                                             # epoll enabled
 $config{THREADED_DNS}       = "n";                                             # threaded dns (experimental)
+$config{IPV6}               = "n";                                             # IPv6 support (experimental)
 $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{GCCVER}       = `g++ -dumpversion | cut -c 1`);                  # Major GCC Version
 chomp($config{OSNAME}       = `/bin/uname`);                                   # Operating System Name
 $config{CC}                = "g++";                                            # C++ compiler
 $config{MAKEORDER}         = "ircd mods";                                      # build order
@@ -52,9 +55,16 @@ $config{MAX_KICK}           = "255";                                         # max kick message size
 $config{MAX_GECOS}          = "128";                                           # max GECOS size
 $config{MAX_AWAY}           = "200";                                           # max AWAY size
 
+$no_svn = 0;
+
 $config{HAS_OPENSSL} =~ /OpenSSL (\S+) \d+ \S+ \d{4}/;
 $config{HAS_OPENSSL} = $1;
 
+if ($config{GCCVER} eq "") {
+       print "g++ was not found! You require g++ (the GNU C++ compiler, part of GCC) to build InspIRCd!\n";
+       return 0;
+}
+
 # Minihack! Convert Cygwin to 'Cyg-Static' so i can
 # Keep my dynamic module experiments here for later
 # concideration!
@@ -95,32 +105,45 @@ 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";
+        # 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;
+        }
+}
+
+
+
+if ($arg eq "-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";
@@ -135,6 +158,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 +187,28 @@ if (!$fail) {
 print "yes\n" if $config{HAS_STRLCPY} eq "true";
 print "no\n" if $config{HAS_STRLCPY} eq "false";
 
+printf "Checking if execinfo.h exists... ";
+$config{HAS_EXECINFO} = "0";
+my $fail = 0;
+open(EXECINFO, "</usr/include/execinfo.h") or $fail = 1;
+if ($fail) {
+       $fail = 0;
+       open(EXECINFO, "</usr/local/include/execinfo.h") or $fail = 1;
+       if (!$fail) {
+               printf "/usr/local/include/execinfo.h\n";
+               $config{HAS_EXECINFO} = "1";
+               close(EXECINFO);
+       }
+       else {
+               printf "Not found!\n";
+       }
+}
+else {
+       printf "/usr/include/execinfo.h\n";
+       $config{HAS_EXECINFO} = "1";
+       close(EXECINFO);
+}
+
 printf "Checking if kqueue exists... ";
 $has_kqueue = 0;
 $fail = 0;
@@ -223,6 +279,7 @@ system("clear");
 show_splash();
 chomp($wholeos = `uname -mnr`);
 
+my $rev = getrevision();
 # Display Introduction Message..
 print "
 Welcome to the InspIRCd Configuration program!
@@ -237,10 +294,15 @@ 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), fdmax: $config{MAX_CLIENT_T}
+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";
+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
@@ -255,9 +317,8 @@ should NOT be used. You should probably specify a newer compiler.\n\n";
                }
                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";
+                       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";
                        }
@@ -302,6 +363,9 @@ if (!$chose_hiperf) {
 yesno(THREADED_DNS,"Would you like to enable the experimental multi-threaded DNS lookup?");
 print "\n";
 
+yesno(IPV6,"Would you like to enable 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";
@@ -590,27 +654,28 @@ if ($var eq "1") {
 }
 
 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[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";
 
@@ -687,7 +752,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";
@@ -804,8 +869,7 @@ 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
                        }
                }
        } else {
@@ -850,6 +914,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 +922,47 @@ 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__
@@ -900,55 +988,70 @@ sub writefiles {
 #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 "CYG-STATIC") {
+                       print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE    1024\n#endif\n";
+               }
+               if ($config{HAS_EXECINFO} eq "1") {
+                       print FILEHANDLE "#define HAS_EXECINFO\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{THREADED_DNS} =~ /y/i) {
+                       print FILEHANDLE "#define THREADED_DNS\n";
+               }
+               if ($config{IPV6} =~/y/i) {
+                       print FILEHANDLE "#define IPV6\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";
-       }
-       print FILEHANDLE "\n#endif\n";
-       close(FILEHANDLE);
+
+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);
+
 
        # Create a Modules List..
        my $modules = "";
@@ -1149,8 +1252,8 @@ HEADER
                        # 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
+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
 
 EOCHEESE
@@ -1159,7 +1262,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";
@@ -1218,17 +1321,17 @@ EOF
        $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
        $liflags = getlinkerflags("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
        \$(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 -v -m 0700 m_$i.so \$(MODPATH)\n";
        ###
        # End Write Entry to the MakeFile
        ###
        }
-       print FILEHANDLE "modinst:\n    echo \"*** Installing InspIRCd\"\n" . $crud;
+       print FILEHANDLE "modinst:\n    \@echo \"Installing modules...\"\n" . $crud;
 }
 
 
@@ -1260,8 +1363,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 +1387,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 message.o $cmdobjs commands.o dnsqueue.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 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 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 message.o $cmdobjs commands.o dnsqueue.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 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 snomasks.o modes/modeclasses.a \$(MODULES)
 EOM
        }
 
@@ -1295,25 +1409,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)
+       \${MAKE} -C "modes" DIRNAME="src/modes" \$(MAKEARGS) CPPFILES="\$(CPPFILES)"
        \$(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,8 +1446,8 @@ 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
+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
 
 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
@@ -1354,6 +1472,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 +1485,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
        }
@@ -1390,6 +1511,20 @@ sub write_dynamic_makefile {
                $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
        }
 
+if (($config{OSNAME} !~ /Linux/i) && ($config{HAS_EXECINFO} eq "1")) {
+       $extra = "-L/usr/local/lib -lexecinfo";
+} else {
+       $extra = "";
+}
+
+$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 +1537,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 libIRCDio.so libIRCDmessage.so $cmdobjs libIRCDcommands.so libIRCDdnsqueue.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.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 libIRCDconfigreader.so libIRCDinspsocket.so libIRCDmessage.so $cmdobjs libIRCDcommands.so libIRCDdnsqueue.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so libIRCDsnomasks.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
-       \$(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
+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 libIRCDmessage.so $cmdobjs libIRCDsnomasks.so libIRCDcommands.so libIRCDdnsqueue.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 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 libIRCDsnomasks.so
 
-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
+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
+
+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 +1570,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,9 +1598,9 @@ 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
@@ -1492,6 +1634,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,7 +1649,7 @@ 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.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