using namespace std;
#include "inspircd_config.h"
+#include "inspircd_io.h"
#include "globals.h"
#include "dynamic.h"
#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);
}
}
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))
{
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
}