]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - configure
A few simple output lines (similar to gnu autoconf so people know what's happening)
[user/henk/code/inspircd.git] / configure
index 6cefea4e54529c676da6916609df823d4e362c8f..428328e424858ea9c55b730725ab5f3fc765d9ff 100755 (executable)
--- a/configure
+++ b/configure
-#!/bin/sh
+#!/usr/bin/perl
 # InspIRCd Configuration Script
 #
 # Copyright 2003 The ChatSpike Development Team
 # <brain@chatspike.net>
 # <Craig@chatspike.net>
 #
-# $Id$
+# [14:21] Brain: <matrix impression> i know perl-fu!
 #
+# $Id$
 #
 ########################################
 
-echo "Configuring default values..."
-
-ME=`pwd`
-GCCVER=`gcc -dumpversion | cut -c 1`
-GCC34=`gcc -dumpversion | cut -c 3`
-CONFIG_DIR=$ME/conf
-MODULE_DIR=$ME/modules
-BINARY_DIR=$ME/bin
-INSTALL=`which install`
-OPTIMITEMP=0
-OPTIMISATI="-g"
-MAX_CLIENT_T=`ulimit -n`
-NICK_LENGT=32
-CHAN_LENGT=64
-MAX_CHANNE=20
-MAXI_MODES=20
-HAS_STRLCPY=0
-OSNAME=`(uname -s) 2>/dev/null` || OSNAME="unknown"
-
-if [ -z $MAX_CLIENT_T ] ; then
-        MAX_CLIENT_T=1024
-        SCAN_FAILED=1
-fi
-
-
-if [ "$1" = "-clean" -o "$2" = "-clean" ] ; then
-  `rm -rf .config.cache`
-fi
-
-if [ -e ".config.cache" -a -z "$CLEAN" ] ; then
-    . .config.cache 
-fi
-
-if [ "$1" = "-update" -o "$2" = "-update" ] ; then
-   # They wanna update their Makefile.. good for 'em
-   # Make sure .config.cache exists
-   if [ ! -e ".config.cache" ] ; then
-     echo "You have not run ./configure before. Please do this before trying to run the update script."
-     exit 0
-   fi
-   # Right, load the cache values
-   . .config.cache
-   # Check for modules
-
-   case "$OSNAME" in
-           FreeBSD)
-                   LDLIBS="-Ldl"
-                   FLAGS="-fPIC -frtti $OPTIMISATI"
-                   MAKEPROG="gmake"
-                   ;;
-           *)
-                   LDLIBS="-ldl"
-                   FLAGS="-fPIC -frtti $OPTIMISATI"
-                   MAKEPROG="make"
-                   ;;
-   esac
-
-   MODULES=""
-   for module in src/modules/*.cpp ; do
-           mod=`echo $module | sed 's/.cpp/.so/' | sed 's/src\/modules\///'`
-           MODULES="$MODULES $mod"
-   done
-
-   # Write the new makefile.
-   for file in Makefile; do
-          echo -e "\033[0mWriting \033[1;32m$file\033[0m"
-          rm -f $file
-          sed -e "
-                  s%@MAKEPROG@%$MAKEPROG%g
-                  s%@FLAGS@%$FLAGS%g
-                  s%@LDLIBS@%$LDLIBS%g
-                  s%@CONFIG_DIR@%$CONFIG_DIR%g
-                  s%@MODULE_DIR@%$MODULE_DIR%g
-                  s%@BINARY_DIR@%$BINARY_DIR%g
-                  s%@MODULES@%$MODULES%g
-          " .${file}.inc >> $file
-   done
-   echo -e "\033[0mWriting \033[1;32msrc/modules/Makefile\033[0m"
-   rm -f src/modules/Makefile
-
-   # Generate the Header..
-
-   echo "# (C) ChatSpike development team" >> src/modules/Makefile
-   echo "# Makefile by <Craig@ChatSpike.net>" >> src/modules/Makefile
-   echo "# Many Thanks to Andrew Church <achurch@achurch.org>" >> src/modules/Makefile
-   echo "#    for assisting with making this work right." >> src/modules/Makefile
-   echo "#" >> src/modules/Makefile
-   echo "# Automatically Generated by ./configure to add a module" >> src/modules/Makefile
-   echo "# please run ./configure --update" >> src/modules/Makefile
-   echo "" >> src/modules/Makefile
-   echo "all: \$(MODULES)" >> src/modules/Makefile
-   echo "" >> src/modules/Makefile
-
-
-   for module in src/modules/*.cpp ; do
-        flags=`grep '$CompileFlags: ' $module | sed 's/\/\* $CompileFlags://' | sed 's/\*\///'`
-        mod=`echo $module | sed 's/.cpp/.so/' | sed 's/src\/modules\///'`
-       mod2=`echo $module | sed 's/src\/modules\///'`
-        echo "$mod: $mod2 ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/servers.h ../../include/base.h" >> src/modules/Makefile
-        echo " \$(CC) -I../../include \$(FLAGS) -shared$flags -o $mod $mod2" >> src/modules/Makefile
-       echo "  @cp $mod \$(MODPATH)/" >> src/modules/Makefile
-        echo "" >> src/modules/Makefile
-   done
-
-
-   echo "Complete."
-   exit 1; 
-fi
-
-
-if [ -z $MAX_CLIENT ] ; then
-        MAX_CLIENT=$MAX_CLIENT_T
-fi
-
-
-c=""
-n=""
-if [ "`eval echo -e -n 'a'`" = "-n a" ] ; then
-        c="\c"
-else
-        n="-n"
-fi
-
-exists () { # because some shells don't have test -e
-    if [ -f $1 -o -d $1 -o -p $1 -o -c $1 -o -b $1 ] ; then
-       return 0
-    else
-       return 1
-    fi
+
+$this = resolve_directory($ENV{PWD});                                          # PWD, Regardless.
+@modlist = ();                                                                 # Declare for Module List..
+%config = ();                                                                  # Initiate Configuration Hash..
+$config{ME}                 = resolve_directory($ENV{PWD});                    # Present Working Directory
+$config{CONFIG_DIR}         = resolve_directory($ENV{PWD}."/conf");            # Configuration Directory
+$config{MODULE_DIR}         = resolve_directory($ENV{PWD}."/modules");         # Modules Directory
+$config{BINARY_DIR}         = resolve_directory($ENV{PWD}."/bin");             # Binary Directory
+$config{LIBRARY_DIR}        = resolve_directory($ENV{PWD}."/lib");             # Library Directory
+$config{OPTIMITEMP}         = "0";                                             # Default Optimisation Value
+$config{OPTIMISATI}         = "-g";                                            # Optimisation Flag
+$config{NICK_LENGT}         = "32";                                            # Default Nick Length
+$config{CHAN_LENGT}         = "64";                                            # Default Channel Name Length
+$config{MAX_CHANNE}         = "20";                                            # Default Max. Channels per user..
+$config{MAXI_MODES}         = "20";                                            # Default Max. Number of Modes set at once.
+$config{HAS_STRLCPY}        = "false";                                         # strlcpy Check.
+$config{USE_KQUEUE}         = "n";                                             # kqueue enabled
+chomp($config{MAX_CLIENT_T} = `sh -c \"ulimit -n\"`);                          # 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}       = `uname -s`);                                     # Operating System Name
+
+if (!$config{OSNAME}) {
+  $config{OSNAME} = "Unknown";                                  # For use when uname fails.
+}
+
+if (!$config{MAX_CLIENT_T}) { 
+  $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 "-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();
+    writefiles();
+    print "Complete.\n";
+    exit;
+  }
+}
+
+print "Checking for cache from previous configure...\n";
+getcache();
+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};
+}
+
+printf "Checking if strlcpy exists... ";
+# Perform the strlcpy() test..
+$config{HAS_STRLCPY} = "false";
+my $fail = 0;
+open(STRLCPY, "</usr/include/string.h") or $fail = 1;
+if (!$fail)
+{
+       while (chomp($line = <STRLCPY>))
+       {
+               # try and find the delcaration of:
+               # size_t strlcpy(...)
+               if (($line =~ /size_t(\0x9|\s)+strlcpy(\0x9|\s)+\(/) || ($line =~ /size_t(\0x9|\s)+strlcpy\(/))
+               {
+                       $config{HAS_STRLCPY} = "true";
+               }
+       }
+       close(STRLCPY);
+}
+print "yes\n" if $config{HAS_STRLCPY} eq "true";
+print "no\n" if $config{HAS_STRLCPY} eq "false";
+
+printf "Checking if kqueue exists... ";
+$has_kqueue = 0;
+$fail = 0;
+open(KQUEUE, "</usr/include/sys/event.h") or $fail = 1;
+if (!$fail)
+{
+        while (chomp($line = <KQUEUE>))
+        {
+                # try and find the delcaration of:
+               # int kqueue(void);
+               if (($line =~ /int(\0x9|\s)+kqueue(\0x9|\s)+\(/) || ($line =~ /int(\0x9|\s)+kqueue\(/))
+               {
+                       $has_kqueue = 1;
+               }
+       }
+       close(KQUEUE);
+}
+print "yes\n" if $has_kqueue == 1;
+print "no\n" if $has_kqueue == 0;
+
+################################################################################
+#                          BEGIN INTERACTIVE PART                              #
+################################################################################
+
+# Clear the Screen..
+system("clear");
+# Display Splash Logo..
+show_splash();
+chomp($wholeos = `uname -mnr`);
+
+# Display Introduction Message..
+print "
+Welcome to the InspIRCd Configuration program!
+
+*** If you are unsure of any of these values, leave it blank for    ***
+*** standard settings that will work, and your server will run      ***
+*** using them. If you are running this server as part of a         ***
+*** larger network, you must consult with your network admins       ***
+*** for the proper values to use, or server links will be unstable! ***
+
+Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter
+a new value. Please note: You will \033[1mHAVE\033[0m to read the docs
+dir, otherwise you won't have a config file!
+
+Your operating system is: \033[1;32m$config{OSNAME}\033[0m ($wholeos), fdmax: $config{MAX_CLIENT_T}\n\n";
+
+# Directory Settings..
+dir_check("are the configuration files", "CONFIG_DIR");
+dir_check("are the modules to be compiled to", "MODULE_DIR");
+dir_check("is the IRCd binary to be placed", "BINARY_DIR");
+dir_check("are the IRCd libraries to be placed", "LIBRARY_DIR");
+
+if ($has_kqueue) {
+       yesno(USE_KQUEUE,"You are running a BSD operating system, and kqueue\nwas detected. Would you like to enable kqueue support?\nIf you are unsure, answer no.\n\nEnable kqueue?");
+}
+
+# File Descriptor Settings..
+my $continue = 0;
+while (!$continue) {
+  print "Maximum number of clients at any one time ($config{MAX_CLIENT_T})\n";
+  print "[\033[1;32m$config{MAX_CLIENT}\033[0m] -> ";
+  chomp($var = <STDIN>);
+  if ($var eq "") { $var = $config{MAX_CLIENT}; }
+  if ($var =~ /^\d+$/) {
+    if (($var > $config{MAX_CLIENT_T}) && ($fd_scan_failed ne true)) {
+      # Client has entered a larger number than the 'discovered' value
+      # Confirm.
+      print "WARNING: Our scans have indicated that you are attempting
+to use more sockets than there are avaliable. Are you sure
+you wish to do this? It may cause the IRCd to malfunction [y/n]
+[\033[1;32mn\033[0m] -> $c";
+      chomp($tmp = <STDIN>);
+      if ($tmp ne "y") {
+        print "Please enter the correct value.\n\n";
+        next;
+      }
+    }
+  } 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";
+  }
+}
+
+my $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";
+  }
+}
+
+# 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.
+
+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";
+print "[\033[1;32m$config{OPTIMITEMP}\033[0m] -> ";
+chomp($var = <STDIN>);
+if ($var eq "") {
+  $var = $config{OPTIMITEMP};
+}
+
+if ($var eq "1") {
+  $config{OPTIMITEMP} = 1;
+  $config{OPTIMISATI} = "-O";
+} elsif ($var eq "2") {
+  $config{OPTIMITEMP} = 2;
+  $config{OPTIMISATI} = "-O2";
+} elsif ($var eq "3") {
+  $config{OPTIMITEMP} = 3;
+  $config{OPTIMISATI} = "-O3";
+} else {
+  $config{OPTIMITEMP} = 0;
+  $config{OPTIMISATI} = "-g";
+}
+
+print "\n\033[1;32mPre-build configuration is complete!\033[0m\n\n";
+print "\033[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[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 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[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\n";
+
+makecache();
+writefiles();
+
+print "\n\n";
+print "To build your server with these settings, please type '\033[1;32m$config{MAKEPROG}\033[0m' now.\n";
+print "*** \033[1;32mRemember to edit your configuration files!!!\033[0m ***\n\n\n";
+
+################################################################################
+#                              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";
+}
+
+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);
+}
+
+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";
+  }
+}
+
+sub getosflags {
+  if ($config{OSNAME} eq "FreeBSD") {
+    $config{LDLIBS} = "-Ldl";
+    $config{FLAGS}  = "-fPIC -frtti $OPTIMISATI -Woverloaded-virtual $config{OPTIMISATI}";
+    $config{MAKEPROG} = "gmake";
+  } else {
+    $config{LDLIBS} = "-ldl";
+    $config{FLAGS}  = "-fPIC -frtti $OPTIMISATI -Woverloaded-virtual $config{OPTIMISATI}";
+    $config{MAKEPROG} = "make";
+  }
 }
 
-echo "#include <string.h>">.test.cpp
-echo "#include <stdio.h>">>.test.cpp
-echo "int main() { char a[10]; char b[10]; strlcpy(a,b,10); printf(\"%d\\n\",9); }" >>.test.cpp
-g++ -o .test .test.cpp 2>&1
-if [ -e ".test" ] ; then
-       HAS_STRLCPY=1
-fi 
-rm -f .test.cpp .test
-
-clear
-echo -e "'\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::"
-echo -e ". \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:"
-echo -e ": \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:"
-echo -e ": \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:"
-echo -e ": \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:"
-echo -e ": \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:"
-echo -e "'\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::"
-echo -e "\033[0m\033[0m....::..::::..:::......:::..:::::::::....::..:::::..:::......:::........:::"
-echo ""
-echo "Welcome to the InspIRCd Configuration program!"
-echo ""
-echo "*** If you are unsure of any of these values, leave it blank for    ***"
-echo "*** standard settings that will work, and your server will run      ***"
-echo "*** using them. If you are running this server as part of a         ***"
-echo "*** larger network, you must consult with your network admins       ***"
-echo "*** for the proper values to use, or server links will be unstable! ***"
-echo ""
-echo -e "Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter"
-echo -e "a new value. Please note: You will \033[1mHAVE\033[0m to read the docs"
-echo -e "dir, otherwise you won't have a config file!"
-echo ""
-echo -e "Your operating system is: \033[1;32m$OSNAME\033[0m (`uname -mnr`), fdmax: $MAX_CLIENT_T"
-echo ""
-
-#############################################################################
-
-    ok=0
-    asked=1
-    echo "In what directory are the configuration files?"
-    while [ $ok -eq 0 ] ; do
-       echo -e $n "[\033[1;32m$CONFIG_DIR\033[0m] -> $c"
-       if read INPUT ; then : ; else echo "" ; exit 1 ; fi
-       if [ ! "$INPUT" ] ; then
-           INPUT=$CONFIG_DIR
-           default=1
-       fi
-       if echo "$INPUT" | grep -q \[\'\"\\\] ; then
-           echo 'Please use a pathname without the characters: '\'' " \'
-       elif [ ! "$NO_DIR_CHECK" -a ! -d "$INPUT" ] ; then
-           if exists "$INPUT" ; then
-               echo "$INPUT exists, but is not a directory!"
-           else
-               echo "$INPUT does not exist.  Create it?"
-               echo -e $n "[\033[1;32my\033[0m] $c"
-               read YN
-               if [ "$YN" != "n" ] ; then
-                   if mkdir -p "$INPUT" ; then
-                       ok=1
-                   fi
-               fi
-           fi
-           else
-            ok=1
-       fi
-    done
-    CONFIG_DIR=$INPUT
-    echo ""
-
-
-##############################################################################
-
-    ok=0
-    asked=1
-    echo "In What directory are the modules to be compiled to?"
-    while [ $ok -eq 0 ] ; do
-        echo -e $n "[\033[1;32m$MODULE_DIR\033[0m] -> $c"
-        if read INPUT ; then : ; else echo "" ; exit 1 ; fi
-        if [ ! "$INPUT" ] ; then
-            INPUT=$MODULE_DIR
-            default=1
-        fi
-        if echo "$INPUT" | grep -q \[\'\"\\\] ; then
-            echo 'Please use a pathname without the characters: '\'' " \'
-        elif [ ! "$NO_DIR_CHECK" -a ! -d "$INPUT" ] ; then
-            if exists "$INPUT" ; then
-                echo "$INPUT exists, but is not a directory!"
-            else
-                echo "$INPUT does not exist.  Create it?"
-                echo -e $n "[\033[1;32my\033[0m] $c"
-                read YN
-                if [ "$YN" != "n" ] ; then
-                    if mkdir -p "$INPUT" ; then
-                        ok=1
-                    fi
-                fi
-            fi
-            else
-            ok=1
-        fi
-    done
-    MODULE_DIR=$INPUT
-    echo ""
-
-
-##############################################################################
-
-    ok=0
-    asked=1
-    echo "In what directory is the IRCd binary to be placed?"
-    while [ $ok -eq 0 ] ; do
-        echo -e $n "[\033[1;32m$BINARY_DIR\033[0m] -> $c"
-        if read INPUT ; then : ; else echo "" ; exit 1 ; fi
-        if [ ! "$INPUT" ] ; then
-            INPUT=$BINARY_DIR
-            default=1
-        fi
-        if echo "$INPUT" | grep -q \[\'\"\\\] ; then
-            echo 'Please use a pathname without the characters: '\'' " \'
-        elif [ ! "$NO_DIR_CHECK" -a ! -d "$INPUT" ] ; then
-            if exists "$INPUT" ; then
-                echo "$INPUT exists, but is not a directory!"
-            else
-                echo "$INPUT does not exist.  Create it?"
-                echo -e $n "[\033[1;32my\033[0m] $c"
-                read YN
-                if [ "$YN" != "n" ] ; then
-                    if mkdir -p "$INPUT" ; then
-                        ok=1
-                    fi
-                fi
-            fi
-            else
-            ok=1
-        fi
-    done
-    BINARY_DIR=$INPUT
-    echo ""
-
-###############################################################################
-# Craigs Version 3 With slightly less Cheeze :p
-
-cheeze=0
-echo -e "Maximum number of clients at any one time (\033[1;32m1-$MAX_CLIENT_T\033[0m)?"
-while [ "$cheeze" -eq "0" ] ; do
-       echo -e $n "[\033[1;32m$MAX_CLIENT\033[0m] -> $c"
-        read cc
-
-        if [ -z "$cc" ] ; then
-               cc=$MAX_CLIENT
-       fi
-
-       case "$cc" in 
-               [0-9]*)
-                       if [ "$cc" -gt "$MAX_CLIENT_T" -a -z "$SCAN_FAILED" ] ; then
-                               echo -e "WARNING: Our scans have indicated that you are attempting"
-                               echo -e "to use more sockets than there are avaliable. Are you sure"
-                               echo -e "you wish to do this? It may cause the IRCd to malfunction [y/n]"
-                               echo -e $n "[\033[1;32mn\033[0m] -> $c"
-                               read YN
-                               if [ "$YN" = "y" ] ; then
-                                       MAX_CLIENT=$cc
-                                       cheeze=1
-                               else
-                                       echo ""
-                                       echo -e "Please enter the correct value (\033[1;32m1-$MAX_CLIENT_T\033[0m)"
-                               fi
-                       else
-                               echo $SCAN_FAILED
-                               cheeze=1
-                               MAX_CLIENT=$cc
-                       fi
-                       ;;
-               *)
-                       echo ""
-                       echo "You must enter a number in this field. Please try again."
-                       ;;
-       esac
-done
-echo ""
-
-
-###############################################################################
-
-  cheeze=0
-  echo -e "What is the Maximum length of nicknames?"
-  while [ "$cheeze" -eq "0" ] ; do
-        echo -e $n "[\033[1;32m$NICK_LENGT\033[0m] -> $c"
-        read cc
-        if [ "$cc" ] ; then
-                case "$cc" in
-                        [0-9]*)
-                        NICK_LENGT=$cc
-                        cheeze=1
-                        ;;
-                        *)
-                        echo ""
-                        echo "You Must Enter a Number in this field. Please Try Again."
-                        cheeze=0
-                        ;;
-                esac
-        else
-                cheeze=1
-        fi
-  done
-  echo ""
-
-###############################################################################
-
-  cheeze=0
-  echo -e "What is the Maximum length of channel names?"
-  while [ "$cheeze" -eq "0" ] ; do
-        echo -e $n "[\033[1;32m$MAX_CHANNE\033[0m] -> $c"
-        read cc
-        if [ "$cc" ] ; then
-                case "$cc" in
-                        [0-9]*)
-                        MAX_CHANNE=$cc
-                        cheeze=1
-                        ;;
-                        *)
-                        echo ""
-                        echo "You Must Enter a Number in this field. Please Try Again."
-                        cheeze=0
-                        ;;
-                esac
-        else
-                cheeze=1
-        fi
-  done
-  echo ""
-
-###############################################################################
-
-  cheeze=0
-  echo -e "What is the Maximum number of mode changes in one line?"
-  while [ "$cheeze" -eq "0" ] ; do
-        echo -e $n "[\033[1;32m$MAXI_MODES\033[0m] -> $c"
-        read cc
-        if [ "$cc" ] ; then
-                case "$cc" in
-                        [0-9]*)
-                        MAXI_MODES=$cc
-                        cheeze=1
-                        ;;
-                        *)
-                        echo ""
-                        echo "You Must Enter a Number in this field. Please Try Again."
-                        cheeze=0
-                        ;;
-                esac
-        else
-                cheeze=1
-        fi
-  done
-  echo ""
-
-###############################################################################
-# Code Optimisation?
-
-  cheeze=0
-  echo -e "Enter the Level Of Binary optimisation. This is a number between 0 and 3 (inclusive)"
-  echo -e "The InspIRCd Team will _NOT_ support any bug reports above 0."
-  echo -e "Also note, the IRCd behaviour will be different depending on this value."
-  echo -e "Please read the documentation for more information."
-  echo -e ""
-  echo -e "The Higher the number, the more optimised your binary will be. This value will default to 0"
-  echo -e "If you either a) Dont enter a number, or b) Enter a value outside the range."
-  echo -e $n "[\033[1;32m$OPTIMITEMP\033[0m] -> $c"
-  read cc
-  if [ -z "$cc" ] ; then
-       cc=$OPTIMITEMP
-  fi
-  case "$cc" in
-        1)
-                OPTIMITEMP=1
-               OPTIMISATI="-O"
-                ;;
-       2)
-               OPTIMITEMP=2
-               OPTIMISATI="-O2"
-               ;;
-       3)
-               OPTIMITEMP=3
-               OPTIMISATI="-O3"
-               ;;
-       *)
-                OPTIMITEMP=0
-                OPTIMISATI="-g"
-                ;;
-  esac
-  echo ""
-
-###############################################################################
-
-
-echo -e "\033[1;32mPre-build configuration is complete!\033[0m"
-echo ""
-echo -e "\033[0mConfig path:\033[1;32m\t\t\t$CONFIG_DIR"
-echo -e "\033[0mModule path:\033[1;32m\t\t\t$MODULE_DIR"
-echo -e "\033[0mMax connections:\033[1;32m\t\t$MAX_CLIENT"
-echo -e "\033[0mMax User Channels\033[1;32m\t\t$MAX_CHANNE"
-echo -e "\033[0mMax nickname length:\033[1;32m\t\t$NICK_LENGT"
-echo -e "\033[0mMax channel length:\033[1;32m\t\t$CHAN_LENGT"
-echo -e "\033[0mMax mode length:\033[1;32m\t\t$MAXI_MODES"
-echo -e "\033[0mGCC Version Found:\033[1;32m\t\t$GCCVER.$GCC34"
-echo -e "\033[0mOptimatizaton Flag:\033[1;32m\t\t$OPTIMISATI"
-echo -e "\033[0m"
-
-echo "Writing cache file for future ./configures ..."
-
-COPY_CONF=0
-if [ "$CONFIG_DIR" != "$ME/conf" ] ; then
-    COPY_CONF=1
-fi
-
-
-if [ -e ".config.cache" ] ; then
-       rm .config.cache
-fi
-echo "CONFIG_DIR=\"$CONFIG_DIR\"" >> .config.cache
-echo "MODULE_DIR=\"$MODULE_DIR\"" >> .config.cache
-echo "BINARY_DIR=\"$BINARY_DIR\"" >> .config.cache
-echo "MAX_CLIENT=\"$MAX_CLIENT\"" >> .config.cache
-echo "MAX_CHANNE=\"$MAX_CHANNE\"" >> .config.cache
-echo "NICK_LENGT=\"$NICK_LENGT\"" >> .config.cache
-echo "MAXI_MODES=\"$MAXI_MODES\"" >> .config.cache 
-echo "OPTIMITEMP=\"$OPTIMITEMP\"" >> .config.cache
-echo "OPTIMISATI=\"$OPTIMISATI\"" >> .config.cache
-echo "GCC34=\"$GCC34\"" >> .config.cache
-echo "HAS_STRLCPY=\"$HAS_STRLCPY\"" >> .config.cache
-echo "COPY_CONF=\"$COPY_CONF\"" >> .config.cache
-
-echo -e "Writing \033[1;32minspircd_config.h"
-
-echo "/* Auto generated by configure, do not modify! */" >include/inspircd_config.h
-echo "" >>include/inspircd_config.h
-if [ "$GCCVER" -eq "3" ] ; then
-echo "#define GCC3" >>include/inspircd_config.h
-       if [ "$GCC34" -gt "3" ] ; then
-               echo "#define GCC34" >>include/inspircd_config.h
-       fi
-fi
-if [ "$HAS_STRLCPY" -eq "1" ] ; then
-       echo "#define HAS_STRLCPY" >>include/inspircd_config.h
-fi
-echo "#define SYSLOG_FACILITY LOG_DAEMON" >>include/inspircd_config.h
-echo "#define SYSLOG_LEVEL LOG_NOTICE" >>include/inspircd_config.h
-echo "#define CONFIG_FILE \"$CONFIG_DIR/inspircd.conf\"" >>include/inspircd_config.h
-echo "#define MOD_PATH \"$MODULE_DIR\"" >>include/inspircd_config.h
-echo "#define VERSION \"`sh ./src/version.sh`\"" >>include/inspircd_config.h
-echo "#define MAXCLIENTS $MAX_CLIENT" >>include/inspircd_config.h
-echo "#define NICKMAX $NICK_LENGT" >>include/inspircd_config.h
-echo "#define CHANMAX $CHAN_LENGT" >>include/inspircd_config.h
-echo "#define MAXCHANS $MAX_CHANNE" >>include/inspircd_config.h
-echo "#define MAXMODES $MAXI_MODES" >>include/inspircd_config.h
-echo "#define OPTIMISATION $OPTIMITEMP" >>include/inspircd_config.h
-echo "#define SYSTEM \"`uname -n -s -r`\"" >>include/inspircd_config.h
-echo "#define MAXBUF 514">>include/inspircd_config.h
-touch include/inspircd_config.h
-
-case "$OSNAME" in
-       FreeBSD)
-               LDLIBS="-Ldl"
-               FLAGS="-fPIC -frtti $OPTIMISATI"
-               MAKEPROG="gmake"
-               ;;
-       *)
-               LDLIBS="-ldl"
-               FLAGS="-fPIC -frtti $OPTIMISATI"
-               MAKEPROG="make"
-               ;;
-esac
-
-MODULES=""
-for module in src/modules/*.cpp ; do
-        mod=`echo $module | sed 's/.cpp/.so/' | sed 's/src\/modules\///'`
-       MODULES="$MODULES $mod" 
-done
-
-for file in Makefile inspircd; do
-       echo -e "\033[0mWriting \033[1;32m$file\033[0m"
-       rm -f $file
-       sed -e "
-               s%@MAKEPROG@%$MAKEPROG%g
-               s%@FLAGS@%$FLAGS%g
-               s%@LDLIBS@%$LDLIBS%g
-               s%@CONFIG_DIR@%$CONFIG_DIR%g
-               s%@MODULE_DIR@%$MODULE_DIR%g
-               s%@BINARY_DIR@%$BINARY_DIR%g
-               s%@MODULES@%$MODULES%g
-       " .${file}.inc >> $file
-done
-`chmod 700 inspircd`
-
-echo -e "\033[0mWriting \033[1;32msrc/modules/Makefile\033[0m"
-rm -f src/modules/Makefile
-
-# Generate the Header..
-
-echo "# (C) ChatSpike development team" >> src/modules/Makefile
-echo "# Makefile by <Craig@ChatSpike.net>" >> src/modules/Makefile
-echo "# Many Thanks to Andrew Church <achurch@achurch.org>" >> src/modules/Makefile
-echo "#    for assisting with making this work right." >> src/modules/Makefile
-echo "#" >> src/modules/Makefile
-echo "# Automatically Generated by ./configure to add a module" >> src/modules/Makefile
-echo "# please run ./configure --update" >> src/modules/Makefile
-echo "" >> src/modules/Makefile
-echo "all: \$(MODULES)" >> src/modules/Makefile
-echo "" >> src/modules/Makefile
-
-for module in src/modules/*.cpp ; do
-     flags=`grep '$CompileFlags: ' $module | sed 's/\/\* $CompileFlags://' | sed 's/\*\///'`
-     mod=`echo $module | sed 's/.cpp/.so/' | sed 's/src\/modules\///'`
-     mod2=`echo $module | sed 's/src\/modules\///'`
-     echo "$mod: $mod2 ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/servers.h ../../include/base.h" >> src/modules/Makefile
-     echo "    \$(CC) -I../../include \$(FLAGS) -shared$flags -o $mod $mod2" >> src/modules/Makefile
-     echo "    @cp $mod \$(MODPATH)/" >> src/modules/Makefile
-     echo "" >> src/modules/Makefile
-done
-
-
-echo ""
-
-echo ""
-echo "Do you want to compile the IRCd binaries?"
-echo -e $n "[\033[1;32my\033[0m] $c"
-read YN
-if [ "$YN" != "n" ] ; then
-       echo ""
-       echo -e "\033[1;32mCompiling...\033[0m"
-       echo ""
-       cd $ME
-       $MAKEPROG
-       echo ""
-        echo "Done!"
-else
-       echo ""
-       echo -e "To build your server with these settings, please type '\033[1;32m$MAKEPROG\033[0m' now."
-fi
-
-
-echo ""
-echo -e "*** \033[1;32mRemember to edit your configuration files!!!\033[0m ***"
-echo ""
+sub is_dir {
+  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$/)
+    {
+      $modlist[$i++] = $1;
+    }
+  }
+  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");
+  print FILEHANDLE <<EOF;
+/* Auto generated by configure, do not modify! */
+#define SYSLOG_FACILITY LOG_DAEMON
+#define SYSLOG_LEVEL LOG_NOTICE
+#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 MAXCHANS $config{MAX_CHANNE}
+#define MAXMODES $config{MAXI_MODES}
+#define OPTIMISATION $config{OPTIMITEMP}
+#define SYSTEM "$incos"
+#define MAXBUF 514
+EOF
+
+  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{USE_KQUEUE} eq "y") {
+    print FILEHANDLE "#define USE_KQUEUE\n";
+  }
+  close(FILEHANDLE);
+
+  # Create a Modules List..
+  my $modules = "";
+  foreach $i (@modlist)
+  {
+    $modules .= "m_".$i.".so ";
+  }
+  chomp($modules);   # Remove Redundant whitespace..
+
+
+  # Write all .in files.
+  my $tmp = "";
+  my $file = "";
+  opendir(DIRHANDLE, $this);
+  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/\@MAKEPROG\@/$config{MAKEPROG}/;
+      $tmp =~ s/\@FLAGS\@/$config{FLAGS}/;
+      $tmp =~ s/\@LDLIBS\@/$config{LDLIBS}/;
+      $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/;
+
+      print "Writing \033[1;32m$file\033[0m\n";
+      open(FILEHANDLE, ">$file");
+      print FILEHANDLE $tmp;
+    }
+  }
+  closedir(DIRHANDLE);
+
+  # Make inspircd executable!
+  chmod 0744, 'inspircd';
+
+  # 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 = "";
+  foreach $i (@modlist)
+  {
+    $flags = getcompilerflags("src/modules/m_".$i.".cpp");
+    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
+  }
+}
+
+sub getcompilerflags {
+  my ($file) = @_;
+  open(FLAGS, $file);
+  while (<FLAGS>) {
+    if ($_ =~ /^\/\* \$CompileFlags: (.+) \*\/$/) {
+      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";
+  print ": \033[1;33m##\033[0m:: \033[1;33m####\033[0m: \033[1;33m##\033[0m: \033[1;33m##\033[0m:::..:: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:: \033[1;33m##\033[0m:: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m: \033[1;33m##\033[0m:::..:: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:\n";
+  print ": \033[1;33m##\033[0m:: \033[1;33m##\033[0m \033[1;33m##\033[0m \033[1;33m##\033[0m:. \033[1;33m######\033[0m:: \033[1;33m########\033[0m::: \033[1;33m##\033[0m:: \033[1;33m########\033[0m:: \033[1;33m##\033[0m::::::: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:\n";
+  print ": \033[1;33m##\033[0m:: \033[1;33m##\033[0m. \033[1;33m####\033[0m::..... \033[1;33m##\033[0m: \033[1;33m##\033[0m.....:::: \033[1;33m##\033[0m:: \033[1;33m##\033[0m.. \033[1;33m##\033[0m::: \033[1;33m##\033[0m::::::: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:\n";
+  print ": \033[1;33m##\033[0m:: \033[1;33m##\033[0m:. \033[1;33m###\033[0m:'\033[1;33m##\033[0m::: \033[1;33m##\033[0m: \033[1;33m##\033[0m::::::::: \033[1;33m##\033[0m:: \033[1;33m##\033[0m::. \033[1;33m##\033[0m:: \033[1;33m##\033[0m::: \033[1;33m##\033[0m: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:\n";
+  print "'\033[1;33m####\033[0m: \033[1;33m##\033[0m::. \033[1;33m##\033[0m:. \033[1;33m######\033[0m:: \033[1;33m##\033[0m::::::::'\033[1;33m####\033[0m: \033[1;33m##\033[0m:::. \033[1;33m##\033[0m:. \033[1;33m######\033[0m:: \033[1;33m########\033[0m::\n";
+  print "\033[0m\033[0m....::..::::..:::......:::..:::::::::....::..:::::..:::......:::........:::\n\n";
+}
+
+sub resolve_directory {
+       use File::Spec;
+       return File::Spec->rel2abs($_[0]);
+}
+
+sub yesno {
+       my ($flag,$prompt) = @_;
+       print "$prompt [\033[1;32m$config{$flag}\033[0m] -> ";
+       chomp($tmp = <STDIN>);
+       if ($tmp eq "") { $tmp = $config{$flag} }
+
+       if (($tmp eq "") || ($tmp =~ /^y/i)) {
+               $config{$flag} = "y";
+       } else {
+               $config{$flag} = "n";
+        }
+       return;
+}