]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - configure
Fix for segfault if name of file left off commandline
[user/henk/code/inspircd.git] / configure
index cf5c0fb194efc6d3b972acc14dc43dfa11a95e0c..edd88fb58cb04048bee4ec79cc9f4156a2f659d3 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,5 +1,4 @@
 #!/usr/bin/perl
-
 # InspIRCd Configuration Script
 #
 # Copyright 2003 The ChatSpike Development Team
@@ -56,62 +55,72 @@ $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`);
-  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();
+               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{OSNAME} =~ /CYGWIN/) {
-      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};
+               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";
@@ -120,10 +129,10 @@ 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 strlcpy exists... ";
@@ -131,14 +140,11 @@ printf "Checking if strlcpy exists... ";
 $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";
                }
        }
@@ -151,14 +157,11 @@ 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;
                }
        }
@@ -171,14 +174,11 @@ 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>))
-       {
+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\(/))
-               {
+               if (($line =~ /int(\0x9|\s)+epoll_create(\0x9|\s)+\(/) || ($line =~ /int(\0x9|\s)+epoll_create\(/)) {
                        $has_epoll = 1;
                }
        }
@@ -194,7 +194,7 @@ if ($has_epoll) {
 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";
 }
 
@@ -248,28 +248,30 @@ Your operating system is: \033[1;32m$config{OSNAME}\033[0m ($wholeos), fdmax: $c
 $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)
-{
+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
+                       chomp($config{GCC34}        = `$config{CC} -dumpversion | cut -c 3`); # the compiler path
+                       print "Queried compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.$config{GCC34}\033[0m)\n";
+                       if ($config{GCCVER} < 3) {
+                               print "\033[1;32mGCC 2.x WILL NOT WORK!\033[0m. Let's try that again, shall we?\n";
+                       }
+               }
+               else {
+                       print "\033[1;32mWARNING!\033[0m Could not execute the compiler you specified. You may want to try again.\n";
+               }
+       }
 }
 
 print "\n";
@@ -298,8 +300,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";
 }
@@ -316,10 +317,14 @@ if (($config{HAS_GNUTLS} eq "y") && ($config{HAS_OPENSSL} eq "y")) {
 
 if ($config{HAS_GNUTLS} eq "y") {
        yesno(USE_GNUTLS, "Would you like to enable SSL Support?");
-       print "\nUsing GnuTLS SSL module.\n";
+       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?");
-       print "\nUsing OpenSSL SSL module.\nYou will get better performance if you move to GnuTLS in the future.\n";
+       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";
@@ -333,206 +338,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
@@ -549,21 +578,21 @@ 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";
@@ -584,7 +613,7 @@ 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";
 print "\033[0mMultithread DNS:\033[1;32m\t\t$config{THREADED_DNS}\033[0m\n";
@@ -592,7 +621,15 @@ 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");
+       $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;
@@ -618,7 +655,15 @@ if ($config{USE_GNUTLS} eq "y") {
                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");
+       $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;
@@ -646,6 +691,7 @@ 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();
 
@@ -676,157 +722,163 @@ 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 {
-  my ($desc, $hash_key) = @_;
-  my $complete = 0;
-  while (!$complete) {
-    print "In what directory $desc?\n";
-    print "[\033[1;32m$config{$hash_key}\033[0m] -> ";
-    chomp($var = <STDIN>);
-    if ($var eq "") { $var = $config{$hash_key}; }
-    if ($var =~ /^\~\/(.+)$/) {
-       # Convert it to a full path..
-       $var = resolve_directory($ENV{HOME} . "/" . $1);
-    }
-    if (substr($var,0,1) ne "/")
-    {
-        # Assume relative Path was given.. fill in the rest.
-        $var = $this . "/$var";
-    }
-    $var = resolve_directory($var); 
-    if (! -e $var) {
-      print "$var does not exist. Create it?\n[\033[1;32my\033[0m] ";
-      chomp($tmp = <STDIN>);
-      if (($tmp eq "") || ($tmp =~ /^y/i)) {
-        # Attempt to Create the Dir..
-        $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256;
-        if ($chk != 0) {
-          print "Unable to create directory. ($var)\n\n";
-          # Restart Loop..
-          next;
-        }
-      } else {
-        # They said they don't want to create, and we can't install there.
-        print "\n\n";
-        next;
-      }
-    } else {
-      if (!is_dir($var)) {
-        # Target exists, but is not a directory.
-        print "File $var exists, but is not a directory.\n\n";
-        next;
-      }
-    }
-    # Either Dir Exists, or was created fine.
-    $config{$hash_key} = $var;
-    $complete = 1;
-    print "\n";
-  }
+       my ($desc, $hash_key) = @_;
+       my $complete = 0;
+       while (!$complete) {
+               print "In what directory $desc?\n";
+               print "[\033[1;32m$config{$hash_key}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{$hash_key};
+               }
+               if ($var =~ /^\~\/(.+)$/) {
+                       # Convert it to a full path..
+                       $var = resolve_directory($ENV{HOME} . "/" . $1);
+               }
+               if (substr($var,0,1) ne "/")
+               {
+                       # Assume relative Path was given.. fill in the rest.
+                       $var = $this . "/$var";
+               }
+               $var = resolve_directory($var); 
+               if (! -e $var) {
+                       print "$var does not exist. Create it?\n[\033[1;32my\033[0m] ";
+                       chomp($tmp = <STDIN>);
+                       if (($tmp eq "") || ($tmp =~ /^y/i)) {
+                               # Attempt to Create the Dir..
+                               $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256;
+                               if ($chk != 0) {
+                                       print "Unable to create directory. ($var)\n\n";
+                                       # Restart Loop..
+                                       next;
+                               }
+                       } else {
+                               # They said they don't want to create, and we can't install there.
+                               print "\n\n";
+                               next;
+                       }
+               } else {
+                       if (!is_dir($var)) {
+                               # Target exists, but is not a directory.
+                               print "File $var exists, but is not a directory.\n\n";
+                               next;
+                       }
+               }
+               # Either Dir Exists, or was created fine.
+               $config{$hash_key} = $var;
+               $complete = 1;
+               print "\n";
+       }
 }
 
 sub getosflags {
-  if ($config{OSNAME} =~ /BSD$/) {
-    $config{LDLIBS} = "-Ldl -lstdc++";
-    $config{FLAGS}  = "-fPIC -frtti $OPTIMISATI -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 $OPTIMISATI -Wall -Woverloaded-virtual $config{OPTIMISATI}";
-    $config{MAKEPROG} = "make";
-    if ($config{OSNAME} =~ /CYGWIN/) {
-       $config{FLAGS}  = "-frtti $OPTIMISATI -Wall -Woverloaded-virtual $config{OPTIMISATI}";
-       $config{LDLIBS} = "";
-       $config{MAKEPROG} = "/usr/bin/make";
-       $config{MAKEORDER} = "ircd mods config bininst";
-    }
-  }
-  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
+                               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";
+       }
 }
 
 sub is_dir {
-  my ($path) = @_;
-  if (chdir($path)) {
-    chdir($this);
-    return 1;
-  } else {
-    # Just in case..
-    chdir($this);
-    return 0;
-  }
+       my ($path) = @_;
+       if (chdir($path)) {
+               chdir($this);
+               return 1;
+       } else {
+               # Just in case..
+               chdir($this);
+               return 0;
+       }
 }
 
 sub getmodules {
-  my $i = 0;
-  opendir(DIRHANDLE, "src/modules");
-  foreach $name (sort readdir(DIRHANDLE)) {
-    if ($name =~ /^m_(.+)\.cpp$/)
-    {
-      $mod = $1;
-      if ($mod !~ /_static$/) {
-             $modlist[$i++] = $mod;
-      }
-    }
-  }
-  closedir(DIRHANDLE);
+       my $i = 0;
+       opendir(DIRHANDLE, "src/modules");
+       foreach $name (sort readdir(DIRHANDLE)) {
+               if ($name =~ /^m_(.+)\.cpp$/)
+               {
+                       $mod = $1;
+                       if ($mod !~ /_static$/) {
+                               $modlist[$i++] = $mod;
+                       }
+               }
+       }
+       closedir(DIRHANDLE);
 }
 
 sub writefiles {
 
-  print "Writing \033[1;32minspircd_config.h\033[0m\n";
-  # 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;
+       print "Writing \033[1;32minspircd_config.h\033[0m\n";
+       # 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;
 /* Auto generated by configure, do not modify! */
 #ifndef __CONFIGURATION_AUTO__
 #define __CONFIGURATION_AUTO__
@@ -851,155 +903,157 @@ 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) {
+                       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{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);
+
+       # Create a Modules List..
+       my $modules = "";
+       foreach $i (@modlist)
+       {
+               if ($config{STATIC_LINK} eq "yes") {
+                       $modules .= "m_".$i.".o ";
+               }
+               else {
+                       $modules .= "m_".$i.".so ";
+               }
+       }
+       chomp($modules);   # Remove Redundant whitespace..
+
+
+       # Write all .in files.
+       my $tmp = "";
+       my $file = "";
+       my $exe = "inspircd";
+
+       if ($config{OSNAME} =~ /CYGWIN/) {
+               $exe = "inspircd.exe";
+       }
+
+       opendir(DIRHANDLE, $this);
+       if ($config{THREADED_DNS} =~ /y/i) {
+               $config{LDLIBS} = $config{LDLIBS} . " -pthread";
+       }
+       foreach $name (sort readdir(DIRHANDLE)) {
+               if ($name =~ /^\.(.+)\.inc$/) {
+                       $file = $1;
+                       # All .name.inc files need parsing!
+                       $tmp = "";
+                       open(FILEHANDLE, ".$file.inc");
+                       while (<FILEHANDLE>) {
+                               $tmp .= $_;
+                       }
+                       close(FILEHANDLE);
+
+                       $tmp =~ s/\@CC\@/$config{CC}/;
+                       $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}/;
+                       $tmp =~ s/\@LIBRARY_DIR\@/$config{LIBRARY_DIR}/;
+                       $tmp =~ s/\@MODULES\@/$modules/;
+                       $tmp =~ s/\@EXECUTABLE\@/$exe/;
+                       $tmp =~ s/\@MAKEORDER\@/$config{MAKEORDER}/;
+                       $tmp =~ s/\@STATICLIBS\@/$config{STATICLIBS}/;
+
+                       print "Writing \033[1;32m$file\033[0m\n";
+                       open(FILEHANDLE, ">$file");
+                       print FILEHANDLE $tmp;
+               }
+       }
+       closedir(DIRHANDLE);
 
-  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{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) {
-      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{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);
-
-  # Create a Modules List..
-  my $modules = "";
-  foreach $i (@modlist)
-  {
-    if ($config{STATIC_LINK} eq "yes") {
-        $modules .= "m_".$i.".o ";
-    }
-    else {
-        $modules .= "m_".$i.".so ";
-    }
-  }
-  chomp($modules);   # Remove Redundant whitespace..
-
-
-  # Write all .in files.
-  my $tmp = "";
-  my $file = "";
-  my $exe = "inspircd";
-
-  if ($config{OSNAME} =~ /CYGWIN/) {
-    $exe = "inspircd.exe";
-  }
-
-  opendir(DIRHANDLE, $this);
-  if ($config{THREADED_DNS} =~ /y/i) {
-    $config{LDLIBS} = $config{LDLIBS} . " -pthread";
-  }
-  foreach $name (sort readdir(DIRHANDLE)) {
-    if ($name =~ /^\.(.+)\.inc$/)
-    {
-      $file = $1;
-      # All .name.inc files need parsing!
-      $tmp = "";
-      open(FILEHANDLE, ".$file.inc");
-      while (<FILEHANDLE>) {
-        $tmp .= $_;
-      }
-      close(FILEHANDLE);
-
-      $tmp =~ s/\@CC\@/$config{CC}/;
-      $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}/;
-      $tmp =~ s/\@LIBRARY_DIR\@/$config{LIBRARY_DIR}/;
-      $tmp =~ s/\@MODULES\@/$modules/;
-      $tmp =~ s/\@EXECUTABLE\@/$exe/;
-      $tmp =~ s/\@MAKEORDER\@/$config{MAKEORDER}/;
-      $tmp =~ s/\@STATICLIBS\@/$config{STATICLIBS}/;
-
-      print "Writing \033[1;32m$file\033[0m\n";
-      open(FILEHANDLE, ">$file");
-      print FILEHANDLE $tmp;
-    }
-  }
-  closedir(DIRHANDLE);
-
-  # Make inspircd executable!
-  chmod 0744, 'inspircd';
-
-  if ($config{STATIC_LINK} eq "yes") {
-       print "Writing static-build \033[1;32msrc/Makefile\033[0m\n";
-       write_static_makefile();
-       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();
-       write_dynamic_modules_makefile();
-  }
+       # Make inspircd executable!
+       chmod 0744, 'inspircd';
+
+       if ($config{STATIC_LINK} eq "yes") {
+               print "Writing static-build \033[1;32msrc/Makefile\033[0m\n";
+               write_static_makefile();
+               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();
+               write_dynamic_modules_makefile();
+       }
 }
 
 sub getcompilerflags {
-  my ($file) = @_;
-  open(FLAGS, $file);
-  while (<FLAGS>) {
-    if ($_ =~ /^\/\* \$CompileFlags: (.+) \*\/$/) {
-      close(FLAGS);
-      return $1;
-    }
-  }
-  close(FLAGS);
-  return undef;
+       my ($file) = @_;
+       open(FLAGS, $file);
+       while (<FLAGS>) {
+       if ($_ =~ /^\/\* \$CompileFlags: (.+) \*\/$/) {
+               close(FLAGS);
+                       return $1;
+               }
+       }
+       close(FLAGS);
+       return undef;
 }
 
 sub getlinkerflags {
-  my ($file) = @_;
-  open(FLAGS, $file);
-  while (<FLAGS>) {
-    if ($_ =~ /^\/\* \$LinkerFlags: (.+) \*\/$/) {
-      close(FLAGS);
-      return $1;
-    }
-  }
-  close(FLAGS);
-  return undef;
+       my ($file) = @_;
+       open(FLAGS, $file);
+       while (<FLAGS>) {
+               if ($_ =~ /^\/\* \$LinkerFlags: (.+) \*\/$/) {
+                       close(FLAGS);
+                       return $1;
+               }
+       }
+       close(FLAGS);
+       return undef;
 }
 
 sub show_splash {
@@ -1033,14 +1087,14 @@ sub yesno {
 }
 
 sub write_static_modules_makefile {
-  # Modules Makefile..
-  print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
-  open(FILEHANDLE, ">src/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;
+       ###
+       # Module Makefile Header
+       ###
+       print FILEHANDLE <<EOF;
 # (C) ChatSpike development team
 # Makefile by <Craig\@ChatSpike.net>
 # Many Thanks to Andrew Church <achurch\@achurch.org>
@@ -1052,94 +1106,94 @@ sub write_static_modules_makefile {
 all: \$(MODULES)
 
 EOF
-###
-# End Module Makefile Header
-###
+       ###
+       # End Module Makefile Header
+       ###
 
-# Create a Modules List..
-my $modules = "";
-my $cmflags = "";
-my $liflags = "";
+       # Create a Modules List..
+       my $modules = "";
+       my $cmflags = "";
+       my $liflags = "";
 
-open(MODLIST,">include/modlist.h");
+       open(MODLIST,">include/modlist.h");
 
-###
-# Include File Header
-###
-print MODLIST <<HEADER;
+       ###
+       # 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
-###
+       ###
+       # End Include File Header
+       ###
 
-# Place Module List into Include
-foreach $i (@modlist) {
-       if ($i !~ /_static$/) {
-               print MODLIST "extern \"C\" void * $i\_init (void);\n";
+       # 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";
+       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");
-
-               print FILEHANDLE <<EOCHEESE;
-               ###
-               # Write Entry to the MakeFile
-               ###
+       ###
+       # 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;
+                       ###
+                       # 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 "done\n";
+               }
        }
-}
-print MODLIST "{0}};\n\n#endif\n";
-close(MODLIST);
+       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 = "";
+       # 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";
-  }
+       if ($config{OSNAME} =~ /CYGWIN/) {
+               $extra = "../inspircd.dll.a";
+       }
 
 ###
 # Module Makefile Header
 ###
-  print FILEHANDLE <<EOF;
+       print FILEHANDLE <<EOF;
 # (C) ChatSpike development team
 # Makefile by <Craig\@ChatSpike.net>
 # Many Thanks to Andrew Church <achurch\@achurch.org>
@@ -1151,16 +1205,16 @@ sub write_dynamic_modules_makefile {
 all: \$(MODULES)
 
 EOF
-###
-# End Module Makefile Header
-###
+       ###
+       # End Module Makefile Header
+       ###
 
-# Create a Modules List..
-my $modules = "";
-my $cmflags = "";
-my $liflags = "";
+       # Create a Modules List..
+       my $modules = "";
+       my $cmflags = "";
+       my $liflags = "";
 
-foreach $i (@modlist) {
+       foreach $i (@modlist) {
        ###
        # Write Entry to the MakeFile
        ###
@@ -1177,7 +1231,7 @@ EOCHEESE
        ###
        # End Write Entry to the MakeFile
        ###
-}
+       }
 }
 
 
@@ -1211,35 +1265,35 @@ CC = im a cheezeball
 CXXFLAGS = -I../include \${FLAGS}
 
 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 :)
-###
+       ###
+       # 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
+       if ($config{OSNAME} =~ /CYGWIN/) {
+               print FH <<EOM;
+all: timer.o aes.o command_parse.o cull_list.o userprocess.o socketengine.o socket.o hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_io.o message.o $cmdobjs commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o helperfuncs.o inspircd.exe
 
 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 inspircd_io.o message.o $cmdobjs  commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o aes.o timer.o
        \$(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
+       } else {
+               print FH <<EOM;
+all: timer.o aes.o command_parse.o cull_list.o userprocess.o socketengine.o socket.o hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_io.o message.o $cmdobjs commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o helperfuncs.o \$(MODULES) inspircd.exe
 
 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 inspircd_io.o message.o $cmdobjs commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o aes.o timer.o \$(MODULES)
 EOM
-}
+       }
 
-print FH <<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
@@ -1307,6 +1361,9 @@ socket.o: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.
 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;
@@ -1314,7 +1371,7 @@ cmd_$cmd.o: cmd_$cmd.cpp ../include/base.h ../include/modules.h ../include/inspi
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
 ITEM
        }
-close(FH);
+       close(FH);
 }
 
 sub write_dynamic_makefile {
@@ -1349,10 +1406,10 @@ CC = im a cheezeball
 
 CXXFLAGS = -I../include \${FLAGS}
 
-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
+all: libIRCDtimer.so libIRCDaes.so libIRCDcull_list.so libIRCDuserprocess.so libIRCDsocketengine.so libIRCDsocket.so libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDio.so libIRCDmessage.so $cmdobjs libIRCDcommands.so libIRCDdnsqueue.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so inspircd
 
 inspircd: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h ../include/socket.h
-       \$(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
+       \$(CC) -I../include -Wl,--rpath -Wl,$config{LIBRARY_DIR} \$(FLAGS) -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDio.so libIRCDmessage.so libIRCDcommands.so libIRCDdnsqueue.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDhash.so libIRCDsocket.so libIRCDsocketengine.so libIRCDuserprocess.so libIRCDcull_list.so libIRCDcommand_parse.so libIRCDaes.so libIRCDtimer.so
 
 libIRCDsocketengine.so: 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
@@ -1442,6 +1499,10 @@ libIRCDaes.so: aes.cpp ../include/base.h ../include/inspircd.h ../include/global
        \$(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;