]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - configure
Removed some debug notices that were mistakenly in the DEFAULT loglevel
[user/henk/code/inspircd.git] / configure
index 597e581b67ee1b7b6b7b92a44d931293cf5dc8c2..ef24c0dde270b5118337c861b73fe58ac6b31f54 100755 (executable)
--- a/configure
+++ b/configure
@@ -16,27 +16,52 @@ $this = resolve_directory($topdir);                                         # PWD, Regardless.
 @modlist = ();                                                                 # Declare for Module List..
 %config = ();                                                                  # Initiate Configuration Hash..
 $config{ME}                 = resolve_directory($topdir);                      # Present Working Directory
+$config{BASE_DIR}           = $config{ME};                                      # Use CWD as 'Base' Directory.
 $config{CONFIG_DIR}         = resolve_directory($config{ME}."/conf");          # Configuration Directory
 $config{MODULE_DIR}         = resolve_directory($config{ME}."/modules");       # Modules Directory
 $config{BINARY_DIR}         = resolve_directory($config{ME}."/bin");           # Binary Directory
 $config{LIBRARY_DIR}        = resolve_directory($config{ME}."/lib");           # Library Directory
+chomp($config{HAS_GNUTLS}   = `libgnutls-config --version 2>/dev/null | cut -c 1,2,3`); # GNUTLS Version.
+chomp($config{HAS_OPENSSL}  = `openssl version 2>/dev/null`);                  # Openssl version
+$config{USE_GNUTLS}         = "n";                                             # Use gnutls.
+$config{USE_OPENSSL}        = "n";                                             # Use openssl.
 $config{OPTIMITEMP}         = "0";                                             # Default Optimisation Value
 $config{OPTIMISATI}         = "-g";                                            # Optimisation Flag
-$config{NICK_LENGT}         = "32";                                            # Default Nick Length
+$config{NICK_LENGT}         = "31";                                            # Default Nick Length
 $config{CHAN_LENGT}         = "64";                                            # Default Channel Name Length
-$config{MAX_CHANNE}         = "20";                                            # Default Max. Channels per user..
+$config{MAX_CHANNE}         = "20";                                            # Default Max. Channels per user
+$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{USE_KQUEUE}         = "y";                                             # kqueue enabled
 $config{USE_EPOLL}          = "y";                                             # epoll enabled
-$config{STATIC_LINK}       = "no";
+$config{THREADED_DNS}       = "n";                                             # threaded dns (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{OSNAME}       = `/bin/uname`);                                   # Operating System Name
 $config{CC}                = "g++";                                            # C++ compiler
-$config{MAKEORDER}         = "ircd mods config bininst";
-$config{STATICLIBS}         = "";
+$config{MAKEORDER}         = "ircd mods config bininst";                       # build order
+$config{STATICLIBS}         = "";                                              # library archive path
+$config{MAX_IDENT}          = "12";                                            # max ident size
+$config{MAX_QUIT}           = "255";                                           # max quit message size
+$config{MAX_TOPIC}          = "307";                                           # max topic size
+$config{MAX_KICK}           = "255";                                           # max kick message size
+$config{MAX_GECOS}          = "128";                                           # max GECOS size
+$config{MAX_AWAY}           = "200";                                           # max AWAY size
+
+$config{HAS_OPENSSL} =~ /OpenSSL (\S+) \d+ \S+ \d{4}/;
+$config{HAS_OPENSSL} = $1;
+
+# 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";
+}
 
 if ((!$config{OSNAME}) || ($config{OSNAME} eq "")) {
   chomp($config{OSNAME} = `/usr/bin/uname`);
@@ -66,12 +91,36 @@ if ($arg eq "-update") {
     # 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;
   }
 }
 
+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;
+  }
+}
+
 print "Checking for cache from previous configure...\n";
 getcache();
 print "Checking operating system version...\n";
@@ -142,13 +191,41 @@ if (!$fail)
        }
        close(EPOLL);
 }
+if ($has_epoll) {
+       my $kernel = `uname -r`;
+       chomp($kernel);
+       if (($kernel =~ /2\.0/) || ($kernel =~ /2\.2/) || ($kernel =~ /2\.4/)) {
+               $has_epoll = 0;
+       }
+}
 print "yes\n" if $has_epoll == 1;
 print "no\n" if $has_epoll == 0;
 
