X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fdynamic.cpp;h=8e63b7d03ee0729738a9a12cd677087cbad969be;hb=59b1a8955142935b02af6446005ab47fc7c3fc8c;hp=e96c9d90574645d3f65920b5779e6ae2dfdfded4;hpb=99b6380933cd5f80dc052dc085b6615b3d055734;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/dynamic.cpp b/src/dynamic.cpp index e96c9d905..8e63b7d03 100644 --- a/src/dynamic.cpp +++ b/src/dynamic.cpp @@ -17,6 +17,7 @@ using namespace std; #include "inspircd_config.h" +#include "inspircd_io.h" #include "globals.h" #include "dynamic.h" @@ -32,8 +33,15 @@ using namespace std; #include #include +extern ServerConfig* Config; + DLLManager::DLLManager(char *fname) { + if (!strstr(fname,".so")) + { + err = "This doesn't look like a module file to me..."; + return; + } #ifdef STATIC_LINK this->staticname[0] = '\0'; log(DEBUG,"Loading core-compiled module '%s'",fname); @@ -49,15 +57,31 @@ DLLManager::DLLManager(char *fname) } } err = "Module is not statically compiled into the ircd"; +#else +#ifdef IS_CYGWIN + // Cygwin behaviour is handled slightly differently + // With the advent of dynamic modules. Because Windows + // wont let you overwrite a file which is currently in + // Use, we can safely attempt to load the module from its + // Current location :) + + h = dlopen(fname, RTLD_NOW ); + err = (char*)dlerror(); + #else // Copy the library to a temp location, this makes recompiles // a little safer if the ircd is running at the time as the // shared libraries are mmap()ed and not doing this causes // segfaults. FILE* x = fopen(fname,"rb"); + if (!x) + { + err = "Module file not found or cannot access, game over man!"; + return; + } char tmpfile_template[255]; char buffer[65536]; - snprintf(tmpfile_template, 255, "/tmp/inspircd_file.so.%d.XXXXXXXXXX",getpid()); + snprintf(tmpfile_template, 255, "%s/inspircd_file.so.%d.XXXXXXXXXX",Config->TempDir,getpid()); int fd = mkstemp(tmpfile_template); while (!feof(x)) { @@ -72,7 +96,9 @@ DLLManager::DLLManager(char *fname) err = (char*)dlerror(); close(fd); // We can delete the tempfile once it's loaded, leaving just the inode. - unlink(tmpfile_template); + if (!Config->debugging) + unlink(tmpfile_template); +#endif #endif }