]> 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 bd5b3abd225c2d7866545e8f702e472adbf9e34b..22855727f43d71dff8b4e256fa1c660d1b34fee4 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,4 +1,5 @@
 #!/usr/bin/perl
+
 # InspIRCd Configuration Script
 #
 # Copyright 2003 The ChatSpike Development Team
@@ -33,17 +34,19 @@ $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 config bininst";                       # build order
+$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
@@ -52,73 +55,95 @@ $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!
 
 if ($config{OSNAME} =~ /CYGWIN/) {
-  $config{OSNAME} = "CYG-STATIC";
+       $config{OSNAME} = "CYG-STATIC";
 }
 
 if ((!$config{OSNAME}) || ($config{OSNAME} eq "")) {
-  chomp($config{OSNAME} = `/usr/bin/uname`);
-  if ((!$config{OSNAME}) || ($config{OSNAME} eq "")){
-       $config{OSNAME} = "Unknown";
-  }
+       chomp($config{OSNAME} = `/usr/bin/uname`);
+       if ((!$config{OSNAME}) || ($config{OSNAME} eq "")){
+               $config{OSNAME} = "Unknown";
+       }
 }
 
 if (!$config{MAX_CLIENT_T}) { 
-  $config{MAX_CLIENT_T} = 1024;                                 # Set a reasonable 'Default'
-  $fd_scan_fail = "true";                                       # Used Later
+       $config{MAX_CLIENT_T} = 1024;                                 # Set a reasonable 'Default'
+       $fd_scan_fail = "true";                                       # Used Later
 }
 
 # Get and Set some important vars..
 getmodules();
 
 my $arg = $ARGV[0];                                            # Do Some Argument Checks..