-if ($config{OSNAME} =~ /CYGWIN/) {
+if (($config{OSNAME} =~ /CYGWIN/) || ($config{OSNAME} eq "CYG-STATIC")) {
        $config{HAS_STRLCPY} = "true";
 }
 
+$config{HAS_EPOLL} = $has_epoll;
+$config{HAS_KQUEUE} = $has_kqueue; 
+
+printf "Checking for libgnutls... ";
+if (($config{HAS_GNUTLS}) && (($config{HAS_GNUTLS} >= 1.2) || ($config{HAS_GNUTLS} eq "y"))) {
+       print "yes\n";
+       $config{HAS_GNUTLS} = "y";
+} else {
+       print "no\n";
+       $config{HAS_GNUTLS} = "n";
+}
+
+printf "Checking for openssl... ";
+if (($config{HAS_OPENSSL}) && (($config{HAS_OPENSSL} >= 0.8) || ($config{HAS_OPENSSL} eq "y"))) {
+       print "yes\n";
+       $config{HAS_OPENSSL} = "y";
+} else {
+       print "no\n";
+       $config{HAS_OPENSSL} = "n";
+}
+
 ################################################################################
 #                          BEGIN INTERACTIVE PART                              #
 ################################################################################
@@ -175,7 +252,45 @@ 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";
 
+$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";
+
+if ($config{GCCVER} < 3)
+{
+       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";
+    }
+}
+
+print "\n";
+
 # Directory Settings..
+my $tmpbase = $config{BASE_DIR};
+dir_check("do you wish to install the InspIRCd base", "BASE_DIR");
+if ($tmpbase ne $config{BASE_DIR}) {
+       $config{CONFIG_DIR}         = resolve_directory($config{BASE_DIR}."/conf");           # Configuration Directory
+       $config{MODULE_DIR}         = resolve_directory($config{BASE_DIR}."/modules");        # Modules Directory
+       $config{BINARY_DIR}         = resolve_directory($config{BASE_DIR}."/bin");            # Binary Directory
+       $config{LIBRARY_DIR}        = resolve_directory($config{BASE_DIR}."/lib");            # Library Directory
+}
+
 dir_check("are the configuration files", "CONFIG_DIR");
 dir_check("are the modules to be compiled to", "MODULE_DIR");
 dir_check("is the IRCd binary to be placed", "BINARY_DIR");
@@ -183,9 +298,11 @@ dir_check("are the IRCd libraries to be placed", "LIBRARY_DIR");
 
 if ($has_kqueue) {
        yesno(USE_KQUEUE,"You are running a BSD operating system, and kqueue\nwas detected. Would you like to enable kqueue support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable kqueue?");
+       print "\n";
 }
 if ($has_epoll) {
        yesno(USE_EPOLL,"You are running a Linux 2.6+ operating system, and epoll\nwas detected. Would you like to enable epoll support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable epoll?");
+       print "\n";
 }
 $chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y"));
 if (!$chose_hiperf)
@@ -194,6 +311,36 @@ if (!$chose_hiperf)
        print "not to enable one. Defaulting to select() engine.\n\n";
 }
 
+yesno(THREADED_DNS,"Would you like to enable the experimental multi-threaded DNS lookup?");
+print "\n";
+
+if (($config{HAS_GNUTLS} eq "y") && ($config{HAS_OPENSSL} eq "y")) {
+       print "I have detected both GnuTLS and OpenSSL on your system.\n";
+       print "I will default to GnuTLS. If you wish to use OpenSSL\n";
+       print "instead, you should enable the OpenSSL module yourself\n";
+       print "by copying it from src/modules/extra to src/modules.\n\n";
+}
+
+if ($config{HAS_GNUTLS} eq "y") {
+       yesno(USE_GNUTLS, "Would you like to enable SSL Support?");
+       if ($config{USE_GNUTLS} eq "y") {
+               print "\nUsing GnuTLS SSL module.\n";
+       }
+} elsif ($config{HAS_OPENSSL} eq "y") {
+       yesno(USE_OPENSSL, "Would you like to enable SSL Support?");
+       if ($config{USE_OPENSSL} eq "y") {
+               print "\nUsing OpenSSL SSL module.\nYou will get better performance if you move to GnuTLS in the future.\n";
+       }
+}
+
+print "\nThe following questions will ask you for various figures relating\n";
+print "To your IRCd install. Please note that these should usually be left\n";
+print "as defaults unless you have a real reason to change them. If they\n";
+print "changed, then the values must be identical on all servers on your\n";
+print "network, or malfunctions and/or crashes may occur, with the exception\n";
+print "of the 'maximum number of clients' setting which may be different on\n";
+print "different servers on the network.\n\n";
+
 # File Descriptor Settings..
 my $continue = 0;
 while (!$continue) {
@@ -227,7 +374,7 @@ you wish to do this? It may cause the IRCd to malfunction [y/n]
 
 my $continue = 0;
 while (!$continue) {
-  print "What is the Maximum length of nicknames?\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}; }
@@ -241,9 +388,55 @@ while (!$continue) {
   }
 }
 
-my $continue = 0;
+$continue = 0;
 while (!$continue) {
-  print "What is the Maximum number of mode changes in one line?\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";
+  }
+}
+
+$continue = 0;
+while (!$continue) {
+  print "What is the maximum number of channels an oper may join at any one time?\n";
+  print "[\033[1;32m$config{MAX_OPERCH}\033[0m] -> ";
+  chomp($var = <STDIN>);
+  if ($var eq "") { $var = $config{MAX_OPERCH}; }
+  if ($var =~ /^\d+$/) {
+    # We don't care what the number is, set it and be on our way.
+    $config{MAX_OPERCH} = $var;
+    $continue = 1;
+    print "\n";
+ }
+}
+
+$continue = 0;
+while (!$continue) {
+  print "What is the maximum number of 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}; }
@@ -257,14 +450,113 @@ while (!$continue) {
   }
 }
 
