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_ */