-if ($arg eq "-clean") { `rm -rf .config.cache`; }               # Remove the config.cache file.
+if ($arg eq "-clean") {
+       system("rm -rf .config.cache");
+}               # Remove the config.cache file.
 
 if ($arg eq "-update") {
-  # 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();
-    print "Complete.\n";
-    exit;
-  }
+       # 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(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";
-    exit;
-  }
+        # 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";
@@ -127,25 +152,33 @@ print "Checking operating system version...\n";
 getosflags();
 
 if (!$config{MAX_CLIENT}) { 
-  # If the cache hasn't set the max clients, copy the variable of MAX_CLIENT_T, this
-  # allows us to keep _T for testing purposes. (ie. "Are you sure you want to go
-  # higher than the found value" :))
-  $config{MAX_CLIENT} = $config{MAX_CLIENT_T};
+       # If the cache hasn't set the max clients, copy the variable of MAX_CLIENT_T, this
+       # allows us to keep _T for testing purposes. (ie. "Are you sure you want to go
+       # higher than the found value" :))
+       $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";
 my $fail = 0;
 open(STRLCPY, "</usr/include/string.h") or $fail = 1;
-if (!$fail)
-{
-       while (chomp($line = <STRLCPY>))
-       {
+if (!$fail) {
+       while (chomp($line = <STRLCPY>)) {
                # try and find the delcaration of:
                # size_t strlcpy(...)
-               if ($line =~ /size_t(\0x9|\s)+strlcpy/)
-               {
+               if ($line =~ /size_t(\0x9|\s)+strlcpy/) {
                        $config{HAS_STRLCPY} = "true";
                }
        }
@@ -154,18 +187,37 @@ 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;
 open(KQUEUE, "</usr/include/sys/event.h") or $fail = 1;
-if (!$fail)
-{
-        while (chomp($line = <KQUEUE>))
-        {
+if (!$fail) {
+        while (chomp($line = <KQUEUE>)) {
                 # try and find the delcaration of:
                # int kqueue(void);
-               if ($line =~ /int(\0x9|\s)+kqueue/)
-               {
+               if ($line =~ /int(\0x9|\s)+kqueue/) {
                        $has_kqueue = 1;
                }
        }
@@ -178,17 +230,8 @@ printf "Checking if epoll exists... ";
 $has_epoll = 0;
 $fail = 0;
 open(EPOLL, "</usr/include/sys/epoll.h") or $fail = 1;
-if (!$fail)
-{
-       while (chomp($line = <EPOLL>))
-       {
-               # try and find the declaration of:
-               # extern int epoll_create (int __size) __THROW;
-               if (($line =~ /int(\0x9|\s)+epoll_create(\0x9|\s)+\(/) || ($line =~ /int(\0x9|\s)+epoll_create\(/))
-               {
-                       $has_epoll = 1;
-               }
-       }
+if (!$fail) {
+       $has_epoll = 1;
        close(EPOLL);
 }
 if ($has_epoll) {
@@ -236,6 +279,7 @@ system("clear");
 show_splash();
 chomp($wholeos = `uname -mnr`);
 
+my $rev = getrevision();
 # Display Introduction Message..
 print "
 Welcome to the InspIRCd Configuration program!
@@ -250,33 +294,39 @@ 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";
 
-if ($config{GCCVER} < 3)
-{
+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";
-}
-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";
-    }
-    else
-    {
-           print "\033[1;32mWARNING!\033[0m Could not execute the compiler you specified. You may want to try again.\n";
-    }
+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 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";
+               }
+       }
 }
 
 print "\n";
@@ -305,8 +355,7 @@ if ($has_epoll) {
        print "\n";
 }
 $chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y"));
-if (!$chose_hiperf)
-{
+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";
 }
@@ -314,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";
@@ -344,206 +396,230 @@ 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
+       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;
-      }
-    }
-  } 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";
+                       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;
+       }
+       # 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;
-    $continue = 1;
-    print "\n";
-  } else {
-    print "You must enter a number in this field. Please try again.\n\n";
-  }
+       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 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";
-  }
+       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 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";
-  }
+       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 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";
- }
+       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 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";
-  }
+       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 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";
-  }
+       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 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";
-  }
+       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 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";
-  }
+       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 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";
-  }
+       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 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";
-  }
+       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 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";
-  }
+       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
@@ -560,50 +636,59 @@ 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};
+       $var = $config{OPTIMITEMP};
 }
 
 if ($var eq "1") {
-  $config{OPTIMITEMP} = 1;
-  $config{OPTIMISATI} = "-O";
+       $config{OPTIMITEMP} = 1;
+       $config{OPTIMISATI} = "-O";
 } elsif ($var eq "2") {
-  $config{OPTIMITEMP} = 2;
-  $config{OPTIMISATI} = "-O2";
+       $config{OPTIMITEMP} = 2;
+       $config{OPTIMISATI} = "-O2";
 } elsif ($var eq "3") {
-  $config{OPTIMITEMP} = 3;
-  $config{OPTIMISATI} = "-O3";
+       $config{OPTIMITEMP} = 3;
+       $config{OPTIMISATI} = "-O3";
 } else {
-  $config{OPTIMITEMP} = 0;
-  $config{OPTIMISATI} = "-g";
+       $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[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") {
-       system("ln -s src/modules/extra/m_ssl_gnutls.cpp src/modules/m_ssl_gnutls.cpp");
+       $failed = 0;
+       open(TMP, "<src/modules/m_ssl_gnutls.cpp") or $failed = 1;
+       close(TMP);
+       if ($failed) {
+               print "Symlinking src/modules/m_ssl_gnutls.cpp from extra/\n";
+               chdir("src/modules");
+               system("ln -s extra/m_ssl_gnutls.cpp");
+               chdir("../..");
+       }
        getmodules();
        $failed = 0;
        open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
@@ -629,7 +714,15 @@ if ($config{USE_GNUTLS} eq "y") {
                print "SSL Certificates found, skipping.\n\n"
        }       
 } elsif ($config{USE_OPENSSL} eq "y") {
-       system("ln -s src/modules/extra/m_ssl_openssl.cpp src/modules/m_ssl_openssl.cpp");
+       $failed = 0;
+       open(TMP, "<src/modules/m_ssl_openssl.cpp") or $failed = 1;
+       close(TMP);
+       if ($failed) {
+               print "Symlinking src/modules/m_ssl_openssl.cpp from extra/\n";
+               chdir("src/modules");
+               system("ln -s extra/m_ssl_openssl.cpp");
+               chdir("../..");
+       }
        getmodules();
        $failed = 0;
        open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
@@ -659,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";
@@ -688,33 +781,30 @@ FOO2
 #                              HELPER FUNCTIONS                                #
 ################################################################################
 sub getcache {
-  # Retrieves the .config.cache file, and loads values into the main config hash.
-  open(CACHE, ".config.cache") or return undef;
-  while (<CACHE>) {
-    chomp;
-
-    # Ignore Blank lines, and comments..
-    next if /^\s*$/;
-    next if /^\s*#/;
-
-    my ($key, $value) = split("=", $_);
-    $value =~ /^\"(.*)\"$/;
-    # Do something with data here!
-    $config{$key} = $1;
-  }
-  close(CONFIG);
-  return "true";
+       # Retrieves the .config.cache file, and loads values into the main config hash.
+       open(CACHE, ".config.cache") or return undef;
+       while (<CACHE>) {
+               chomp;
+               # Ignore Blank lines, and comments..
+               next if /^\s*$/;
+               next if /^\s*#/;
+               my ($key, $value) = split("=", $_);
+               $value =~ /^\"(.*)\"$/;
+               # Do something with data here!
+               $config{$key} = $1;
+       }
+       close(CONFIG);
+       return "true";
 }
 
 sub makecache {
-  # Dump the contents of %config
-  print "Writing \033[1;32mcache file\033[0m for future ./configures ...\n";
-  open(FILEHANDLE, ">.config.cache");
-  foreach $key (keys %config)
-  {
-    print FILEHANDLE "$key=\"$config{$key}\"\n";
-  }
-  close(FILEHANDLE);
+       # Dump the contents of %config
+       print "Writing \033[1;32mcache file\033[0m for future ./configures ...\n";
+       open(FILEHANDLE, ">.config.cache");
+       foreach $key (keys %config) {
+               print FILEHANDLE "$key=\"$config{$key}\"\n";
+       }
+       close(FILEHANDLE);
 }
 
 sub dir_check {
@@ -768,47 +858,46 @@ sub dir_check {
 }
 
 sub getosflags {
-  if ($config{OSNAME} =~ /BSD$/) {
-    $config{LDLIBS} = "-Ldl -lstdc++";
-    $config{FLAGS}  = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
-    $config{MAKEPROG} = "gmake";
-    if ($config{OSNAME} eq "OpenBSD") {
-       chomp($foo = `eg++ -dumpversion | cut -c 1`);
-       # theyre running the package version of gcc (eg++)... detect it and set up its version numbers.
-       # if theyre not running this, configure lets the build continue but they probably wont manage to
-       # 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
-       }
-    }
-  } else {
-    $config{LDLIBS} = "-ldl -lstdc++";
-    $config{FLAGS}  = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
-    $config{MAKEPROG} = "make";
-    if ($config{OSNAME} =~ /CYGWIN/) {
-       $config{FLAGS}  = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
-       $config{LDLIBS} = "";
-       $config{MAKEPROG} = "/usr/bin/make";
-       $config{MAKEORDER} = "ircd mods config bininst";
-    } elsif ($config{OSNAME} eq "CYG-STATIC") {
-       $config{FLAGS} = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
-       $config{LDLIBS} = "";
-       $config{MAKEPROG} = "/usr/bin/make";
-       $config{MAKEORDER} = "mods ircd config bininst";
-       $config{STATICLIBS} = "modules/mods.a";
-       $config{STATIC_LINK} = "yes";
-    }
-  }
-  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";
-  }
+       if ($config{OSNAME} =~ /BSD$/) {
+               $config{LDLIBS} = "-Ldl -lstdc++";
+               $config{FLAGS}  = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
+               $config{MAKEPROG} = "gmake";
+               if ($config{OSNAME} eq "OpenBSD") {
+                       chomp($foo = `eg++ -dumpversion | cut -c 1`);
+                       # theyre running the package version of gcc (eg++)... detect it and set up its version numbers.
+                       # if theyre not running this, configure lets the build continue but they probably wont manage to
+                       # 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 the compiler path
+                       }
+               }
+       } else {
+               $config{LDLIBS} = "-ldl -lstdc++";
+               $config{FLAGS}  = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
+               $config{MAKEPROG} = "make";
+               if ($config{OSNAME} =~ /CYGWIN/) {
+                       $config{FLAGS}  = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
+                       $config{LDLIBS} = "";
+                       $config{MAKEPROG} = "/usr/bin/make";
+                       $config{MAKEORDER} = "ircd mods";
+               } elsif ($config{OSNAME} eq "CYG-STATIC") {
+                       $config{FLAGS} = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
+                       $config{LDLIBS} = "";
+                       $config{MAKEPROG} = "/usr/bin/make";
+                       $config{MAKEORDER} = "mods ircd";
+                       $config{STATICLIBS} = "modules/mods.a";
+                       $config{STATIC_LINK} = "yes";
+               }
+       }
+       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";
+       }
 }
 
 sub is_dir {
@@ -825,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$/)
@@ -832,22 +922,47 @@ sub getmodules {
                        $mod = $1;
                        if ($mod !~ /_static$/) {
                                $modlist[$i++] = $mod;
+                               print ".";
                        }
                }
        }
        closedir(DIRHANDLE);