+$continue = 0;
+while (!$continue) {
+  print "What is the maximum length of an ident (username)?\n";
+  print "[\033[1;32m$config{MAX_IDENT}\033[0m] -> ";
+  chomp($var = <STDIN>);
+  if ($var eq "") { $var = $config{MAX_IDENT}; }
+  if ($var =~ /^\d+$/) {
+    # We don't care what the number is, set it and be on our way.
+    $config{MAX_IDENT} = $var;
+    $continue = 1;
+    print "\n";
+  } else {
+    print "You must enter a number in this field. Please try again.\n\n";
+  }
+}
+
+$continue = 0;
+while (!$continue) {
+  print "What is the maximum length of a 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";
+  }
+}
+
+$continue = 0;
+while (!$continue) {
+  print "What is the maximum length of a kick message?\n";
+  print "[\033[1;32m$config{MAX_KICK}\033[0m] -> ";
+  chomp($var = <STDIN>);
+  if ($var eq "") { $var = $config{MAX_KICK}; }
+  if ($var =~ /^\d+$/) {
+    # We don't care what the number is, set it and be on our way.
+    $config{MAX_KICK} = $var;
+    $continue = 1;
+    print "\n";
+  } else {
+    print "You must enter a number in this field. Please try again.\n\n";
+  }
+}
+
+$continue = 0;
+while (!$continue) {
+  print "What is the maximum length of a 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";
+  }
+}
+
 # Code Optimisation
-print "Enter the Level Of Binary optimisation. This is a number between 0 and 3 (inclusive)
-The InspIRCd Team will _NOT_ support any bug reports above 0.
-Also note, the IRCd behaviour will be different depending on this value.
-Please read the documentation for more information.
+print "Enter the Level Of Binary optimisation. This is a number between 0 and 3.
+The InspIRCd Team will NOT support any bug reports above 0. Also note,
+the IRCd behaviour will be different depending on this value. Please
+read the documentation for more information.
+
+The higher the number, the more optimised your binary will be. This
+value will default to 0 if you either don't enter a number, or enter
+a value outside the range.
 
