Mercurial > code
changeset 24:726b181b8956
Added module.c and module.h portable way to manipulate DSO
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 15 Sep 2011 14:31:52 +0200 |
parents | 216b6e6a539c |
children | e09000fc013a |
files | module.c module.h |
diffstat | 2 files changed, 115 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/module.c Thu Sep 15 14:31:52 2011 +0200 @@ -0,0 +1,64 @@ +/* + * module.c -- portable functions to manipulate dynamic libraries + * + * Copyright (c) 2011, David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> + +#include "module.h" + +int +module_load(struct module *mod, const char *path, int flags) +{ + /* Flags are not supported on Windows */ +#if defined(_WIN32) || defined(__WIN32__) + (void) flags; + mod->handler = LoadLibrary(path); +#else + mod->handler = dlopen(path, flags); +#endif + + if (!(mod->handler)) + return -1; + + return 0; +} + +int +module_find(struct module *mod, const char *sym) +{ +#if defined(_WIN32) || defined(__WIN32__) + mod->sym = GetProcAddress(mod->handler, sym); +#else + mod->sym = dlsym(mod->handler, sym); +#endif + + if (!(mod->sym)) + return -1; + + return 0; +} + +void +module_free(struct module *mod) +{ +#if defined(_WIN32) || defined(__WIN32__) + FreeLibrary(mod->handler); +#else + dlclose(mod->handler); +#endif +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/module.h Thu Sep 15 14:31:52 2011 +0200 @@ -0,0 +1,51 @@ +/* + * module.h -- portable functions to manipulate dynamic libraries + * + * Copyright (c) 2011, David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _MODULE_H_ +#define _MODULE_H_ + +#if defined(_WIN32) || defined(__WIN32__) +#include <windows.h> +#else +#include <dlfcn.h> +#endif + +/* Unsupported on windows */ +#if defined(_WIN32) || defined(__WIN32__) +#define MOD_LAZY 1 +#define MOD_NOW 1 +#else +#define MOD_LAZY RTLD_LAZY +#define MOD_NOW RTLD_NOW +#endif + +struct module { +#if defined(_WIN32) || defined(__WIN32__) + HMODULE handler; + FARPROC sym; +#else + void *handler; + void *sym; +#endif +}; + +int module_load(struct module *, const char *, int); +int module_find(struct module *, const char *); +void module_free(struct module *); + +#endif /* _MODULE_H_ */