]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/dynamic.cpp
Added comment
[user/henk/code/inspircd.git] / src / dynamic.cpp
index a4542760b024a52f346be6b3fcdc2d36996cebb1..8e63b7d03ee0729738a9a12cd677087cbad969be 100644 (file)
@@ -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 <sys/types.h>
 #include <stdio.h>
 
+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))
        {
@@ -71,6 +95,10 @@ DLLManager::DLLManager(char *fname)
        h = dlopen(tmpfile_template, RTLD_NOW );
        err = (char*)dlerror();
        close(fd);
+       // We can delete the tempfile once it's loaded, leaving just the inode.
+       if (!Config->debugging)
+               unlink(tmpfile_template);
+#endif
 #endif
 }