-The Higher the number, the more optimised your binary will be. This value will default to 0
-If you either a) Dont enter a number, or b) Enter a value outside the range.\n";
+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 "") {
@@ -286,29 +578,110 @@ 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 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[0mOptimatizaton Flag:\033[1;32m\t\t$config{OPTIMISATI}\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\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[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("cp src/modules/extra/m_ssl_gnutls.cpp src/modules/m_ssl_gnutls.cpp");
+       getmodules();
+       $failed = 0;
+       open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
+       close(TMP);
+       open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
+       close(TMP);
+       if ($failed) {
+               print "SSL Certificates Not found, Generating.. \n\n
+*************************************************************
+* Generating the Private Key may take some time, go grab a  *
+* Coffee. Even better, to generate some more entropy if it  *
+* is taking a while, open another console and type du / a   *
+* few times and get that HD going :) Then answer the        *
+* Questions which follow. If you are unsure, just hit enter *
+*************************************************************\n\n";
+               system("certtool --generate-privkey --outfile key.pem");
+               system("certtool --generate-self-signed --load-privkey key.pem --outfile cert.pem");
+               print "\nCertificate generation complete, copying to config directory... ";
+               system("mv key.pem $config{CONFIG_DIR}/key.pem");
+               system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
+               print "Done.\n\n";
+       } else {
+               print "SSL Certificates found, skipping.\n\n"
+       }       
+} elsif ($config{USE_OPENSSL} eq "y") {
+       system("cp src/modules/extra/m_ssl_openssl.cpp src/modules/m_ssl_openssl.cpp");
+       getmodules();
+       $failed = 0;
+       open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
+       close(TMP);
+       open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
+       close(TMP);
+       if ($failed) {
+               print "SSL Certificates Not found, Generating.. \n\n
+*************************************************************
+* Generating the certificates may take some time, go grab a *
+* coffee, or something.                                     *
+*************************************************************\n\n";
+               system("openssl req -x509 -nodes -newkey rsa:1024 -keyout key.pem -out cert.pem");
+               system("openssl dhparam -out dhparams.pem 1024");
+               print "\nCertificate generation complete, copying to config directory... ";
+               system("mv key.pem $config{CONFIG_DIR}/key.pem");
+               system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
+               system("mv dhparams.pem $config{CONFIG_DIR}/dhparams.pem");
+               print "Done.\n\n";
+       } else {
+               print "SSL Certificates found, skipping.\n\n"
+       }
+}
+if (($config{USE_GNUTLS} eq "n") && ($config{USE_OPENSSL} eq "n")) {
+       print "Skipping SSL Certificate generation, SSL support is not available.\n\n";
+}
 
+getosflags();
 makecache();
 writefiles();
 
 print "\n\n";
 print "To build your server with these settings, please type '\033[1;32m$config{MAKEPROG}\033[0m' now.\n";
+if (($config{USE_GNUTLS} eq "y") || ($config{USE_OPENSSL} eq "y")) {
+       print "Please remember that to enable \033[1;32mSSL support\033[0m you must\n";
+       print "load the required modules in your config. This configure process\n";
+       print "has just prepared these modules to be compiled for you, and has not\n";
+       print "configured them to be compiled into the core of the ircd.\n";
+}
 print "*** \033[1;32mRemember to edit your configuration files!!!\033[0m ***\n\n\n";
 if (($config{OSNAME} eq "OpenBSD") && ($config{CC} ne "eg++")) {
        print "\033[1;32mWARNING!\033[0m You are running OpenBSD but you are using the base gcc package\nrather than eg++. This compile will most likely fail, but i'm letting you\ngo ahead with it anyway, just in case i'm wrong :-)\n";
 }
-if ($config{OSNAME} =~ /CYGWIN/) {
-       print "\033[1;32mWARNING!\033[0m CYGWIN does not properly support shared modules,\nso modules are unavailable on this platform.\nThe modules will build as .o files but will not be available for use.\nYou will be able to run the core ircd file (inspircd.exe) as normal.\n";
+
+if ($config{GCCVER} < "3") {
+       print <<FOO2;
+\033[1;32mWARNING!\033[0m You are attempting to compile InspIRCd on GCC 2.x!
+GCC 2.x series compilers only had partial (read as broken) C++ support, and
+your compile will most likely fail horribly! If you have any problems, do NOT
+report them to the bugtracker or forums without first upgrading your compiler
+to a newer 3.x or 4.x (or whatever is available currently) version.
+FOO2
 }
 
 ################################################################################
@@ -394,8 +767,8 @@ sub dir_check {
 
 sub getosflags {
   if ($config{OSNAME} =~ /BSD$/) {
-    $config{LDLIBS} = "-Ldl";
-    $config{FLAGS}  = "-fPIC -frtti $OPTIMISATI -Woverloaded-virtual $config{OPTIMISATI}";
+    $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`);
@@ -409,11 +782,16 @@ sub getosflags {
        }
     }
   } else {
-    $config{LDLIBS} = "-ldl";
-    $config{FLAGS}  = "-fPIC -frtti $OPTIMISATI -Woverloaded-virtual $config{OPTIMISATI}";
+    $config{LDLIBS} = "-ldl -lstdc++";
+    $config{FLAGS}  = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
     $config{MAKEPROG} = "make";
     if ($config{OSNAME} =~ /CYGWIN/) {
-       $config{FLAGS}  = "-frtti $OPTIMISATI -Woverloaded-virtual $config{OPTIMISATI}";
+       $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";
@@ -465,18 +843,29 @@ sub writefiles {
   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;
 /* Auto generated by configure, do not modify! */
-#define SYSLOG_FACILITY LOG_DAEMON
-#define SYSLOG_LEVEL LOG_NOTICE
+#ifndef __CONFIGURATION_AUTO__
+#define __CONFIGURATION_AUTO__
+
 #define CONFIG_FILE "$config{CONFIG_DIR}/inspircd.conf"
 #define MOD_PATH "$config{MODULE_DIR}"
 #define VERSION "$version"
 #define MAXCLIENTS $config{MAX_CLIENT}
-#define NICKMAX $config{NICK_LENGT}
-#define CHANMAX $config{CHAN_LENGT}
+#define MAX_DESCRIPTORS $config{MAX_DESCRIPTORS}
+#define NICKMAX $NL
+#define CHANMAX $CL
 #define MAXCHANS $config{MAX_CHANNE}
+#define OPERMAXCHANS $config{MAX_OPERCH}
 #define MAXMODES $config{MAXI_MODES}
+#define IDENTMAX $config{MAX_IDENT}
+#define MAXQUIT $config{MAX_QUIT}
+#define MAXTOPIC $config{MAX_TOPIC}
+#define MAXKICK $config{MAX_KICK}
+#define MAXGECOS $config{MAX_GECOS}
+#define MAXAWAY $config{MAX_AWAY}
 #define OPTIMISATION $config{OPTIMITEMP}
 #define SYSTEM "$incos"
 #define MAXBUF 514
@@ -485,6 +874,14 @@ 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";
   }
@@ -504,6 +901,9 @@ EOF
   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";
@@ -518,13 +918,14 @@ EOF
   if (!$use_hiperf) {
     print FILEHANDLE "#define USE_SELECT\n";
   }
+  print FILEHANDLE "\n#endif\n";
   close(FILEHANDLE);
 
   # Create a Modules List..
   my $modules = "";
   foreach $i (@modlist)
   {
-    if ($config{OSNAME} =~ /CYGWIN/) {
+    if ($config{STATIC_LINK} eq "yes") {
         $modules .= "m_".$i.".o ";
     }
     else {
@@ -544,6 +945,9 @@ EOF
   }
 
   opendir(DIRHANDLE, $this);
+  if ($config{THREADED_DNS} =~ /y/i) {
+    $config{LDLIBS} = $config{LDLIBS} . " -pthread";
+  }
   foreach $name (sort readdir(DIRHANDLE)) {
     if ($name =~ /^\.(.+)\.inc$/)
     {
@@ -560,6 +964,7 @@ EOF
       $tmp =~ s/\@MAKEPROG\@/$config{MAKEPROG}/;
       $tmp =~ s/\@FLAGS\@/$config{FLAGS}/;
       $tmp =~ s/\@LDLIBS\@/$config{LDLIBS}/;
+      $tmp =~ s/\@BASE_DIR\@/$config{BASE_DIR}/;
       $tmp =~ s/\@CONFIG_DIR\@/$config{CONFIG_DIR}/;
       $tmp =~ s/\@MODULE_DIR\@/$config{MODULE_DIR}/;
       $tmp =~ s/\@BINARY_DIR\@/$config{BINARY_DIR}/;
@@ -579,92 +984,18 @@ EOF
   # Make inspircd executable!
   chmod 0744, 'inspircd';
 
-  if ($config{OSNAME} =~ /CYGWIN/) {
+  if ($config{STATIC_LINK} eq "yes") {
        print "Writing static-build \033[1;32msrc/Makefile\033[0m\n";
        write_static_makefile();
-  }
-  else {
+       write_static_modules_makefile();
+  } elsif ($config{OSNAME} =~ /CYGWIN/) {
+       print "Writing cygwin-build \033[1;32msrc/Makefile\033[0m\n";
+       write_static_makefile();
+       write_dynamic_modules_makefile();
+  } else {
        print "Writing dynamic-build \033[1;32msrc/Makefile\033[0m\n";
        write_dynamic_makefile();
-  }
-
-
-  # Modules Makefile..
-  print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
-  open(FILEHANDLE, ">src/modules/Makefile");
-  print FILEHANDLE <<EOF;
-# (C) ChatSpike development team
-# Makefile by <Craig\@ChatSpike.net>
-# Many Thanks to Andrew Church <achurch\@achurch.org>
-#    for assisting with making this work right.
-#
-# Automatically Generated by ./configure to add a modules
-# please run ./configure --update
-
-all: \$(MODULES)
-
-EOF
-
-  # Create a Modules List..
-  my $modules = "";
-  my $flags = "";
-  if ($config{OSNAME} =~ /CYGWIN/) {
-     open(MODLIST,">include/modlist.h");
-     print MODLIST <<HEADER;
-// Generated automatically by configure. DO NOT EDIT!
-
-#ifndef __SYMBOLS__H_CONFIGURED__
-#define __SYMBOLS__H_CONFIGURED__
-
-HEADER
-     foreach $i (@modlist) {
-       if ($i !~ /_static$/) {
-               print MODLIST "extern \"C\" void * $i\_init (void);\n";
-       }
-     }
-     print MODLIST "\nstruct {const char *name; initfunc *value; } modsyms[] = {\n";
-  }
-  foreach $i (@modlist)
-  {
-    if ($i !~ /_static$/) {
-     $flags = getcompilerflags("src/modules/m_".$i.".cpp");
-     if ($config{OSNAME} =~ /CYGWIN/) {
-        print FILEHANDLE <<EOCHEESE;
-m_$i.o: m_$i\_static.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/servers.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
-        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");
-        while (chomp($a = <MODULE>)) { 
-               $a =~ s/init_module/$i\_init/g;
-               $a =~ s/Srv/$i\Srv/g;
-               print MUNGED "$a\n";
-        }
-        close(MODULE);
-        close(MUNGED);
-        print MODLIST <<EOENT;
-{"m_$i.so",\&$i\_init},
-EOENT
-        print "done\n";
-     }
-     else {
-         print FILEHANDLE <<EOCHEESE;
-m_$i.so: m_$i.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/servers.h ../../include/base.h
-       \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c m_$i.cpp
-       \$(CC) \$(FLAGS) -shared $flags -o m_$i.so m_$i.o
-       cp m_$i.so \$(MODPATH)/
-       chmod 0700 \$(MODPATH)/m_$i.so
-
-EOCHEESE
-      }
-   }
-  }
-  if ($config{OSNAME} =~ /CYGWIN/) {
-     print MODLIST "{0}};\n\n#endif\n";
-     close(MODLIST);
+       write_dynamic_modules_makefile();
   }
 }
 
@@ -681,6 +1012,19 @@ sub getcompilerflags {
   return undef;
 }
 
+sub getlinkerflags {
+  my ($file) = @_;
+  open(FLAGS, $file);
+  while (<FLAGS>) {
+    if ($_ =~ /^\/\* \$LinkerFlags: (.+) \*\/$/) {
+      close(FLAGS);
+      return $1;
+    }
+  }
+  close(FLAGS);
+  return undef;
+}
+
 sub show_splash {
   print "'\033[1;33m####\033[0m:'\033[1;33m##\033[0m::: \033[1;33m##\033[0m::'\033[1;33m######\033[0m::'\033[1;33m########\033[0m::'\033[1;33m####\033[0m:'\033[1;33m########\033[0m:::'\033[1;33m######\033[0m::'\033[1;33m########\033[0m::\n";
   print ". \033[1;33m##\033[0m:: \033[1;33m###\033[0m:: \033[1;33m##\033[0m:'\033[1;33m##\033[0m... \033[1;33m##\033[0m: \033[1;33m##\033[0m.... \033[1;33m##\033[0m:. \033[1;33m##\033[0m:: \033[1;33m##\033[0m.... \033[1;33m##\033[0m:'\033[1;33m##\033[0m... \033[1;33m##\033[0m: \033[1;33m##\033[0m.... \033[1;33m##\033[0m:\n";
@@ -711,25 +1055,226 @@ sub yesno {
        return;
 }
 
+sub write_static_modules_makefile {
+  # Modules Makefile..
+  print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
+  open(FILEHANDLE, ">src/modules/Makefile");
+
+###
+# Module Makefile Header
+###
+  print FILEHANDLE <<EOF;
+# (C) ChatSpike development team
+# Makefile by <Craig\@ChatSpike.net>
+# Many Thanks to Andrew Church <achurch\@achurch.org>
+#    for assisting with making this work right.
+#
+# Automatically Generated by ./configure to add a modules
+# please run ./configure --update
+
+all: \$(MODULES)
+
+EOF
+###
+# End Module Makefile Header
+###
+
+# Create a Modules List..
+my $modules = "";
+my $cmflags = "";
+my $liflags = "";
+
+open(MODLIST,">include/modlist.h");
+
+###
+# Include File Header
+###
+print MODLIST <<HEADER;
+// Generated automatically by configure. DO NOT EDIT!
+
+#ifndef __SYMBOLS__H_CONFIGURED__
+#define __SYMBOLS__H_CONFIGURED__
+
+HEADER
+###
+# End Include File Header
+###
+
+# Place Module List into Include
+foreach $i (@modlist) {
+       if ($i !~ /_static$/) {
+               print MODLIST "extern \"C\" void * $i\_init (void);\n";
+       }
+}
+print MODLIST "\nstruct {const char *name; initfunc *value; } modsyms[] = {\n";
+
+###
+# Build Module Crap
+###
+foreach $i (@modlist)
+{
+       if ($i !~ /_static$/) {
+               $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
+               $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
+
+               ###
+               # Write Entry to the Makefile
+               ###
+               print FILEHANDLE <<EOCHEESE;
+m_$i.o: m_$i\_static.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h
+       \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c m_$i\_static.cpp
+       mv m_$i\_static.o ../m_$i.o
+
+EOCHEESE
+               ###
+               # End Write Entry to the MakeFile
+               ###
+               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");
+               while (chomp($a = <MODULE>)) { 
+                       $a =~ s/init_module/$i\_init/g;
+                       $a =~ s/Srv/$i\Srv/g;
+                       print MUNGED "$a\n";
+               }
+               close(MODULE);
+               close(MUNGED);
+               print MODLIST <<EOENT;
+{"m_$i.so",\&$i\_init},
+EOENT
+               print "done\n";
+       }
+}
+print MODLIST "{0}};\n\n#endif\n";
+close(MODLIST);
+}
+
+sub write_dynamic_modules_makefile {
+  # Modules Makefile..
+  print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
+  open(FILEHANDLE, ">src/modules/Makefile");
+  my $extra = "";
+
+  if ($config{OSNAME} =~ /CYGWIN/) {
+       $extra = "../inspircd.dll.a";
+  }
+
+###
+# Module Makefile Header
+###
+  print FILEHANDLE <<EOF;
+# (C) ChatSpike development team
+# Makefile by <Craig\@ChatSpike.net>
+# Many Thanks to Andrew Church <achurch\@achurch.org>
+#    for assisting with making this work right.
+#
+# Automatically Generated by ./configure to add a modules
+# please run ./configure -update or ./configure -modupdate
+
+all: \$(MODULES)
+
+EOF
+###
+# End Module Makefile Header
+###
+
+# Create a Modules List..
+my $modules = "";
+my $cmflags = "";
+my $liflags = "";
+
+foreach $i (@modlist) {
+       ###
+       # Write Entry to the MakeFile
+       ###
+       $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
+       \$(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
+       ###
+       # End Write Entry to the MakeFile
+       ###
+}
+}
+
 
 sub write_static_makefile {
        open(FH,">src/Makefile") or die("Could not write src/Makefile!");
+        my $i = 0;
+        my @cmdlist = ();
+        opendir(DIRHANDLE, "src");
+        foreach $name (sort readdir(DIRHANDLE)) {
+                if ($name =~ /^cmd_(.+)\.cpp$/) {
+                        $cmdlist[$i++] = $1;
+                }
+        }
+        closedir(DIRHANDLE);
+        my $cmdobjs = "";
+       my $srcobjs = "";
+        foreach my $cmd (@cmdlist) {
+                $cmdobjs = $cmdobjs . "cmd_$cmd.o ";
+                $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
+       }
        print FH <<EOM;
 # Insp Makefile :p
 #
 # (C) ChatSpike development team
 # Makefile by <Craig\@ChatSpike.net>
-# Makefile version 2 (dynamically linked core) by <brain\@inspircd.org>
+# Makefile version 2 (statically linked core) by <brain\@inspircd.org>
 #
 
 CC = im a cheezeball
 
 CXXFLAGS = -I../include \${FLAGS}
 
-all: hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_util.o inspircd_io.o connection.o message.o commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o servers.o helperfuncs.o \$(MODULES) inspircd.exe
+EOM
+###
+# This next section is for cygwin dynamic module builds.
+# Basically, what we do, is build the inspircd core as a library
+# then the main executable uses that. the library is capable of
+# loading / unloading the modules dynamically :)
+# Massive thanks to the guys on #cygwin @ irc.freenode.net for helping
+# make this work :)
+###
+
+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
+
+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
+       \$(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
+
+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)
+EOM
+}
+
+print FH <<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
+
+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
 
-inspircd.exe: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h
-       \$(CC) -I../include \$(FLAGS) inspircd.cpp -o inspircd.exe \$(LDLIBS) channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_util.o inspircd_io.o connection.o message.o commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o servers.o helperfuncs.o hashcomp.o \$(MODULES)
+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
 
 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
@@ -755,20 +1300,14 @@ 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_util.o: inspircd_util.cpp ../include/base.h ../include/inspircd_util.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_util.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
 
-connection.o: connection.cpp ../include/base.h ../include/connection.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 connection.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
 
-commands.o: commands.cpp ../include/base.h ../include/commands.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
-       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
+commands.o: commands.cpp ../include/base.h ../include/commands.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h $srcobjs
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp $cmdobjs
 
 dnsqueue.o: dnsqueue.cpp ../include/base.h ../include/dnsqueue.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
@@ -776,7 +1315,7 @@ dnsqueue.o: dnsqueue.cpp ../include/base.h ../include/dnsqueue.h ../include/insp
 dynamic.o: dynamic.cpp ../include/base.h ../include/dynamic.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
 
-users.o: users.cpp ../include/base.h ../include/users.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/connection.h
+users.o: users.cpp ../include/base.h ../include/users.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 users.cpp
 
 modules.o: modules.cpp ../include/base.h ../include/modules.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
@@ -785,15 +1324,41 @@ modules.o: modules.cpp ../include/base.h ../include/modules.h ../include/inspirc
 wildcard.o: wildcard.cpp ../include/base.h ../include/wildcard.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 wildcard.cpp
 
-servers.o: servers.cpp ../include/base.h ../include/servers.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/connection.h
-       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c servers.cpp
+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
 
+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
 
 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
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
+ITEM
+       }
 close(FH);
 }
 
 sub write_dynamic_makefile {
+
+       my $i = 0;
+       my @cmdlist = ();
+       opendir(DIRHANDLE, "src");
+       foreach $name (sort readdir(DIRHANDLE)) {
+               if ($name =~ /^cmd_(.+)\.cpp$/) {
+                       $cmdlist[$i++] = $1;
+               }
+       }
+       closedir(DIRHANDLE);
+
+       my $cmdobjs = "";
+       my $srcobjs = "";
+       foreach my $cmd (@cmdlist) {
+               $cmdobjs = $cmdobjs . "cmd_$cmd.o ";
+               $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
+       }
+
        open(FH,">src/Makefile") or die("Could not write src/Makefile");
        print FH <<EOM;
 # Insp Makefile :p
@@ -807,87 +1372,106 @@ CC = im a cheezeball
 
 CXXFLAGS = -I../include \${FLAGS}
 
-all: libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDutil.so libIRCDio.so libIRCDconnection.so libIRCDmessage.so libIRCDcommands.so libIRCDdnsqueue.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDservers.so libIRCDhelper.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
-       \$(CC) -I../include \$(FLAGS) -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDutil.so libIRCDio.so libIRCDconnection.so libIRCDmessage.so libIRCDcommands.so libIRCDdnsqueue.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDservers.so libIRCDhelper.so libIRCDhash.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: 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
+
+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
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommand_parse.so command_parse.o
+
+libIRCDcull_list.so: 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
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcull_list.so cull_list.o
+
+libIRCDuserprocess.so: 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
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDuserprocess.so userprocess.o
 
 libIRCDhash.so: 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
-       \$(CC) -shared -o libIRCDhash.so hashcomp.o
+       \$(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) -shared -o libIRCDhelper.so helperfuncs.o
+       \$(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) -shared -o libIRCDchannels.so channels.o
+       \$(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
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
-       \$(CC) -shared -o libIRCDmode.so mode.o
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmode.so mode.o
 
 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
-       \$(CC) -shared -o libIRCDxline.so xline.o
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDxline.so xline.o
 
 libIRCDstring.so: inspstring.cpp ../include/base.h ../include/inspstring.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 inspstring.cpp
-       \$(CC) -shared -o libIRCDstring.so inspstring.o
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDstring.so inspstring.o
 
 libIRCDasyncdns.so: dns.cpp ../include/base.h ../include/dns.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 dns.cpp
-       \$(CC) -shared -o libIRCDasyncdns.so dns.o
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDasyncdns.so dns.o
 
 libIRCDbase.so: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
-       \$(CC) -shared -o libIRCDbase.so base.o
-
-libIRCDutil.so: inspircd_util.cpp ../include/base.h ../include/inspircd_util.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_util.cpp
-       \$(CC) -shared -o libIRCDutil.so inspircd_util.o
+       \$(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) -shared -o libIRCDio.so inspircd_io.o
-
-libIRCDconnection.so: connection.cpp ../include/base.h ../include/connection.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 connection.cpp
-       \$(CC) -shared -o libIRCDconnection.so connection.o
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDio.so inspircd_io.o
 
 libIRCDmessage.so: message.cpp ../include/base.h ../include/message.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
-       \$(CC) -shared -o libIRCDmessage.so message.o
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmessage.so message.o
 
-libIRCDcommands.so: commands.cpp ../include/base.h ../include/commands.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
+libIRCDcommands.so: commands.cpp ../include/base.h ../include/commands.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h $srcobjs
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
-       \$(CC) -shared -o libIRCDcommands.so commands.o
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommands.so commands.o $cmdobjs
 
 libIRCDdnsqueue.so: dnsqueue.cpp ../include/base.h ../include/dnsqueue.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
-       \$(CC) -shared -o libIRCDdnsqueue.so dnsqueue.o
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdnsqueue.so dnsqueue.o
 
 libIRCDdynamic.so: dynamic.cpp ../include/base.h ../include/dynamic.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
-       \$(CC) -shared -o libIRCDdynamic.so dynamic.o
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdynamic.so dynamic.o
 
-libIRCDusers.so: users.cpp ../include/base.h ../include/users.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/connection.h
+libIRCDusers.so: users.cpp ../include/base.h ../include/users.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 users.cpp
-       \$(CC) -shared -o libIRCDusers.so users.o
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDusers.so users.o
 
 libIRCDmodules.so: modules.cpp ../include/base.h ../include/modules.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 modules.cpp
-       \$(CC) -shared -o libIRCDmodules.so modules.o
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmodules.so modules.o
 
 libIRCDwildcard.so: wildcard.cpp ../include/base.h ../include/wildcard.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 wildcard.cpp
-       \$(CC) -shared -o libIRCDwildcard.so wildcard.o
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDwildcard.so wildcard.o
+
+libIRCDsocket.so: 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
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocket.so socket.o
 
-libIRCDservers.so: servers.cpp ../include/base.h ../include/servers.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/connection.h
-       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c servers.cpp
-       \$(CC) -shared -o libIRCDservers.so servers.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
 
 EOM
-close(FH);
+       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
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
+
+ITEM
+       }
+       close(FH);
 }