+       print "\nOk, $i modules.\n";
 }
 
-sub writefiles {
+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;
+}
 
-       print "Writing \033[1;32minspircd_config.h\033[0m\n";
+sub writefiles {
+       my($writeheader) = @_;
        # First File.. inspircd_config.h
        chomp(my $incos = `uname -n -s -r`);
        chomp(my $version = `sh ./src/version.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__
@@ -855,6 +970,7 @@ sub writefiles {
 #define CONFIG_FILE "$config{CONFIG_DIR}/inspircd.conf"
 #define MOD_PATH "$config{MODULE_DIR}"
 #define VERSION "$version"
+#define REVISION "$revision2"
 #define MAXCLIENTS $config{MAX_CLIENT}
 #define MAX_DESCRIPTORS $config{MAX_DESCRIPTORS}
 #define NICKMAX $NL
@@ -872,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 = "";
@@ -1121,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
@@ -1131,10 +1262,9 @@ 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;
-                               $a =~ s/Srv/$i\Srv/g;
                                print MUNGED "$a\n";
                        }
                        close(MODULE);
@@ -1182,6 +1312,7 @@ EOF
        my $modules = "";
        my $cmflags = "";
        my $liflags = "";
+       my $crud = "";
 
        foreach $i (@modlist) {
        ###
@@ -1190,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
-       \@-rm -f \$(MODPATH)/m_$i.so
-       install -v -m 0700 m_$i.so \$(MODPATH)
 
 EOCHEESE
+       $crud = $crud . "       \@install -v -m 0700 m_$i.so \$(MODPATH)\n";
        ###
        # End Write Entry to the MakeFile
        ###
        }
+       print FILEHANDLE "modinst:\n    \@echo \"Installing modules...\"\n" . $crud;
 }
 
 
@@ -1232,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
@@ -1245,20 +1387,20 @@ EOM
 
        if ($config{OSNAME} =~ /CYGWIN/) {
                print FH <<EOM;
-all: 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
+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: 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 \$(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
        }
 
@@ -1267,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
@@ -1300,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
@@ -1326,14 +1472,20 @@ 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
 
+timer.o: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp
+
 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
        }
@@ -1359,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
@@ -1371,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 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
 
-all: 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 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
 
-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
+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
@@ -1398,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
@@ -1425,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
@@ -1461,14 +1634,22 @@ 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
 
+libIRCDtimer.so: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDtimer.so timer.o
+
 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