From 43ea75c0b3b64f1ebde2c7048a64d1f5bb3242fe Mon Sep 17 00:00:00 2001 From: danieldg Date: Tue, 20 Oct 2009 01:17:04 +0000 Subject: Move ugly .*.inc files into make/template/ where they can be more easily found git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11929 e03df62e-2008-0410-955e-edbf42e46eb7 --- .Makefile.inc | 228 --------------- .gdbargs | 3 - .inspircd.inc | 590 --------------------------------------- .org.inspircd.plist.inc | 27 -- configure | 114 ++++---- make/template/inspircd | 590 +++++++++++++++++++++++++++++++++++++++ make/template/main.mk | 228 +++++++++++++++ make/template/org.inspircd.plist | 27 ++ src/configreader.cpp | 2 +- tools/gdbargs | 3 + 10 files changed, 902 insertions(+), 910 deletions(-) delete mode 100644 .Makefile.inc delete mode 100644 .gdbargs delete mode 100644 .inspircd.inc delete mode 100644 .org.inspircd.plist.inc create mode 100644 make/template/inspircd create mode 100644 make/template/main.mk create mode 100644 make/template/org.inspircd.plist create mode 100644 tools/gdbargs diff --git a/.Makefile.inc b/.Makefile.inc deleted file mode 100644 index e5c1c940e..000000000 --- a/.Makefile.inc +++ /dev/null @@ -1,228 +0,0 @@ -# InspIRCd Main Makefile -# -# (C) InspIRCd Development Team, 2002-2009 -# This file is automagically generated by configure, from -# .Makefile.inc. Any changes make will go away! -# Please do not edit unless you know what you're doing. -# - -CC = @CC@ -SYSTEM = @SYSTEM@ -BUILDPATH = @BUILD_DIR@ -SOCKETENGINE = @SOCKETENGINE@ -CXXFLAGS = -O1 -pipe -fPIC -DPIC -LDLIBS = -pthread -lstdc++ -LDFLAGS = -SHARED = -shared -rdynamic -CORELDFLAGS = -rdynamic -L. $(LDFLAGS) -PICLDFLAGS = -fPIC -shared -rdynamic $(LDFLAGS) -BASE = "@BASE_DIR@" -CONPATH = "@CONFIG_DIR@" -MODPATH = "@MODULE_DIR@" -BINPATH = "@BINARY_DIR@" -LAUNCHDPATH = "/System/Library/LaunchDaemons" -INSTMODE = 0755 - -@IFEQ $(CC) icc - CXXFLAGS += -Wshadow -@ELSE - CXXFLAGS += -pedantic -Woverloaded-virtual -Wshadow -Wformat=2 -Wmissing-format-attribute -Wall -@ENDIF - - -@IFEQ $(SYSTEM) linux - LDLIBS += -ldl -@ELSIFEQ $(SYSTEM) solaris - LDLIBS += -lsocket -lnsl -lrt -lresolv -@ELSIFEQ $(SYSTEM) sunos - LDLIBS += -lsocket -lnsl -lrt -lresolv -@ELSIFEQ $(SYSTEM) darwin - CXXFLAGS += -DDARWIN -frtti - LDLIBS += -ldl - SHARED = -bundle -twolevel_namespace -undefined dynamic_lookup - CORELDFLAGS = -dynamic -bind_at_load -L. -@ELSIFEQ $(SYSTEM) interix - CXXFLAGS += -D_ALL_SOURCE -I/usr/local/include -@ENDIF - -@IFDEF D - CXXFLAGS += -g3 -Werror - HEADER = debug-header -@ELSE - CXXFLAGS += -g1 - HEADER = std-header -@ENDIF -FOOTER = finishmessage - -CXXFLAGS += -Iinclude - -@GNU_ONLY MAKEFLAGS += --no-print-directory - -@GNU_ONLY SOURCEPATH = $(shell /bin/pwd) -@BSD_ONLY SOURCEPATH != /bin/pwd - -@IFDEF V - RUNCC = $(CC) - VERBOSE = -v -@ELSE - @GNU_ONLY MAKEFLAGS += --silent - @BSD_ONLY MAKE += -s - RUNCC = perl $(SOURCEPATH)/make/run-cc.pl $(CC) -@ENDIF - -@DO_EXPORT RUNCC CXXFLAGS CC LDLIBS PICLDFLAGS VERBOSE SOCKETENGINE CORELDFLAGS -@DO_EXPORT BASE CONPATH MODPATH BINPATH SOURCEPATH BUILDPATH - -# Default target -TARGET = all - -@IFDEF M - HEADER = mod-header - FOOTER = mod-footer - @BSD_ONLY TARGET = modules/${M:S/.so$//}.so - @GNU_ONLY TARGET = modules/$(M:.so=).so -@ENDIF - -@IFDEF T - HEADER = - FOOTER = target - TARGET = $(T) -@ENDIF - -all: $(FOOTER) - -target: $(HEADER) - $(MAKEENV) perl make/calcdep.pl - $(MAKEENV) $(MAKE) -C $(BUILDPATH) -f real.mk $(TARGET) - -debug: - @${MAKE} D=1 all - -debug-header: - @echo "*************************************" - @echo "* BUILDING WITH DEBUG SYMBOLS *" - @echo "* *" - @echo "* This will take a *long* time. *" - @echo "* Please be aware that this build *" - @echo "* will consume a very large amount *" - @echo "* of disk space (150MB+), and can *" - @echo "* run slower. Use the debug build *" - @echo "* for module development or if you *" - @echo "* are experiencing problems. *" - @echo "* *" - @echo "*************************************" - -mod-header: - @echo 'Building single module:' - -mod-footer: target - @echo 'To install, copy $(BUILDPATH)/$(TARGET) to $(MODPATH)' - @echo 'Or, run "make install"' - -std-header: - @echo "*************************************" - @echo "* BUILDING INSPIRCD *" - @echo "* *" - @echo "* This will take a *long* time. *" - @echo "* Why not read our wiki at *" - @echo "* http://wiki.inspircd.org *" - @echo "* while you wait for make to run? *" - @echo "*************************************" - -finishmessage: target - @echo "" - @echo "*************************************" - @echo "* BUILD COMPLETE! *" - @echo "* *" - @echo "* To install InspIRCd, type: *" - @echo "* make install *" - @echo "*************************************" - -install: target@EXTRA_DIR@ - @-install -d -m $(INSTMODE) $(BASE) - @-install -d -m $(INSTMODE) $(BASE)/data - @-install -d -m $(INSTMODE) $(BASE)/logs - @-install -d -m $(INSTMODE) $(BINPATH) - @-install -d -m $(INSTMODE) $(CONPATH) - @-install -d -m $(INSTMODE) $(MODPATH) - -install -m $(INSTMODE) $(BUILDPATH)/modules/*.so $(MODPATH) - -install -m $(INSTMODE) $(BUILDPATH)/bin/inspircd $(BINPATH) - -install -m $(INSTMODE) @STARTSCRIPT@ $(@DESTINATION@) 2>/dev/null - @$(MAKEENV) make/install-extras.pl install - @echo "" - @echo "*************************************" - @echo "* INSTALL COMPLETE! *" - @echo "* *" - @echo "* It is safe to ignore any messages *" - @echo "* related to copying of conf files. *" - @echo "* *" - @echo "* REMEMBER TO EDIT YOUR CONFIG FILE *" - @echo "*************************************" - -@GNU_ONLY RCS_FILES = $(wildcard .git/index .svn/entries) -@GNU_ONLY GNUmakefile: .Makefile.inc configure .config.cache $(RCS_FILES) -@GNU_ONLY ./configure -update - -clean: - @echo Cleaning... - @-rm -f src/inspircd src/modes/modeclasses.a include/inspircd_se_config.h - @-rm -f src/*.so src/modules/*.so src/commands/*.so - @-rm -f src/*.o src/*/*.o src/modules/*/*.o - @-rm -f src/.*.d src/*/.*.d src/modules/*/.*.d - @-rm -f $(BUILDPATH)/bin/inspircd $(BUILDPATH)/include $(BUILDPATH)/real.mk - @-rm -rf $(BUILDPATH)/obj $(BUILDPATH)/modules - @-rmdir $(BUILDPATH)/bin 2>/dev/null - @-rmdir $(BUILDPATH) 2>/dev/null - @echo Completed. - -deinstall: - -rm $(BINPATH)/inspircd - -rm $(MODPATH)/*.so - @make/install-extras.pl deinstall - -squeakyclean: distclean - -launchd_dir: - @-install -d -m $(INSTMODE) ${LAUNCHDPATH} - -configureclean: - rm -f .config.cache - rm -f src/modules/Makefile - rm -f src/commands/Makefile - rm -f src/Makefile - -rm -f Makefile - rm -f BSDmakefile - rm -f GNUmakefile - rm -f include/inspircd_config.h - rm -f include/inspircd_version.h - -distclean: clean configureclean - -help: - @echo 'InspIRCd Makefile' - @echo '' - @echo 'Use: ${MAKE} [flags] [targets]' - @echo '' - @echo 'Flags:' - @echo ' V=1 Show the full command being executed instead of "BUILD: dns.cpp"' - @echo ' D=1 Enable debug build, for module development or crash tracing' - @echo ' -j Run a parallel build using N jobs' - @echo '' - @echo 'User targets:' - @echo ' all Complete build of InspIRCd, without installing' - @echo ' install Build and install InspIRCd to the directory chosen in ./configure' - @echo ' Currently installs to ${BASE}' - @echo ' debug Compile a debug build. Equivalent to "make D=1 all"' - @echo '' - @echo ' M=m_foo Builds a single module (cmd_foo also works here)' - @echo ' T=target Builds a user-specified target, such as "inspircd" or "modules"' - @echo ' Other targets are specified by their path in the build directory' - @echo ' Multiple targets may be separated by a space' - @echo '' - @echo ' clean Cleans object files produced by the compile' - @echo ' distclean Cleans all files produced by compile and ./configure' - @echo ' Note: this includes the Makefile' - @echo ' deinstall Removes the files created by "make install"' - @echo - -.PHONY: all target debug debug-header mod-header mod-footer std-header finishmessage install clean deinstall squeakyclean launchd_dir configureclean help diff --git a/.gdbargs b/.gdbargs deleted file mode 100644 index 244c1b29c..000000000 --- a/.gdbargs +++ /dev/null @@ -1,3 +0,0 @@ -handle SIGPIPE pass nostop noprint -handle SIGHUP pass nostop noprint -run diff --git a/.inspircd.inc b/.inspircd.inc deleted file mode 100644 index 05cbe0ea0..000000000 --- a/.inspircd.inc +++ /dev/null @@ -1,590 +0,0 @@ -#!/usr/bin/perl -# +------------------------------------+ -# | Inspire Internet Relay Chat Daemon | -# +------------------------------------+ -# -# InspIRCd: (C) 2002-2009 InspIRCd Development Team -# See: http://wiki.inspircd.org/Credits -# -# This program is free but copyrighted software; see -# the file COPYING for details. -# -# --------------------------------------------------- -# -use strict; -use POSIX; -use Fcntl; - -my $basepath = "@BASE_DIR@"; -my $confpath = "@CONFIG_DIR@/"; -my $binpath = "@BINARY_DIR@"; -my $runpath = "@BASE_DIR@"; -my $valgrindlogpath = "$basepath/valgrindlogs"; -my $executable = "@EXECUTABLE@"; -my $version = "@VERSION@"; - -our($pid,$pidfile); -# Lets see what they want to do.. Set the variable (Cause i'm a lazy coder) -my $arg = shift(@ARGV); -my $conf; -for my $a (@ARGV) -{ - if ($a =~ m/^--config=(.*)$/) - { - $conf = $1; - last; - } -} -if (!defined $conf) { - $conf = $confpath . "inspircd.conf"; - push @ARGV, '--config='.$conf; -} - -getpidfile($conf); - -# System for naming script command subs: -# cmd_ - Normal command for use by users. -# dev_ - Developer commands. -# hid_ - Hidden commands (ie Cheese-Sandwich) -# Ideally command subs shouldn't return. - -my $subname = $arg; -$subname =~ s/-/_/g; -my $sub = main->can("cmd_$subname") || main->can("dev_$subname") || main->can("hid_$subname"); -if (!defined($sub)) -{ - print STDERR "Invalid command or none given.\n"; - cmd_help(); - exit 1; -} -else -{ - $sub->(@ARGV); - exit 0; -} - -sub cmd_help() -{ - my @subs = grep { $_ =~ m/^(cmd|dev)_/ && defined(main->can($_)) } keys(%::); - my @cmds = grep /^cmd_/, @subs; - my @devs = grep /^dev_/, @subs; - local $_; - $_ =~ s/^(cmd|dev)_// foreach (@cmds, @devs); - $_ =~ s/_/-/g foreach (@cmds, @devs); - print STDERR "Usage: ./inspircd (" . join("|", @cmds) . ")\n"; - print STDERR "Developer arguments: (" . join("|", @devs) . ")\n"; - exit 0; -} - -sub cmd_status() -{ - if (getstatus() == 1) { - my $pid = getprocessid(); - print "InspIRCd is running (PID: $pid)\n"; - exit(); - } else { - print "InspIRCd is not running. (Or PID File not found)\n"; - exit(); - } -} - -sub cmd_rehash() -{ - if (getstatus() == 1) { - my $pid = getprocessid(); - system("kill -HUP $pid >/dev/null 2>&1"); - print "InspIRCd rehashed (pid: $pid).\n"; - exit(); - } else { - print "InspIRCd is not running. (Or PID File not found)\n"; - exit(); - } -} - -sub cmd_cron() -{ - if (getstatus() == 0) { goto &cmd_start(); } - exit(); -} - -sub cmd_version() -{ - print "InspIRCd version: $version\n"; - exit(); -} - -sub cmd_restart(@) -{ - cmd_stop(); - unlink($pidfile) if (-e $pidfile); - goto &cmd_start; -} - -sub hid_cheese_sandwich() -{ - print "Creating Cheese Sandwich..\n"; - print "Done.\n"; - exit(); -} - -sub cmd_start(@) -{ - # Check to see its not 'running' already. - if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } - # If we are still alive here.. Try starting the IRCd.. - chdir $runpath; - print "$binpath/$executable doesn't exist\n" and return 0 unless(-e "$binpath/$executable"); - print "$binpath/$executable is not executable\n" and return 0 unless(-f "$binpath/$executable" && -x "$binpath/$executable"); - - exec "$binpath/$executable", @_; - die "Failed to start IRCd: $!\n"; -} - -sub dev_debug(@) -{ - # Check to see its not 'running' already. - if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } - - chdir $runpath; - print "$binpath/$executable doesn't exist\n" and return 0 unless(-e "$binpath/$executable"); - print "$binpath/$executable is not executable\n" and return 0 unless(-f "$binpath/$executable" && -x "$binpath/$executable"); - - # Check we have gdb - checkgdb(); - - # If we are still alive here.. Try starting the IRCd.. - exec 'gdb', "--command=$basepath/.gdbargs", '--args', "$binpath/$executable", qw(-nofork -debug), @_; - die "Failed to start GDB: $!\n"; -} - -sub dev_screendebug(@) -{ - # Check to see its not 'running' already. - if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } - - chdir $runpath; - print "$binpath/$executable doesn't exist\n" and return 0 unless(-e "$binpath/$executable"); - - #Check we have gdb - checkgdb(); - checkscreen(); - - # If we are still alive here.. Try starting the IRCd.. - print "Starting InspIRCd in `screen`, type `screen -r` when the ircd crashes to view the gdb output and get a backtrace.\n"; - print "Once you're inside the screen session press ^C + d to re-detach from the session\n"; - exec qw(screen -m -d gdb), "--comand=$basepath/.gdbargs", '-args', "$binpath/$executable", qw(-nofork -debug -nolog), @_; - die "Failed to start screen: $!\n"; -} - -sub dev_valdebug(@) -{ - # Check to see its not 'running' already. - if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } - - chdir $runpath; - print "$binpath/$executable doesn't exist\n" and return 0 unless(-e "$binpath/$executable"); - print "$binpath/$executable is not executable\n" and return 0 unless(-f "$binpath/$executable" && -x "$binpath/$executable"); - - # Check we have valgrind and gdb - checkvalgrind(); - checkgdb(); - - # If we are still alive here.. Try starting the IRCd.. - # May want to do something with these args at some point: --suppressions=.inspircd.sup --gen-suppressions=yes - # Could be useful when we want to stop it complaining about things we're sure aren't issues. - exec qw(valgrind -v --tool=memcheck --leak-check=yes --db-attach=yes --num-callers=10), "$binpath/$executable", qw(-nofork -debug -nolog), @_; - die "Failed to start valgrind: $!\n"; -} - -sub dev_valdebug_unattended(@) -{ - # NOTE: To make sure valgrind generates coredumps, set soft core limit in /etc/security/limits.conf to unlimited - # Check to see its not 'running' already. - if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } - - chdir $runpath; - print "$binpath/$executable doesn't exist\n" and return 0 unless(-e "$binpath/$executable"); - print "$binpath/$executable is not executable\n" and return 0 unless(-f "$binpath/$executable" && -x "$binpath/$executable"); - - # Check we have valgrind and gdb - checkvalgrind(); - checkgdb(); - - # If we are still alive here.. Try starting the IRCd.. - # - # NOTE: Saving the debug log (redirected stdout), while useful, is a potential security risk AND one hell of a spacehog. DO NOT SAVE THIS WHERE EVERYONE HAS ACCESS! - # Redirect stdout to /dev/null if you're worried about the security. - # - my $pid = fork; - if ($pid == 0) { - POSIX::setsid(); - -d $valgrindlogpath or mkdir $valgrindlogpath or die "Cannot create $valgrindlogpath: $!\n"; - -e "$binpath/valgrind.sup" or do { open my $f, '>', "$binpath/valgrind.sup"; }; - my $suffix = strftime("%Y%m%d-%H%M%S", localtime(time)) . ".$$"; - open STDIN, '<', '/dev/null' or die "Can't redirect STDIN to /dev/null: $!\n"; - sysopen STDOUT, "$valgrindlogpath/out.$suffix", O_WRONLY | O_CREAT | O_NOCTTY | O_APPEND, 0600 or die "Can't open $valgrindlogpath/out.$suffix: $!\n"; - sysopen STDERR, "$valgrindlogpath/valdebug.$suffix", O_WRONLY | O_CREAT | O_NOCTTY | O_APPEND, 0666 or die "Can't open $valgrindlogpath/valdebug.$suffix: $!\n"; - # May want to do something with these args at some point: --suppressions=.inspircd.sup --gen-suppressions=yes - # Could be useful when we want to stop it complaining about things we're sure aren't issues. - exec qw(valgrind -v --tool=memcheck --leak-check=full --show-reachable=yes --num-callers=15 --track-fds=yes), - "--suppressions=$binpath/valgrind.sup", qw(--gen-suppressions=all), - qw(--leak-resolution=med --time-stamp=yes --log-fd=2 --), - "$binpath/$executable", qw(-nofork -debug -nolog), @_; - die "Can't execute valgrind: $!\n"; - } -} - -sub dev_screenvaldebug(@) -{ - # Check to see its not 'running' already. - if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } - - chdir $runpath; - print "$binpath/$executable doesn't exist\n" and return 0 unless(-e "$binpath/$executable"); - print "$binpath/$executable is not executable\n" and return 0 unless(-f "$binpath/$executable" && -x "$binpath/$executable"); - - #Check we have gdb - checkvalgrind(); - checkgdb(); - checkscreen(); - - # If we are still alive here.. Try starting the IRCd.. - print "Starting InspIRCd in `screen`, type `screen -r` when the ircd crashes to view the valgrind and gdb output and get a backtrace.\n"; - print "Once you're inside the screen session press ^C + d to re-detach from the session\n"; - exec qw(screen -m -d valgrind -v --tool=memcheck --leak-check=yes --db-attach=yes --num-callers=10), "$binpath/$executable", qw(-nofork -debug -nolog), @_; - die "Failed to start screen: $!\n"; -} - -sub cmd_stop() -{ - if (getstatus() == 0) { print "InspIRCd is not running. (Or PID File not found)\n"; return 0; } - # Get to here, we have something to kill. - my $pid = getprocessid(); - print "Stopping InspIRCd (pid: $pid)...\n"; - my $maxwait = (`ps -o command $pid` =~ /valgrind/i) ? 90 : 15; - kill TERM => $pid or die "Cannot terminate IRCd: $!\n"; - for (1..$maxwait) { - sleep 1; - if (getstatus() == 0) { - print "InspIRCd Stopped.\n"; - return; - } - } - print "InspIRCd not dying quietly -- forcing kill\n"; - kill KILL => $pid; - return 0; -} - -### -# Generic Helper Functions. -### - -# GetPidfile Version 2 - Now With Include Support.. -# I beg for months for include support in insp, then.. -# when it is added, it comes around and BITES ME IN THE ASS, -# because i then have to code support into this script.. Evil. - -# Craig got bitten in the ass again -- -# in 1.1 beta the include file is manditory, therefore -# if we cant find it, default to %conf%/inspircd.pid. -# Note, this also contains a fix for when the pid file is -# defined, but defined in a comment (line starts with #) -# -- Brain - -my %filesparsed; - -sub getpidfile -{ - my ($file) = @_; - # Before we start, do we have a PID already? (Should never occur) - if ($pid ne "") { - return; - } - # Are We using a relative path? - if ($file !~ /^\//) { - # Convert it to a full path. - $file = $runpath .'/'. $file; - } - - # Have we checked this file before? - return if $filesparsed{$file}; - $filesparsed{$file} = 1; - - # Open the File.. - open INFILE, '<', $file or return; - # Grab entire file contents.. - my(@lines) = ; - # Close the file - close INFILE; - - # remove trailing spaces - chomp(@lines); - for my $i (@lines) { - # clean it up - $i =~ s/[^=]+=\s(.*)/\1/; - # Does this file have a pid? - if (($i =~ //i) && ($i !~ /^#/)) - { - # Set the PID file and return. - $pidfile = $1; - if (-f $pidfile) - { - return; - } - elsif (-f "$runpath/$pidfile") - { - $pidfile = "$runpath/$pidfile"; - return; - } - return; - } - } - - - # If we get here, NO PID FILE! -- Check for includes - for my $i (@lines) { - $i =~ s/[^=]+=\s(.*)/\1/; - if (($i =~ s/\//i) && ($i !~ /^#/)) - { - # Decend into that file, and check for PIDs.. (that sounds like an STD ;/) - getpidfile($1); - # Was a PID found? - if ($pidfile ne "") { - # Yes, Return. - return; - } - } - } - - # End of includes / No includes found. Using default. - $pidfile = $runpath . "/data/inspircd.pid"; -} - -sub getstatus { - my $pid = getprocessid(); - return 0 if $pid == 0; - return kill 0, $pid; -} - - -sub getprocessid { - my $pid; - open PIDFILE, "< $pidfile" or return 0; - while() - { - $pid = $_; - } - close PIDFILE; - return $pid; -} - -sub checkvalgrind -{ - unless(`valgrind --version`) - { - print "Couldn't start valgrind: $!\n"; - exit; - } -} - -sub checkgdb -{ - unless(`gdb --version`) - { - print "Couldn't start gdb: $!\n"; - exit; - } -} - -sub checkscreen -{ - unless(`screen --version`) - { - print "Couldn't start screen: $!\n"; - exit; - } -} - -sub checkxmllint -{ - open(FH, "xmllint|") or die "Couldn't start xmllint: $!\n"; -} - -sub cmd_checkconf() -{ - checkxmllint(); - validateconf($conf); - print "Config check complete\n"; - exit 0; -} - -my %filechecked; - -sub validateconf -{ - my ($file) = @_; - - # Are We using a relative path? - if ($file !~ /^\//) { - # Convert it to a full path.. - $file = $runpath . $file; - } - - # Have we checked this file before? - return if $filechecked{$file}; - $filechecked{$file} = 1; - - # Open the File.. - open INFILE, "< $file" or die "Unable to open file $file\n"; - # Grab entire file contents.. - my(@lines) = ; - # Close the file - close INFILE; - - # remove trailing spaces - chomp(@lines); - - my @newlines = (); - my @blanks = (); - my $conline; - - push @newlines, ""; -# push @newlines, ""; - push @newlines, ""; - - for my $i (@lines) - { - # remove trailing newlines - chomp($i); - - # convert tabs to spaces - $i =~ s/\t/ /g; - - # remove leading spaces - $i =~ s/^ *//; - - # remove comments - $i =~ s/^#.*//; - - # remove trailing #s - $i =~ s/(.*)#$/\1/; - - # remove trailing comments - my $line = ""; - my $quote = 0; - for (my $j = 0; $j < length($i); $j++) - { - if (substr($i,$j, 1) eq '"') { $quote = ($quote) ? 0 : 1; } elsif (substr($i,$j, 1) eq "#" && !$quote) { last; } - $line .= substr($i,$j, 1); - } - $i = $line; - - # remove trailing spaces - $i =~ s/ *$//; - - # setup incf for include check and clean it up, since this breaks parsing use local var - my $incf = $i; - $incf =~ s/[^=]+=\s(.*)/\1/; - - # include file? - if (($incf =~ s/\//i) && ($incf !~ /^#/)) - { - # yes, process it - validateconf($1); - } - - if ($i =~ /^<.*/ && $conline =~ /^<.*/) - { - push @newlines, $conline; - push @newlines, @blanks; - $conline = $i; - } - - if ($i =~ /^<.*>$/) - { - $i =~ s/(.*)>$/\1 \/>/; - push @newlines, $i; - } - elsif ($i =~ /.*>$/) - { - $conline .= " $i"; - $conline =~ s/(.*)>$/\1 \/>/; - push @blanks, ""; - push @newlines, $conline; - push @newlines, @blanks; - $conline = ""; - undef @blanks; - } - elsif ($i =~ /^<.*/) - { - $conline = $i; - } - elsif ($conline =~ /^<.*/ && $i) - { - $conline .= " $i"; - push @blanks, ""; - } - else - { - if ($conline) - { - push @blanks, $i; - } - else - { - push @newlines, $i; - } - } - } - if ($conline) - { - push @newlines, $conline; - push @newlines, @blanks; - } - - push @newlines, ""; - - my $tmpfile; - do - { - $tmpfile = tmpnam(); - } until sysopen(TF, $tmpfile, O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, 0700); - - for my $n (@newlines) - { - print TF "$n\n"; - } - close TF; - - my @result = `xmllint -noout $tmpfile 2>&1`; - chomp(@result); - - my $skip = 0; - for my $n (@result) - { - if ($skip) - { - $skip = 0; - next; - } - $n =~ s/$tmpfile\:\d*\: *//g; - if ($n =~ /.*config>.*/) - { - $n = ""; - $skip = 1; - } - - if ($n && !$skip) - { - if ($n =~ /line \d*/) - { - my $lineno = $n; - $lineno =~ s/.*line (\d*).*/\1/; - $lineno = $lineno-2; - $n =~ s/line (\d*)/line $lineno/; - } - print "$file : $n\n"; - } - } - unlink($tmpfile); -} diff --git a/.org.inspircd.plist.inc b/.org.inspircd.plist.inc deleted file mode 100644 index 3112d51b1..000000000 --- a/.org.inspircd.plist.inc +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Iterations - 3 - Label - org.inspircd - LowPriorityIO - - Nice - 1 - OnDemand - - Program - @BINARY_DIR@/inspircd - ProgramArguments - - inspircd - -nofork - - ServiceIPC - - UserName - ircdaemon - - diff --git a/configure b/configure index 41b0cd0ee..06e1952e8 100755 --- a/configure +++ b/configure @@ -1044,74 +1044,66 @@ EOF # but right now we only parse .inspircd.inc to form './inspircd' prepare_dynamic_makefile(); - print "Writing \e[1;32mMakefiles\e[0m\n"; + my @dotfiles = qw(main.mk inspircd); + push @dotfiles, 'org.inspircd.plist' if $config{OSNAME} eq 'darwin'; - opendir(DIRHANDLE, $this); - - foreach my $name (sort readdir(DIRHANDLE)) { - if ($name =~ /^\.(.+)\.inc$/) { - $file = $1; - - # Bug #353, omit this on non-darwin - next if (($config{OSNAME} !~ /darwin/) && ($file eq "org.inspircd.plist")); + foreach my $file (@dotfiles) { + open(FILEHANDLE, "make/template/$file") or die "Can't open make/template/$file: $!"; + $_ = join '', ; + close(FILEHANDLE); - # All .name.inc files need parsing! - open(FILEHANDLE, ".$file.inc") or die ("Can't open .$file.inc"); - $_ = join '', ; - close(FILEHANDLE); + $config{BUILD_DIR} ||= resolve_directory($config{ME}."/build"); + for my $var (qw( + CC SYSTEM BASE_DIR CONFIG_DIR MODULE_DIR BINARY_DIR BUILD_DIR + STARTSCRIPT DESTINATION EXTRA_DIR SOCKETENGINE + )) { + s/\@$var\@/$config{$var}/g; + } + s/\@EXECUTABLE\@/$exe/ if defined $exe; + s/\@VERSION\@/$version/ if defined $version; + + if ($file eq 'main.mk') { + print "Writing \e[1;32mGNUmakefile\e[0m ...\n"; + + my $mk_tmp = $_; + s/\@IFDEF (\S+)/ifdef $1/g; + s/\@IFNDEF (\S+)/ifndef $1/g; + s/\@IFEQ (\S+) (\S+)/ifeq ($1,$2)/g; + s/\@ELSIFEQ (\S+) (\S+)/else ifeq ($1,$2)/g; + s/\@ELSE/else/g; + s/\@ENDIF/endif/g; + s/ *\@BSD_ONLY .*\n//g; + s/\@GNU_ONLY //g; + s/\@DO_EXPORT (.*)/export $1/g; + open MKF, '>GNUmakefile' or die "Can't write to GNUmakefile: $!"; + print MKF $_; + close MKF; + + print "Writing \e[1;32mBSDmakefile\e[0m ...\n"; + $_ = $mk_tmp; + s/\@IFDEF (\S+)/.if defined($1)/g; + s/\@IFNDEF (\S+)/.if !defined($1)/g; + s/\@IFEQ (\S+) (\S+)/.if $1 == $2/g; + s/\@ELSIFEQ (\S+) (\S+)/.elif $1 == $2/g; + s/\@ELSE/.else/g; + s/\@ENDIF/.endif/g; + s/\@BSD_ONLY //g; + s/ *\@GNU_ONLY .*\n//g; + $mk_tmp = $_; + $mk_tmp =~ s#\@DO_EXPORT (.*)#"MAKEENV += ".join ' ', map "$_='\${$_}'", split /\s/, $1#eg; + open MKF, '>BSDmakefile' or die "Can't write to BSDmakefile: $!"; + print MKF $mk_tmp; + close MKF; + } else { print "Writing \e[1;32m$file\e[0m ...\n"; - - $config{BUILD_DIR} ||= resolve_directory($config{ME}."/build"); - - for my $var (qw( - CC SYSTEM BASE_DIR CONFIG_DIR MODULE_DIR BINARY_DIR BUILD_DIR - STARTSCRIPT DESTINATION EXTRA_DIR SOCKETENGINE - )) { - s/\@$var\@/$config{$var}/g; - } - s/\@EXECUTABLE\@/$exe/ if defined $exe; - s/\@VERSION\@/$version/ if defined $version; - - if ($file eq 'Makefile') { - my $mk_tmp = $_; - s/\@IFDEF (\S+)/ifdef $1/g; - s/\@IFNDEF (\S+)/ifndef $1/g; - s/\@IFEQ (\S+) (\S+)/ifeq ($1,$2)/g; - s/\@ELSIFEQ (\S+) (\S+)/else ifeq ($1,$2)/g; - s/\@ELSE/else/g; - s/\@ENDIF/endif/g; - s/ *\@BSD_ONLY .*\n//g; - s/\@GNU_ONLY //g; - s/\@DO_EXPORT (.*)/export $1/g; - open MKF, '>GNUmakefile' or die "Can't write to GNUmakefile: $!"; - print MKF $_; - close MKF; - $_ = $mk_tmp; - s/\@IFDEF (\S+)/.if defined($1)/g; - s/\@IFNDEF (\S+)/.if !defined($1)/g; - s/\@IFEQ (\S+) (\S+)/.if $1 == $2/g; - s/\@ELSIFEQ (\S+) (\S+)/.elif $1 == $2/g; - s/\@ELSE/.else/g; - s/\@ENDIF/.endif/g; - s/\@BSD_ONLY //g; - s/ *\@GNU_ONLY .*\n//g; - $mk_tmp = $_; - $mk_tmp =~ s#\@DO_EXPORT (.*)#"MAKEENV += ".join ' ', map "$_='\${$_}'", split /\s/, $1#eg; - open MKF, '>BSDmakefile' or die "Can't write to BSDmakefile: $!"; - print MKF $mk_tmp; - close MKF; - } else { - open(FILEHANDLE, ">$file") or die("Can't write to $file: $!\n"); - print FILEHANDLE $_; - close(FILEHANDLE); - } + open(FILEHANDLE, ">$file") or die("Can't write to $file: $!\n"); + print FILEHANDLE $_; + close(FILEHANDLE); } } - closedir(DIRHANDLE); - # Make inspircd executable! - chmod 0744, 'inspircd'; + chmod 0755, 'inspircd'; } sub depcheck diff --git a/make/template/inspircd b/make/template/inspircd new file mode 100644 index 000000000..05cbe0ea0 --- /dev/null +++ b/make/template/inspircd @@ -0,0 +1,590 @@ +#!/usr/bin/perl +# +------------------------------------+ +# | Inspire Internet Relay Chat Daemon | +# +------------------------------------+ +# +# InspIRCd: (C) 2002-2009 InspIRCd Development Team +# See: http://wiki.inspircd.org/Credits +# +# This program is free but copyrighted software; see +# the file COPYING for details. +# +# --------------------------------------------------- +# +use strict; +use POSIX; +use Fcntl; + +my $basepath = "@BASE_DIR@"; +my $confpath = "@CONFIG_DIR@/"; +my $binpath = "@BINARY_DIR@"; +my $runpath = "@BASE_DIR@"; +my $valgrindlogpath = "$basepath/valgrindlogs"; +my $executable = "@EXECUTABLE@"; +my $version = "@VERSION@"; + +our($pid,$pidfile); +# Lets see what they want to do.. Set the variable (Cause i'm a lazy coder) +my $arg = shift(@ARGV); +my $conf; +for my $a (@ARGV) +{ + if ($a =~ m/^--config=(.*)$/) + { + $conf = $1; + last; + } +} +if (!defined $conf) { + $conf = $confpath . "inspircd.conf"; + push @ARGV, '--config='.$conf; +} + +getpidfile($conf); + +# System for naming script command subs: +# cmd_ - Normal command for use by users. +# dev_ - Developer commands. +# hid_ - Hidden commands (ie Cheese-Sandwich) +# Ideally command subs shouldn't return. + +my $subname = $arg; +$subname =~ s/-/_/g; +my $sub = main->can("cmd_$subname") || main->can("dev_$subname") || main->can("hid_$subname"); +if (!defined($sub)) +{ + print STDERR "Invalid command or none given.\n"; + cmd_help(); + exit 1; +} +else +{ + $sub->(@ARGV); + exit 0; +} + +sub cmd_help() +{ + my @subs = grep { $_ =~ m/^(cmd|dev)_/ && defined(main->can($_)) } keys(%::); + my @cmds = grep /^cmd_/, @subs; + my @devs = grep /^dev_/, @subs; + local $_; + $_ =~ s/^(cmd|dev)_// foreach (@cmds, @devs); + $_ =~ s/_/-/g foreach (@cmds, @devs); + print STDERR "Usage: ./inspircd (" . join("|", @cmds) . ")\n"; + print STDERR "Developer arguments: (" . join("|", @devs) . ")\n"; + exit 0; +} + +sub cmd_status() +{ + if (getstatus() == 1) { + my $pid = getprocessid(); + print "InspIRCd is running (PID: $pid)\n"; + exit(); + } else { + print "InspIRCd is not running. (Or PID File not found)\n"; + exit(); + } +} + +sub cmd_rehash() +{ + if (getstatus() == 1) { + my $pid = getprocessid(); + system("kill -HUP $pid >/dev/null 2>&1"); + print "InspIRCd rehashed (pid: $pid).\n"; + exit(); + } else { + print "InspIRCd is not running. (Or PID File not found)\n"; + exit(); + } +} + +sub cmd_cron() +{ + if (getstatus() == 0) { goto &cmd_start(); } + exit(); +} + +sub cmd_version() +{ + print "InspIRCd version: $version\n"; + exit(); +} + +sub cmd_restart(@) +{ + cmd_stop(); + unlink($pidfile) if (-e $pidfile); + goto &cmd_start; +} + +sub hid_cheese_sandwich() +{ + print "Creating Cheese Sandwich..\n"; + print "Done.\n"; + exit(); +} + +sub cmd_start(@) +{ + # Check to see its not 'running' already. + if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } + # If we are still alive here.. Try starting the IRCd.. + chdir $runpath; + print "$binpath/$executable doesn't exist\n" and return 0 unless(-e "$binpath/$executable"); + print "$binpath/$executable is not executable\n" and return 0 unless(-f "$binpath/$executable" && -x "$binpath/$executable"); + + exec "$binpath/$executable", @_; + die "Failed to start IRCd: $!\n"; +} + +sub dev_debug(@) +{ + # Check to see its not 'running' already. + if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } + + chdir $runpath; + print "$binpath/$executable doesn't exist\n" and return 0 unless(-e "$binpath/$executable"); + print "$binpath/$executable is not executable\n" and return 0 unless(-f "$binpath/$executable" && -x "$binpath/$executable"); + + # Check we have gdb + checkgdb(); + + # If we are still alive here.. Try starting the IRCd.. + exec 'gdb', "--command=$basepath/.gdbargs", '--args', "$binpath/$executable", qw(-nofork -debug), @_; + die "Failed to start GDB: $!\n"; +} + +sub dev_screendebug(@) +{ + # Check to see its not 'running' already. + if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } + + chdir $runpath; + print "$binpath/$executable doesn't exist\n" and return 0 unless(-e "$binpath/$executable"); + + #Check we have gdb + checkgdb(); + checkscreen(); + + # If we are still alive here.. Try starting the IRCd.. + print "Starting InspIRCd in `screen`, type `screen -r` when the ircd crashes to view the gdb output and get a backtrace.\n"; + print "Once you're inside the screen session press ^C + d to re-detach from the session\n"; + exec qw(screen -m -d gdb), "--comand=$basepath/.gdbargs", '-args', "$binpath/$executable", qw(-nofork -debug -nolog), @_; + die "Failed to start screen: $!\n"; +} + +sub dev_valdebug(@) +{ + # Check to see its not 'running' already. + if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } + + chdir $runpath; + print "$binpath/$executable doesn't exist\n" and return 0 unless(-e "$binpath/$executable"); + print "$binpath/$executable is not executable\n" and return 0 unless(-f "$binpath/$executable" && -x "$binpath/$executable"); + + # Check we have valgrind and gdb + checkvalgrind(); + checkgdb(); + + # If we are still alive here.. Try starting the IRCd.. + # May want to do something with these args at some point: --suppressions=.inspircd.sup --gen-suppressions=yes + # Could be useful when we want to stop it complaining about things we're sure aren't issues. + exec qw(valgrind -v --tool=memcheck --leak-check=yes --db-attach=yes --num-callers=10), "$binpath/$executable", qw(-nofork -debug -nolog), @_; + die "Failed to start valgrind: $!\n"; +} + +sub dev_valdebug_unattended(@) +{ + # NOTE: To make sure valgrind generates coredumps, set soft core limit in /etc/security/limits.conf to unlimited + # Check to see its not 'running' already. + if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } + + chdir $runpath; + print "$binpath/$executable doesn't exist\n" and return 0 unless(-e "$binpath/$executable"); + print "$binpath/$executable is not executable\n" and return 0 unless(-f "$binpath/$executable" && -x "$binpath/$executable"); + + # Check we have valgrind and gdb + checkvalgrind(); + checkgdb(); + + # If we are still alive here.. Try starting the IRCd.. + # + # NOTE: Saving the debug log (redirected stdout), while useful, is a potential security risk AND one hell of a spacehog. DO NOT SAVE THIS WHERE EVERYONE HAS ACCESS! + # Redirect stdout to /dev/null if you're worried about the security. + # + my $pid = fork; + if ($pid == 0) { + POSIX::setsid(); + -d $valgrindlogpath or mkdir $valgrindlogpath or die "Cannot create $valgrindlogpath: $!\n"; + -e "$binpath/valgrind.sup" or do { open my $f, '>', "$binpath/valgrind.sup"; }; + my $suffix = strftime("%Y%m%d-%H%M%S", localtime(time)) . ".$$"; + open STDIN, '<', '/dev/null' or die "Can't redirect STDIN to /dev/null: $!\n"; + sysopen STDOUT, "$valgrindlogpath/out.$suffix", O_WRONLY | O_CREAT | O_NOCTTY | O_APPEND, 0600 or die "Can't open $valgrindlogpath/out.$suffix: $!\n"; + sysopen STDERR, "$valgrindlogpath/valdebug.$suffix", O_WRONLY | O_CREAT | O_NOCTTY | O_APPEND, 0666 or die "Can't open $valgrindlogpath/valdebug.$suffix: $!\n"; + # May want to do something with these args at some point: --suppressions=.inspircd.sup --gen-suppressions=yes + # Could be useful when we want to stop it complaining about things we're sure aren't issues. + exec qw(valgrind -v --tool=memcheck --leak-check=full --show-reachable=yes --num-callers=15 --track-fds=yes), + "--suppressions=$binpath/valgrind.sup", qw(--gen-suppressions=all), + qw(--leak-resolution=med --time-stamp=yes --log-fd=2 --), + "$binpath/$executable", qw(-nofork -debug -nolog), @_; + die "Can't execute valgrind: $!\n"; + } +} + +sub dev_screenvaldebug(@) +{ + # Check to see its not 'running' already. + if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } + + chdir $runpath; + print "$binpath/$executable doesn't exist\n" and return 0 unless(-e "$binpath/$executable"); + print "$binpath/$executable is not executable\n" and return 0 unless(-f "$binpath/$executable" && -x "$binpath/$executable"); + + #Check we have gdb + checkvalgrind(); + checkgdb(); + checkscreen(); + + # If we are still alive here.. Try starting the IRCd.. + print "Starting InspIRCd in `screen`, type `screen -r` when the ircd crashes to view the valgrind and gdb output and get a backtrace.\n"; + print "Once you're inside the screen session press ^C + d to re-detach from the session\n"; + exec qw(screen -m -d valgrind -v --tool=memcheck --leak-check=yes --db-attach=yes --num-callers=10), "$binpath/$executable", qw(-nofork -debug -nolog), @_; + die "Failed to start screen: $!\n"; +} + +sub cmd_stop() +{ + if (getstatus() == 0) { print "InspIRCd is not running. (Or PID File not found)\n"; return 0; } + # Get to here, we have something to kill. + my $pid = getprocessid(); + print "Stopping InspIRCd (pid: $pid)...\n"; + my $maxwait = (`ps -o command $pid` =~ /valgrind/i) ? 90 : 15; + kill TERM => $pid or die "Cannot terminate IRCd: $!\n"; + for (1..$maxwait) { + sleep 1; + if (getstatus() == 0) { + print "InspIRCd Stopped.\n"; + return; + } + } + print "InspIRCd not dying quietly -- forcing kill\n"; + kill KILL => $pid; + return 0; +} + +### +# Generic Helper Functions. +### + +# GetPidfile Version 2 - Now With Include Support.. +# I beg for months for include support in insp, then.. +# when it is added, it comes around and BITES ME IN THE ASS, +# because i then have to code support into this script.. Evil. + +# Craig got bitten in the ass again -- +# in 1.1 beta the include file is manditory, therefore +# if we cant find it, default to %conf%/inspircd.pid. +# Note, this also contains a fix for when the pid file is +# defined, but defined in a comment (line starts with #) +# -- Brain + +my %filesparsed; + +sub getpidfile +{ + my ($file) = @_; + # Before we start, do we have a PID already? (Should never occur) + if ($pid ne "") { + return; + } + # Are We using a relative path? + if ($file !~ /^\//) { + # Convert it to a full path. + $file = $runpath .'/'. $file; + } + + # Have we checked this file before? + return if $filesparsed{$file}; + $filesparsed{$file} = 1; + + # Open the File.. + open INFILE, '<', $file or return; + # Grab entire file contents.. + my(@lines) = ; + # Close the file + close INFILE; + + # remove trailing spaces + chomp(@lines); + for my $i (@lines) { + # clean it up + $i =~ s/[^=]+=\s(.*)/\1/; + # Does this file have a pid? + if (($i =~ //i) && ($i !~ /^#/)) + { + # Set the PID file and return. + $pidfile = $1; + if (-f $pidfile) + { + return; + } + elsif (-f "$runpath/$pidfile") + { + $pidfile = "$runpath/$pidfile"; + return; + } + return; + } + } + + + # If we get here, NO PID FILE! -- Check for includes + for my $i (@lines) { + $i =~ s/[^=]+=\s(.*)/\1/; + if (($i =~ s/\//i) && ($i !~ /^#/)) + { + # Decend into that file, and check for PIDs.. (that sounds like an STD ;/) + getpidfile($1); + # Was a PID found? + if ($pidfile ne "") { + # Yes, Return. + return; + } + } + } + + # End of includes / No includes found. Using default. + $pidfile = $runpath . "/data/inspircd.pid"; +} + +sub getstatus { + my $pid = getprocessid(); + return 0 if $pid == 0; + return kill 0, $pid; +} + + +sub getprocessid { + my $pid; + open PIDFILE, "< $pidfile" or return 0; + while() + { + $pid = $_; + } + close PIDFILE; + return $pid; +} + +sub checkvalgrind +{ + unless(`valgrind --version`) + { + print "Couldn't start valgrind: $!\n"; + exit; + } +} + +sub checkgdb +{ + unless(`gdb --version`) + { + print "Couldn't start gdb: $!\n"; + exit; + } +} + +sub checkscreen +{ + unless(`screen --version`) + { + print "Couldn't start screen: $!\n"; + exit; + } +} + +sub checkxmllint +{ + open(FH, "xmllint|") or die "Couldn't start xmllint: $!\n"; +} + +sub cmd_checkconf() +{ + checkxmllint(); + validateconf($conf); + print "Config check complete\n"; + exit 0; +} + +my %filechecked; + +sub validateconf +{ + my ($file) = @_; + + # Are We using a relative path? + if ($file !~ /^\//) { + # Convert it to a full path.. + $file = $runpath . $file; + } + + # Have we checked this file before? + return if $filechecked{$file}; + $filechecked{$file} = 1; + + # Open the File.. + open INFILE, "< $file" or die "Unable to open file $file\n"; + # Grab entire file contents.. + my(@lines) = ; + # Close the file + close INFILE; + + # remove trailing spaces + chomp(@lines); + + my @newlines = (); + my @blanks = (); + my $conline; + + push @newlines, ""; +# push @newlines, ""; + push @newlines, ""; + + for my $i (@lines) + { + # remove trailing newlines + chomp($i); + + # convert tabs to spaces + $i =~ s/\t/ /g; + + # remove leading spaces + $i =~ s/^ *//; + + # remove comments + $i =~ s/^#.*//; + + # remove trailing #s + $i =~ s/(.*)#$/\1/; + + # remove trailing comments + my $line = ""; + my $quote = 0; + for (my $j = 0; $j < length($i); $j++) + { + if (substr($i,$j, 1) eq '"') { $quote = ($quote) ? 0 : 1; } elsif (substr($i,$j, 1) eq "#" && !$quote) { last; } + $line .= substr($i,$j, 1); + } + $i = $line; + + # remove trailing spaces + $i =~ s/ *$//; + + # setup incf for include check and clean it up, since this breaks parsing use local var + my $incf = $i; + $incf =~ s/[^=]+=\s(.*)/\1/; + + # include file? + if (($incf =~ s/\//i) && ($incf !~ /^#/)) + { + # yes, process it + validateconf($1); + } + + if ($i =~ /^<.*/ && $conline =~ /^<.*/) + { + push @newlines, $conline; + push @newlines, @blanks; + $conline = $i; + } + + if ($i =~ /^<.*>$/) + { + $i =~ s/(.*)>$/\1 \/>/; + push @newlines, $i; + } + elsif ($i =~ /.*>$/) + { + $conline .= " $i"; + $conline =~ s/(.*)>$/\1 \/>/; + push @blanks, ""; + push @newlines, $conline; + push @newlines, @blanks; + $conline = ""; + undef @blanks; + } + elsif ($i =~ /^<.*/) + { + $conline = $i; + } + elsif ($conline =~ /^<.*/ && $i) + { + $conline .= " $i"; + push @blanks, ""; + } + else + { + if ($conline) + { + push @blanks, $i; + } + else + { + push @newlines, $i; + } + } + } + if ($conline) + { + push @newlines, $conline; + push @newlines, @blanks; + } + + push @newlines, ""; + + my $tmpfile; + do + { + $tmpfile = tmpnam(); + } until sysopen(TF, $tmpfile, O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, 0700); + + for my $n (@newlines) + { + print TF "$n\n"; + } + close TF; + + my @result = `xmllint -noout $tmpfile 2>&1`; + chomp(@result); + + my $skip = 0; + for my $n (@result) + { + if ($skip) + { + $skip = 0; + next; + } + $n =~ s/$tmpfile\:\d*\: *//g; + if ($n =~ /.*config>.*/) + { + $n = ""; + $skip = 1; + } + + if ($n && !$skip) + { + if ($n =~ /line \d*/) + { + my $lineno = $n; + $lineno =~ s/.*line (\d*).*/\1/; + $lineno = $lineno-2; + $n =~ s/line (\d*)/line $lineno/; + } + print "$file : $n\n"; + } + } + unlink($tmpfile); +} diff --git a/make/template/main.mk b/make/template/main.mk new file mode 100644 index 000000000..953c6bf4e --- /dev/null +++ b/make/template/main.mk @@ -0,0 +1,228 @@ +# InspIRCd Main Makefile +# +# (C) InspIRCd Development Team, 2002-2009 +# This file is automagically generated by configure, from +# .Makefile.inc. Any changes make will go away! +# Please do not edit unless you know what you're doing. +# + +CC = @CC@ +SYSTEM = @SYSTEM@ +BUILDPATH = @BUILD_DIR@ +SOCKETENGINE = @SOCKETENGINE@ +CXXFLAGS = -O1 -pipe -fPIC -DPIC +LDLIBS = -pthread -lstdc++ +LDFLAGS = +SHARED = -shared -rdynamic +CORELDFLAGS = -rdynamic -L. $(LDFLAGS) +PICLDFLAGS = -fPIC -shared -rdynamic $(LDFLAGS) +BASE = "@BASE_DIR@" +CONPATH = "@CONFIG_DIR@" +MODPATH = "@MODULE_DIR@" +BINPATH = "@BINARY_DIR@" +LAUNCHDPATH = "/System/Library/LaunchDaemons" +INSTMODE = 0755 + +@IFEQ $(CC) icc + CXXFLAGS += -Wshadow +@ELSE + CXXFLAGS += -pedantic -Woverloaded-virtual -Wshadow -Wformat=2 -Wmissing-format-attribute -Wall +@ENDIF + + +@IFEQ $(SYSTEM) linux + LDLIBS += -ldl +@ELSIFEQ $(SYSTEM) solaris + LDLIBS += -lsocket -lnsl -lrt -lresolv +@ELSIFEQ $(SYSTEM) sunos + LDLIBS += -lsocket -lnsl -lrt -lresolv +@ELSIFEQ $(SYSTEM) darwin + CXXFLAGS += -DDARWIN -frtti + LDLIBS += -ldl + SHARED = -bundle -twolevel_namespace -undefined dynamic_lookup + CORELDFLAGS = -dynamic -bind_at_load -L. +@ELSIFEQ $(SYSTEM) interix + CXXFLAGS += -D_ALL_SOURCE -I/usr/local/include +@ENDIF + +@IFDEF D + CXXFLAGS += -g3 -Werror + HEADER = debug-header +@ELSE + CXXFLAGS += -g1 + HEADER = std-header +@ENDIF +FOOTER = finishmessage + +CXXFLAGS += -Iinclude + +@GNU_ONLY MAKEFLAGS += --no-print-directory + +@GNU_ONLY SOURCEPATH = $(shell /bin/pwd) +@BSD_ONLY SOURCEPATH != /bin/pwd + +@IFDEF V + RUNCC = $(CC) + VERBOSE = -v +@ELSE + @GNU_ONLY MAKEFLAGS += --silent + @BSD_ONLY MAKE += -s + RUNCC = perl $(SOURCEPATH)/make/run-cc.pl $(CC) +@ENDIF + +@DO_EXPORT RUNCC CXXFLAGS CC LDLIBS PICLDFLAGS VERBOSE SOCKETENGINE CORELDFLAGS +@DO_EXPORT BASE CONPATH MODPATH BINPATH SOURCEPATH BUILDPATH + +# Default target +TARGET = all + +@IFDEF M + HEADER = mod-header + FOOTER = mod-footer + @BSD_ONLY TARGET = modules/${M:S/.so$//}.so + @GNU_ONLY TARGET = modules/$(M:.so=).so +@ENDIF + +@IFDEF T + HEADER = + FOOTER = target + TARGET = $(T) +@ENDIF + +all: $(FOOTER) + +target: $(HEADER) + $(MAKEENV) perl make/calcdep.pl + $(MAKEENV) $(MAKE) -C $(BUILDPATH) -f real.mk $(TARGET) + +debug: + @${MAKE} D=1 all + +debug-header: + @echo "*************************************" + @echo "* BUILDING WITH DEBUG SYMBOLS *" + @echo "* *" + @echo "* This will take a *long* time. *" + @echo "* Please be aware that this build *" + @echo "* will consume a very large amount *" + @echo "* of disk space (150MB+), and can *" + @echo "* run slower. Use the debug build *" + @echo "* for module development or if you *" + @echo "* are experiencing problems. *" + @echo "* *" + @echo "*************************************" + +mod-header: + @echo 'Building single module:' + +mod-footer: target + @echo 'To install, copy $(BUILDPATH)/$(TARGET) to $(MODPATH)' + @echo 'Or, run "make install"' + +std-header: + @echo "*************************************" + @echo "* BUILDING INSPIRCD *" + @echo "* *" + @echo "* This will take a *long* time. *" + @echo "* Why not read our wiki at *" + @echo "* http://wiki.inspircd.org *" + @echo "* while you wait for make to run? *" + @echo "*************************************" + +finishmessage: target + @echo "" + @echo "*************************************" + @echo "* BUILD COMPLETE! *" + @echo "* *" + @echo "* To install InspIRCd, type: *" + @echo "* make install *" + @echo "*************************************" + +install: target@EXTRA_DIR@ + @-install -d -m $(INSTMODE) $(BASE) + @-install -d -m $(INSTMODE) $(BASE)/data + @-install -d -m $(INSTMODE) $(BASE)/logs + @-install -d -m $(INSTMODE) $(BINPATH) + @-install -d -m $(INSTMODE) $(CONPATH) + @-install -d -m $(INSTMODE) $(MODPATH) + -install -m $(INSTMODE) $(BUILDPATH)/modules/*.so $(MODPATH) + -install -m $(INSTMODE) $(BUILDPATH)/bin/inspircd $(BINPATH) + -install -m $(INSTMODE) @STARTSCRIPT@ $(@DESTINATION@) 2>/dev/null + @$(MAKEENV) make/install-extras.pl install + @echo "" + @echo "*************************************" + @echo "* INSTALL COMPLETE! *" + @echo "* *" + @echo "* It is safe to ignore any messages *" + @echo "* related to copying of conf files. *" + @echo "* *" + @echo "* REMEMBER TO EDIT YOUR CONFIG FILE *" + @echo "*************************************" + +@GNU_ONLY RCS_FILES = $(wildcard .git/index .svn/entries .config.cache) +@GNU_ONLY GNUmakefile: make/template/main.mk configure $(RCS_FILES) +@GNU_ONLY ./configure -update + +clean: + @echo Cleaning... + @-rm -f src/inspircd src/modes/modeclasses.a include/inspircd_se_config.h + @-rm -f src/*.so src/modules/*.so src/commands/*.so + @-rm -f src/*.o src/*/*.o src/modules/*/*.o + @-rm -f src/.*.d src/*/.*.d src/modules/*/.*.d + @-rm -f $(BUILDPATH)/bin/inspircd $(BUILDPATH)/include $(BUILDPATH)/real.mk + @-rm -rf $(BUILDPATH)/obj $(BUILDPATH)/modules + @-rmdir $(BUILDPATH)/bin 2>/dev/null + @-rmdir $(BUILDPATH) 2>/dev/null + @echo Completed. + +deinstall: + -rm $(BINPATH)/inspircd + -rm $(MODPATH)/*.so + @make/install-extras.pl deinstall + +squeakyclean: distclean + +launchd_dir: + @-install -d -m $(INSTMODE) ${LAUNCHDPATH} + +configureclean: + rm -f .config.cache + rm -f src/modules/Makefile + rm -f src/commands/Makefile + rm -f src/Makefile + -rm -f Makefile + rm -f BSDmakefile + rm -f GNUmakefile + rm -f include/inspircd_config.h + rm -f include/inspircd_version.h + +distclean: clean configureclean + +help: + @echo 'InspIRCd Makefile' + @echo '' + @echo 'Use: ${MAKE} [flags] [targets]' + @echo '' + @echo 'Flags:' + @echo ' V=1 Show the full command being executed instead of "BUILD: dns.cpp"' + @echo ' D=1 Enable debug build, for module development or crash tracing' + @echo ' -j Run a parallel build using N jobs' + @echo '' + @echo 'User targets:' + @echo ' all Complete build of InspIRCd, without installing' + @echo ' install Build and install InspIRCd to the directory chosen in ./configure' + @echo ' Currently installs to ${BASE}' + @echo ' debug Compile a debug build. Equivalent to "make D=1 all"' + @echo '' + @echo ' M=m_foo Builds a single module (cmd_foo also works here)' + @echo ' T=target Builds a user-specified target, such as "inspircd" or "modules"' + @echo ' Other targets are specified by their path in the build directory' + @echo ' Multiple targets may be separated by a space' + @echo '' + @echo ' clean Cleans object files produced by the compile' + @echo ' distclean Cleans all files produced by compile and ./configure' + @echo ' Note: this includes the Makefile' + @echo ' deinstall Removes the files created by "make install"' + @echo + +.PHONY: all target debug debug-header mod-header mod-footer std-header finishmessage install clean deinstall squeakyclean launchd_dir configureclean help diff --git a/make/template/org.inspircd.plist b/make/template/org.inspircd.plist new file mode 100644 index 000000000..3112d51b1 --- /dev/null +++ b/make/template/org.inspircd.plist @@ -0,0 +1,27 @@ + + + + + Iterations + 3 + Label + org.inspircd + LowPriorityIO + + Nice + 1 + OnDemand + + Program + @BINARY_DIR@/inspircd + ProgramArguments + + inspircd + -nofork + + ServiceIPC + + UserName + ircdaemon + + diff --git a/src/configreader.cpp b/src/configreader.cpp index 879aeaa8e..6932e960e 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -23,7 +23,7 @@ /* $CopyInstall: conf/modules.conf.example $(CONPATH) */ /* $CopyInstall: conf/opers.conf.example $(CONPATH) */ /* $CopyInstall: conf/links.conf.example $(CONPATH) */ -/* $CopyInstall: .gdbargs $(BASE) */ +/* $CopyInstall: tools/gdbargs $(BASE)/.gdbargs */ #include "inspircd.h" #include diff --git a/tools/gdbargs b/tools/gdbargs new file mode 100644 index 000000000..244c1b29c --- /dev/null +++ b/tools/gdbargs @@ -0,0 +1,3 @@ +handle SIGPIPE pass nostop noprint +handle SIGHUP pass nostop noprint +run -- cgit v1.2.3