summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.Makefile.inc5
-rwxr-xr-xconfigure79
-rw-r--r--include/dynamic.h16
-rw-r--r--src/dynamic.cpp90
-rw-r--r--src/inspircd.cpp10
-rw-r--r--src/modules/m_chanprotect.cpp8
6 files changed, 167 insertions, 41 deletions
diff --git a/.Makefile.inc b/.Makefile.inc
index f7a0ba484..4cd07e5d0 100644
--- a/.Makefile.inc
+++ b/.Makefile.inc
@@ -17,9 +17,10 @@ MODPATH = @MODULE_DIR@
BINPATH = @BINARY_DIR@
LIBPATH = @LIBRARY_DIR@
MODULES = @MODULES@
-MAKEARGS = 'PROGS=${PROGS}' 'FLAGS=${FLAGS}' 'CC=${CC}' 'LDLIBS=${LDLIBS}' 'MODULES=${MODULES}' 'MODPATH=$(MODPATH)' 'LIBPATH=$(LIBPATH)'
+STATICLIBS = @STATICLIBS@
+MAKEARGS = 'PROGS=${PROGS}' 'FLAGS=${FLAGS}' 'CC=${CC}' 'LDLIBS=${LDLIBS}' 'MODULES=${MODULES}' 'MODPATH=${MODPATH}' 'LIBPATH=${LIBPATH}' 'STATICLIBS=${STATICLIBS}'
-all : ircd mods config bininst
+all : @MAKEORDER@
mods:
${MAKE} -C src/modules DIRNAME="src/modules" $(MAKEARGS)
diff --git a/configure b/configure
index 30cf348cf..597e581b6 100755
--- a/configure
+++ b/configure
@@ -29,11 +29,14 @@ $config{MAXI_MODES} = "20"; # Default Max.
$config{HAS_STRLCPY} = "false"; # strlcpy Check.
$config{USE_KQUEUE} = "y"; # kqueue enabled
$config{USE_EPOLL} = "y"; # epoll enabled
+$config{STATIC_LINK} = "no";
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} = `/bin/uname`); # Operating System Name
$config{CC} = "g++"; # C++ compiler
+$config{MAKEORDER} = "ircd mods config bininst";
+$config{STATICLIBS} = "";
if ((!$config{OSNAME}) || ($config{OSNAME} eq "")) {
chomp($config{OSNAME} = `/usr/bin/uname`);
@@ -292,7 +295,8 @@ 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";
-print "\033[0mCompiler program:\033[1;32m\t\t$config{CC}\033[0m\n\n";
+print "\033[0mCompiler program:\033[1;32m\t\t$config{CC}\033[0m\n";
+print "\033[0mStatic modules:\033[1;32m\t\t\t$config{STATIC_LINK}\033[0m\n\n";
makecache();
writefiles();
@@ -412,6 +416,9 @@ sub getosflags {
$config{FLAGS} = "-frtti $OPTIMISATI -Woverloaded-virtual $config{OPTIMISATI}";
$config{LDLIBS} = "";
$config{MAKEPROG} = "/usr/bin/make";
+ $config{MAKEORDER} = "mods ircd config bininst";
+ $config{STATICLIBS} = "modules/mods.a";
+ $config{STATIC_LINK} = "yes";
}
}
if ($config{OSNAME} =~ /SunOS/) {
@@ -442,7 +449,10 @@ sub getmodules {
foreach $name (sort readdir(DIRHANDLE)) {
if ($name =~ /^m_(.+)\.cpp$/)
{
- $modlist[$i++] = $1;
+ $mod = $1;
+ if ($mod !~ /_static$/) {
+ $modlist[$i++] = $mod;
+ }
}
}
closedir(DIRHANDLE);
@@ -475,6 +485,9 @@ EOF
if ($config{OSNAME} =~ /SunOS/) {
print FILEHANDLE "#define IS_SOLARIS\n";
}
+ if ($config{STATIC_LINK} eq "yes") {
+ print FILEHANDLE "#define STATIC_LINK\n";
+ }
if ($config{GCCVER} > 3) {
print FILEHANDLE "#define GCC3\n";
print FILEHANDLE "#define GCC34\n";
@@ -553,6 +566,8 @@ EOF
$tmp =~ s/\@LIBRARY_DIR\@/$config{LIBRARY_DIR}/;
$tmp =~ s/\@MODULES\@/$modules/;
$tmp =~ s/\@EXECUTABLE\@/$exe/;
+ $tmp =~ s/\@MAKEORDER\@/$config{MAKEORDER}/;
+ $tmp =~ s/\@STATICLIBS\@/$config{STATICLIBS}/;
print "Writing \033[1;32m$file\033[0m\n";
open(FILEHANDLE, ">$file");
@@ -573,6 +588,7 @@ EOF
write_dynamic_makefile();
}
+
# Modules Makefile..
print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
open(FILEHANDLE, ">src/modules/Makefile");
@@ -592,18 +608,50 @@ EOF
# Create a Modules List..
my $modules = "";
my $flags = "";
+ if ($config{OSNAME} =~ /CYGWIN/) {
+ open(MODLIST,">include/modlist.h");
+ print MODLIST <<HEADER;
+// Generated automatically by configure. DO NOT EDIT!
+
+#ifndef __SYMBOLS__H_CONFIGURED__
+#define __SYMBOLS__H_CONFIGURED__
+
+HEADER
+ foreach $i (@modlist) {
+ if ($i !~ /_static$/) {
+ print MODLIST "extern \"C\" void * $i\_init (void);\n";
+ }
+ }
+ print MODLIST "\nstruct {const char *name; initfunc *value; } modsyms[] = {\n";
+ }
foreach $i (@modlist)
{
- $flags = getcompilerflags("src/modules/m_".$i.".cpp");
- if ($config{OSNAME} =~ /CYGWIN/) {
- print FILEHANDLE <<EOCHEESE;
-m_$i.o: 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
+ if ($i !~ /_static$/) {
+ $flags = getcompilerflags("src/modules/m_".$i.".cpp");
+ if ($config{OSNAME} =~ /CYGWIN/) {
+ print FILEHANDLE <<EOCHEESE;
+m_$i.o: m_$i\_static.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/servers.h ../../include/base.h
+ \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c m_$i\_static.cpp
+ mv m_$i\_static.o ../m_$i.o
EOCHEESE
- }
- else {
- print FILEHANDLE <<EOCHEESE;
+ print "Configuring module [\033[1;32mm_$i.so\033[0m] for static linking... ";
+ open(MODULE,"<src/modules/m_".$i.".cpp") or die("Could not open m_".$i.".cpp");
+ open(MUNGED,">src/modules/m_".$i."_static.cpp") or die("Could not create m_".$i."_static.cpp");
+ while (chomp($a = <MODULE>)) {
+ $a =~ s/init_module/$i\_init/g;
+ $a =~ s/Srv/$i\Srv/g;
+ print MUNGED "$a\n";
+ }
+ close(MODULE);
+ close(MUNGED);
+ print MODLIST <<EOENT;
+{"m_$i.so",\&$i\_init},
+EOENT
+ print "done\n";
+ }
+ else {
+ print FILEHANDLE <<EOCHEESE;
m_$i.so: m_$i.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/servers.h ../../include/base.h
\$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c m_$i.cpp
\$(CC) \$(FLAGS) -shared $flags -o m_$i.so m_$i.o
@@ -611,7 +659,12 @@ m_$i.so: m_$i.cpp ../../include/modules.h ../../include/users.h ../../include/ch
chmod 0700 \$(MODPATH)/m_$i.so
EOCHEESE
- }
+ }
+ }
+ }
+ if ($config{OSNAME} =~ /CYGWIN/) {
+ print MODLIST "{0}};\n\n#endif\n";
+ close(MODLIST);
}
}
@@ -673,10 +726,10 @@ CC = im a cheezeball
CXXFLAGS = -I../include \${FLAGS}
-all: hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_util.o inspircd_io.o connection.o message.o commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o servers.o helperfuncs.o inspircd.exe
+all: hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_util.o inspircd_io.o connection.o message.o commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o servers.o helperfuncs.o \$(MODULES) inspircd.exe
inspircd.exe: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h
- \$(CC) -I../include \$(FLAGS) inspircd.cpp -o inspircd.exe \$(LDLIBS) channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_util.o inspircd_io.o connection.o message.o commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o servers.o helperfuncs.o hashcomp.o
+ \$(CC) -I../include \$(FLAGS) inspircd.cpp -o inspircd.exe \$(LDLIBS) channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_util.o inspircd_io.o connection.o message.o commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o servers.o helperfuncs.o hashcomp.o \$(MODULES)
hashcomp.o: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
\$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
diff --git a/include/dynamic.h b/include/dynamic.h
index 987f5de72..47963b828 100644
--- a/include/dynamic.h
+++ b/include/dynamic.h
@@ -18,6 +18,9 @@
#ifndef __DLL_H
#define __DLL_H
+typedef void * (initfunc) (void);
+
+#include "inspircd_config.h"
class DLLManager
{
@@ -26,7 +29,11 @@ class DLLManager
virtual ~DLLManager();
+#ifdef STATIC_LINK
+ bool GetSymbol( initfunc* &v, const char *sym_name );
+#else
bool GetSymbol( void **, const char *sym_name );
+#endif
const char *LastError()
{
@@ -35,7 +42,10 @@ class DLLManager
protected:
void *h;
- const char *err;
+ char *err;
+#ifdef STATIC_LINK
+ char staticname[1024];
+#endif
};
@@ -44,7 +54,11 @@ class DLLFactoryBase : public DLLManager
public:
DLLFactoryBase(const char *fname, const char *func_name = 0);
virtual ~DLLFactoryBase();
+#ifdef STATIC_LINK
+ initfunc *factory_func;
+#else
void * (*factory_func)(void);
+#endif
};
diff --git a/src/dynamic.cpp b/src/dynamic.cpp
index cc7aeb0b9..2e787f341 100644
--- a/src/dynamic.cpp
+++ b/src/dynamic.cpp
@@ -17,66 +17,114 @@
using namespace std;
#include "globals.h"
-#include <dlfcn.h>
+#include "inspircd_config.h"
#include "dynamic.h"
+
+#ifndef STATIC_LINK
+#include <dlfcn.h>
+#else
+#include "modlist.h"
+#endif
+
#include "inspstring.h"
#include "helperfuncs.h"
DLLManager::DLLManager(const char *fname)
{
+#ifdef STATIC_LINK
+ this->staticname[0] = '\0';
+ log(DEBUG,"Loading core-compiled module '%s'",fname);
+ for (int j = 0; modsyms[j].name; j++)
+ {
+ log(DEBUG,"Check %s",modsyms[j].name);
+ if (!strcmp(modsyms[j].name,fname))
+ {
+ log(DEBUG,"Found %s",fname);
+ strlcpy(this->staticname,fname,1020);
+ err = 0;
+ return;
+ }
+ }
+ err = "Module is not statically compiled into the ircd";
+#else
// Try to open the library now and get any error message.
- h=dlopen( fname, RTLD_NOW );
- err=dlerror();
+ h = dlopen( fname, RTLD_NOW );
+ err = dlerror();
+#endif
}
DLLManager::~DLLManager()
{
+#ifndef STATIC_LINK
// close the library if it isn't null
- if (h!=0)
- dlclose(h);
+ if (h != 0)
+ dlclose(h);
+#endif
+}
+
+
+
+#ifdef STATIC_LINK
+
+bool DLLManager::GetSymbol(initfunc* &v, const char *sym_name)
+{
+ log(DEBUG,"Symbol search...");
+ for (int j = 0; modsyms[j].name; j++)
+ {
+ if (!strcmp(this->staticname,modsyms[j].name))
+ {
+ log(DEBUG,"Loading symbol...");
+ v = modsyms[j].value;
+ err = 0;
+ return true;
+ }
+ }
+ err = "Module symbol missing from the core";
+ return false;
}
+#else
bool DLLManager::GetSymbol(void **v, const char *sym_name)
{
// try extract a symbol from the library
// get any error message is there is any
- if( h!=0 )
+ if(h != 0)
{
*v = dlsym( h, sym_name );
- err=dlerror();
- if( err==0 )
- return true;
- else
- return false;
+ err = dlerror();
+ if( err == 0 )
+ return true;
+ else
+ return false;
}
else
{
- return false;
+ return false;
}
-
}
+#endif
DLLFactoryBase::DLLFactoryBase(const char *fname, const char *factory) : DLLManager(fname)
{
// try get the factory function if there is no error yet
- factory_func=0;
+ factory_func = 0;
- if( LastError()==0 )
- {
- GetSymbol( (void **)&factory_func, factory ? factory : "init_module" );
+ if(LastError() == 0)
+ {
+#ifdef STATIC_LINK
+ GetSymbol( factory_func, factory ? factory : "init_module" );
+#else
+ GetSymbol( (void **)&factory_func, factory ? factory : "init_module" );
+#endif
}
-
}
DLLFactoryBase::~DLLFactoryBase()
{
}
-
-
-
diff --git a/src/inspircd.cpp b/src/inspircd.cpp
index 9f5a0e69c..4e6e0f86c 100644
--- a/src/inspircd.cpp
+++ b/src/inspircd.cpp
@@ -2440,17 +2440,25 @@ bool UnloadModule(const char* filename)
bool LoadModule(const char* filename)
{
char modfile[MAXBUF];
+#ifdef STATIC_LINK
+ snprintf(modfile,MAXBUF,"%s",filename);
+#else
snprintf(modfile,MAXBUF,"%s/%s",ModPath,filename);
+#endif
std::string filename_str = filename;
+#ifndef STATIC_LINK
if (!DirValid(modfile))
{
log(DEFAULT,"Module %s is not within the modules directory.",modfile);
snprintf(MODERR,MAXBUF,"Module %s is not within the modules directory.",modfile);
return false;
}
+#endif
log(DEBUG,"Loading module: %s",modfile);
+#ifndef STATIC_LINK
if (FileExists(modfile))
{
+#endif
for (int j = 0; j < module_names.size(); j++)
{
if (module_names[j] == filename_str)
@@ -2483,6 +2491,7 @@ bool LoadModule(const char* filename)
snprintf(MODERR,MAXBUF,"Factory function failed!");
return false;
}
+#ifndef STATIC_LINK
}
else
{
@@ -2490,6 +2499,7 @@ bool LoadModule(const char* filename)
snprintf(MODERR,MAXBUF,"Module file could not be found");
return false;
}
+#endif
MODCOUNT++;
return true;
}
diff --git a/src/modules/m_chanprotect.cpp b/src/modules/m_chanprotect.cpp
index 6314cca94..7155e1355 100644
--- a/src/modules/m_chanprotect.cpp
+++ b/src/modules/m_chanprotect.cpp
@@ -24,7 +24,7 @@ using namespace std;
/* $ModDesc: Provides channel modes +a and +q */
-char dummyvalue[] = "on";
+char fakevalue[] = "on";
class ModuleChanProtect : public Module
{
@@ -107,7 +107,7 @@ class ModuleChanProtect : public Module
// this way is best as it adds data thats accessible to other modules
// (so long as you document your code properly) without breaking anything
// because its encapsulated neatly in a map.
- if (user->Extend("cm_founder_"+std::string(channel->name),dummyvalue))
+ if (user->Extend("cm_founder_"+std::string(channel->name),fakevalue))
{
Srv->Log(DEBUG,"Marked user "+std::string(user->nick)+" as founder for "+std::string(channel->name));
}
@@ -222,7 +222,7 @@ class ModuleChanProtect : public Module
{
if (!theuser->GetExt("cm_founder_"+std::string(chan->name)))
{
- theuser->Extend("cm_founder_"+std::string(chan->name),dummyvalue);
+ theuser->Extend("cm_founder_"+std::string(chan->name),fakevalue);
return 1;
}
}
@@ -265,7 +265,7 @@ class ModuleChanProtect : public Module
{
if (!theuser->GetExt("cm_protect_"+std::string(chan->name)))
{
- theuser->Extend("cm_protect_"+std::string(chan->name),dummyvalue);
+ theuser->Extend("cm_protect_"+std::string(chan->name),fakevalue);
return 1;
}
}