summaryrefslogtreecommitdiff
path: root/gmodule
diff options
context:
space:
mode:
authorCDT 1999 Shawn T. Amundson <amundson@gtk.org>1999-05-08 07:40:44 +0000
committerShawn Amundson <amundson@src.gnome.org>1999-05-08 07:40:44 +0000
commit499c9786d1316bc72c539d55786bb3a65d95a83a (patch)
tree9af442bcdb994b2d8f4ae926d0ed0eb1edfdf02a /gmodule
parent2b688f549c8a2719544b33859cdc5ef99355cf37 (diff)
downloadglib-499c9786d1316bc72c539d55786bb3a65d95a83a.tar.gz
Port to BeOS by myself and Richard Offer.
Sat May 8 01:52:29 CDT 1999 Shawn T. Amundson <amundson@gtk.org> * configure.in gerror.c gmain.c gstrfuncs.c gutils.c ltconfig ltmain.sh gmodule/Makefile.am gmodule/gmodule.c gmodule/gmoduleconf.h.in gmodule/gmodule-beos.c gthread/Makefile.am: Port to BeOS by myself and Richard Offer.
Diffstat (limited to 'gmodule')
-rw-r--r--gmodule/Makefile.am7
-rw-r--r--gmodule/gmodule-beos.c171
-rw-r--r--gmodule/gmodule.c2
-rw-r--r--gmodule/gmoduleconf.h.in1
4 files changed, 179 insertions, 2 deletions
diff --git a/gmodule/Makefile.am b/gmodule/Makefile.am
index 2aaa1e1e8..8d28f5e9a 100644
--- a/gmodule/Makefile.am
+++ b/gmodule/Makefile.am
@@ -10,6 +10,7 @@ EXTRA_DIST = \
gmodule-dld.c \
gmodule-os2.c \
gmodule-win32.c \
+ gmodule-beos.c \
gmoduleconf.h.win32
BUILT_SOURCES = gmoduleconf.h
@@ -20,6 +21,8 @@ include_HEADERS = \
libglib = $(top_builddir)/libglib.la # -lglib
+top_builddir_full=`cd \$(top_builddir); pwd`
+
lib_LTLIBRARIES = libgmodule.la libgplugin_a.la libgplugin_b.la
libgmodule_la_SOURCES = gmodule.c
@@ -34,11 +37,11 @@ libgmodule_la_LIBADD = @G_MODULE_LIBS@ # $(libglib)
libgplugin_a_la_SOURCES = libgplugin_a.c
libgplugin_a_la_LDFLAGS = @G_MODULE_LDFLAGS@ -avoid-version -module
-libgplugin_a_la_LIBADD = @G_MODULE_LIBS@ # $(libglib)
+libgplugin_a_la_LIBADD = @G_MODULE_LIBS@ @G_MODULE_PLUGIN_LIBS@ # $(libglib)
libgplugin_b_la_SOURCES = libgplugin_b.c
libgplugin_b_la_LDFLAGS = @G_MODULE_LDFLAGS@ -avoid-version -module
-libgplugin_b_la_LIBADD = @G_MODULE_LIBS@ # $(libglib)
+libgplugin_b_la_LIBADD = @G_MODULE_LIBS@ @G_MODULE_PLUGIN_LIBS@ # $(libglib)
noinst_PROGRAMS = testgmodule
testgmodule_LDFLAGS += @G_MODULE_LDFLAGS@
diff --git a/gmodule/gmodule-beos.c b/gmodule/gmodule-beos.c
new file mode 100644
index 000000000..8cc99b232
--- /dev/null
+++ b/gmodule/gmodule-beos.c
@@ -0,0 +1,171 @@
+/* GMODULE - GLIB wrapper code for dynamic module loading
+ * Copyright (C) 1998 Tim Janik
+ *
+ * BeOS GMODULE implementation
+ * Copyright (C) 1999 Richard Offer and Shawn T. Amundson (amundson@gtk.org)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * MT safe
+ */
+
+#include <be/kernel/image.h> /* image (aka DSO) handling functions... */
+
+/*
+ * The BeOS doesn't use the same symantics as Unix's dlopen....
+ *
+ */
+#ifndef RTLD_GLOBAL
+#define RTLD_GLOBAL 0
+#endif /* RTLD_GLOBAL */
+#ifndef RTLD_LAZY
+#define RTLD_LAZY 1
+#endif /* RTLD_LAZY */
+#ifndef RTLD_NOW
+#define RTLD_NOW 0
+#endif /* RTLD_NOW */
+
+
+/*
+ * Points to Ponder
+ *
+ * You can load the same DSO more than once, in which case you'll have
+ * different image_id's. While this means that we don't have to worry about
+ * reference counts, it could lead to problems in the future....
+ * richard.
+ */
+
+#include <Errors.h>
+#include <stdio.h>
+
+/* --- functions --- */
+static gpointer
+_g_module_open (const gchar *file_name,
+ gboolean bind_lazy)
+{
+ image_id handle;
+
+ handle = load_add_on (file_name);
+ if (handle < B_OK) {
+ g_module_set_error (g_strdup_printf("failed to load_add_on(%s), reason: %s",
+ (gchar *) file_name, strerror(handle)));
+ return NULL;
+ }
+
+ return (gpointer) handle;
+}
+
+static gpointer
+_g_module_self (void)
+{
+ image_info info;
+ int32 cookie = 0;
+ status_t status;
+
+ /* Is it always the first one? I'm guessing yes. */
+ if ((status = get_next_image_info(0, &cookie, &info)) == B_OK)
+ return (gpointer) info.id;
+ else
+ {
+ g_module_set_error (g_strdup_printf("get_next_image_info() for self failed, reason: %s", strerror(status)));
+ return NULL;
+ }
+}
+
+static void
+_g_module_close (gpointer handle,
+ gboolean is_unref)
+{
+ image_info info;
+ gchar *name;
+
+ if (unload_add_on((image_id) handle) != B_OK)
+ {
+ /* Try and get the name of the image. */
+ if (get_image_info((image_id) handle, &info) != B_OK)
+ name = g_strdup("(unknown)");
+ else
+ name = g_strdup (info.name);
+
+ g_module_set_error (g_strdup_printf("failed to unload_add_on(%s)",
+ name));
+ g_free (name);
+ }
+}
+
+static gpointer
+_g_module_symbol (gpointer handle,
+ const gchar *symbol_name)
+{
+ image_id id;
+ gpointer p;
+ status_t status;
+ image_info info;
+ gchar name[256];
+ int32 name_len;
+ int32 type;
+ int32 n;
+
+ id = (image_id) handle;
+
+ if ((status = get_image_info(id, &info)) != B_OK)
+ {
+ g_module_set_error (g_strdup_printf("failed get_image_info(), reason: %s", strerror(status)));
+ return NULL;
+ }
+
+ name_len = 256;
+ type = B_SYMBOL_TYPE_ANY;
+ n = 0;
+ while ((status = get_nth_image_symbol(id, n, name, &name_len, &type, (void **)&p)) == B_OK)
+ {
+ if (!strncmp (name, symbol_name, strlen(symbol_name)))
+ {
+ return p;
+ }
+
+ if (!strcmp (name, "_end"))
+ {
+ g_module_set_error (g_strdup_printf("g_module_symbol(): no symbol matching '%s'", symbol_name));
+ return NULL;
+ }
+
+ name_len = 256;
+ type = B_SYMBOL_TYPE_ANY;
+ n++;
+ }
+
+ g_module_set_error (g_strdup_printf("failed get_image_symbol(%s), reason: %s", symbol_name, strerror(status)));
+ return NULL;
+}
+
+static gchar*
+_g_module_build_path (const gchar *directory,
+ const gchar *module_name)
+{
+ printf("WARNING: _g_module_build_path() untested!\n");
+ if (directory && *directory) {
+ if (strncmp (module_name, "lib", 3) == 0)
+ return g_strconcat (directory, "/", module_name, NULL);
+ else
+ return g_strconcat (directory, "/lib", module_name, ".so", NULL);
+ } else if (strncmp (module_name, "lib", 3) == 0)
+ return g_strdup (module_name);
+ else
+ return g_strconcat ("lib", module_name, ".so", NULL);
+}
diff --git a/gmodule/gmodule.c b/gmodule/gmodule.c
index 3ae1ed0fa..e72d4cd11 100644
--- a/gmodule/gmodule.c
+++ b/gmodule/gmodule.c
@@ -136,6 +136,8 @@ g_module_set_error (const gchar *error)
#include "gmodule-win32.c"
#elif (G_MODULE_IMPL == G_MODULE_IMPL_OS2)
#include "gmodule-os2.c"
+#elif (G_MODULE_IMPL == G_MODULE_IMPL_BEOS)
+#include "gmodule-beos.c"
#else
#undef CHECK_ERROR
#define CHECK_ERROR(rv) { g_module_set_error ("dynamic modules are " \
diff --git a/gmodule/gmoduleconf.h.in b/gmodule/gmoduleconf.h.in
index 0f3b6f9ed..65bc6793b 100644
--- a/gmodule/gmoduleconf.h.in
+++ b/gmodule/gmoduleconf.h.in
@@ -30,6 +30,7 @@ extern "C" {
#define G_MODULE_IMPL_DLD 2
#define G_MODULE_IMPL_WIN32 3
#define G_MODULE_IMPL_OS2 4
+#define G_MODULE_IMPL_BEOS 5
#define G_MODULE_IMPL @G_MODULE_IMPL@
#undef G_MODULE_HAVE_DLERROR