-# echo -e "\033[1;37mtest\033[0;37m"
-
-echo "Configuring default values..."
-mkdir fdscount
-echo "#include <sys/types.h>" >> fdscount/fdcounter.c
-echo "#include <sys/socket.h>" >> fdscount/fdcounter.c
-echo "main()" >> fdscount/fdcounter.c
-echo "{" >> fdscount/fdcounter.c
-echo " int i;" >> fdscount/fdcounter.c
-echo " int s;" >> fdscount/fdcounter.c
-echo "" >> fdscount/fdcounter.c
-echo " for (i = 1; i <= 10000; i++)" >> fdscount/fdcounter.c
-echo " {" >> fdscount/fdcounter.c
-echo " s = socket(AF_INET, SOCK_STREAM, 0);" >> fdscount/fdcounter.c
-echo " if (s < 0)" >> fdscount/fdcounter.c
-echo " {" >> fdscount/fdcounter.c
-echo " printf(\"%i\", i + 2);" >> fdscount/fdcounter.c
-echo " exit(-1);" >> fdscount/fdcounter.c
-echo " }" >> fdscount/fdcounter.c
-echo " }" >> fdscount/fdcounter.c
-echo "}" >> fdscount/fdcounter.c
-
-echo "PROGS = fdcounter" >> fdscount/Makefile
-echo "OBJS = fdcounter.o" >> fdscount/Makefile
-echo "" >> fdscount/Makefile
-echo "CC = gcc" >> fdscount/Makefile
-echo "CXXFLAGS = -fPIC -frtti -O" >> fdscount/Makefile
-echo "" >> fdscount/Makefile
-echo "all : \$(PROGS)" >> fdscount/Makefile
-echo "" >> fdscount/Makefile
-echo "\$(PROGS): \$(OBJS)" >> fdscount/Makefile
-echo " \$(CXX) -rdynamic \$^ -o \$@" >> fdscount/Makefile
-echo "" >> fdscount/Makefile
-echo ".PHONY: clean" >> fdscount/Makefile
-echo "clean:" >> fdscount/Makefile
-echo " rm -f *.o core" >> fdscount/Makefile
-
-cd fdscount
-make
-cd ..
-
-ME=`pwd`
-PERL=`which perl`
-CONFIG_DIR=$ME/conf
-MODULE_DIR=$ME/modules
-MAX_CLIENT=`fdscount/fdcounter`
-NICK_LENGT=32
-CHAN_LENGT=64
-MAX_CHANNE=20
-MAXI_MODES=20
-
-rm -rf fdscount
-
-if [ "$PERL" = "" ] ; then
- echo "You require perl to run this program."
- exit;
-fi
-
-
-OSNAME=`(uname -s) 2>/dev/null` || OSNAME="unknown"
-
-c=""
-n=""
-if [ "`eval echo -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 = $ENV{PWD}; # PWD, Regardless.
+@modlist = (); # Declare for Module List..
+%config = (); # Initiate Configuration Hash..
+$config{ME} = $ENV{PWD}; # Present Working Directory
+$config{CONFIG_DIR} = $ENV{PWD}."/conf"; # Configuration Directory
+$config{MODULE_DIR} = $ENV{PWD}."/modules"; # Modules Directory
+$config{BINARY_DIR} = $ENV{PWD}."/bin"; # Binary 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.
+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..
+getosflags();
+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";
+ writefiles();
+ print "Complete.\n";
+ exit;
+ }
+}
+
+getcache(); # Load the config.cache file.
+
+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};
+}
+
+# Perform the strlcpy() test..
+open(STRLCPY, ">.test.cpp");
+print STRLCPY "#include <string.h>
+#include <stdio.h>
+int main() { char a[10]; char b[10]; strlcpy(a,b,10); printf(\"%d\\n\",9); }\n";
+close(STRLCPY);
+
+# Build the Binary..
+system("g++ -o .test .test.cpp 2>&1");
+
+# Was the build succesful?
+if (-e ".test") {
+ $config{HAS_STRLCPY} = "true";
+ system("rm -f .test .test.cpp");
+}
+
+################################################################################
+# 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");
+
+# 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;32m0\033[0m] -> ";
+chomp($var = <STDIN>);
+if ($var == 1) {
+ $config{OPTIMITEMP} = 1;
+ $config{OPTIMISATI} = "-O";
+} elsif ($var == 2) {
+ $config{OPTIMITEMP} = 2;
+ $config{OPTIMISATI} = "-O2";
+} elsif ($var == 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 (substr($var,0,1) ne "/")
+ {
+ # Assume relative Path was given.. fill in the rest.
+ $var = $this . "/$var";
+ }
+ if (substr($var, 0, 1) eq "~") {
+ # Convert it to a full path..
+
+ $var = $this . substr(1,0);
+ }
+ if (! -e $var) {
+ print "$var does not exist. Create it?\n[\033[1;32my\033[0m] ";
+ chomp($tmp = <STDIN>);
+ if (($tmp eq "") || ($tmp = "y")) {
+ # 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 -g";
+ $config{MAKEPROG} = "gmake";
+ } else {
+ $config{LDLIBS} = "-ldl";
+ $config{FLAGS} = "-fPIC -frtti $OPTIMISATI -Woverloaded-virtual -g";
+ $config{MAKEPROG} = "make";
+ }
+}
+
+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);