xbot/src/module.c

146 lines
2.7 KiB
C
Raw Normal View History

#include "irc.h"
#include "util.h"
#include "events.h"
#include <stdio.h>
#include <stdlib.h>
2015-04-08 11:56:32 -07:00
#include <string.h>
2024-02-12 23:22:10 -08:00
#ifdef _WIN32
#include <windows.h>
#else
#include <dlfcn.h>
2024-02-12 23:22:10 -08:00
#endif
2015-04-08 11:56:32 -07:00
void load_module(struct irc_conn *bot, char *where, char *stype, char *file)
{
2024-02-12 23:22:10 -08:00
#ifdef _WIN32
HMODULE libHandle;
FARPROC funcPtr;
char *error = (char *)malloc(sizeof(char *)*1024);
2024-02-12 23:22:10 -08:00
libHandle = LoadLibrary(file);
if (libHandle == NULL)
{
2024-02-12 23:22:10 -08:00
sprintf(error, "Error loading %s\n", file);
2015-04-08 11:56:32 -07:00
if (strcmp("runtime", stype))
2015-04-07 11:18:24 -07:00
{
eprint("%s\n", error);
return;
}
2024-02-12 23:22:10 -08:00
else if (strcmp(PRIVMSG_CHAN, stype))
{
irc_privmsg(bot, where, error);
}
else
{
irc_notice(bot, where, error);
}
2024-02-12 23:22:10 -08:00
return;
}
2024-02-12 23:22:10 -08:00
funcPtr = GetProcAddress(libHandle, "mod_init");
if (funcPtr == NULL)
{
2024-02-12 23:22:10 -08:00
DWORD err = GetLastError();
sprintf(error, "Error loading mod_init() pointer for %s: %lu", file, err);
eprint("Error: %s\n", error);
2015-04-07 11:18:24 -07:00
2024-02-12 23:22:10 -08:00
if (strcmp("runtime", stype))
{
return;
}
else if (strcmp(PRIVMSG_CHAN, stype))
{
irc_privmsg(bot, where, error);
}
else
{
irc_notice(bot, where, error);
}
return;
}
2024-02-12 23:22:10 -08:00
((void(*)(void))funcPtr)();
2024-02-12 23:22:10 -08:00
//FreeLibrary(libHandle);
2015-04-08 11:56:32 -07:00
if (strcmp("runtime", stype))
2024-02-12 23:22:10 -08:00
{
irc_privmsg(bot, where, "Module '%s' loaded.", file);
}
else
{
printf("Module '%s' loaded.\n", file);
}
free(error);
#else
void *handle;
void (*mod_init)();
char *error = (char *)malloc(sizeof(char *)*1024);
handle = dlopen(file, RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE);
if (!handle)
{
sprintf(error, "Error: %s", dlerror());
if (strcmp("runtime", stype))
{
eprint("%s\n", error);
return;
}
else if (strcmp(PRIVMSG_CHAN, stype))
{
irc_privmsg(bot, where, error);
}
else
{
irc_notice(bot, where, error);
}
return;
}
dlerror();
*(void **)(&mod_init) = dlsym(handle, "mod_init");
if ((error = dlerror()) != NULL)
{
//sprintf(error, "Error: %s", error);
eprint("Error: %s\n", error);
if (strcmp("runtime", stype))
{
return;
}
else if (strcmp(PRIVMSG_CHAN, stype))
{
irc_privmsg(bot, where, error);
}
else
{
irc_notice(bot, where, error);
}
}
(*mod_init)();
dlclose(handle);
if (strcmp("runtime", stype))
{
irc_privmsg(bot, where, "Module '%s' loaded.", file);
}
else
{
printf("Module '%s' loaded.\n", file);
}
free(error);
#endif
}