Add G_MODULE_IMPL_OS2
authorAsbjørn Pettersen <asbjoer@src.gnome.org>
Wed, 7 Apr 1999 18:17:38 +0000 (18:17 +0000)
committerAsbjørn Pettersen <asbjoer@src.gnome.org>
Wed, 7 Apr 1999 18:17:38 +0000 (18:17 +0000)
gmodule/ChangeLog
gmodule/gmodule-os2.c [new file with mode: 0644]
gmodule/gmodule.c
gmodule/gmoduleconf.h.in

index 514cca8011335c9e1cb5750a06087e896f19adb4..bdac0704552508bc2aec359a349176c082161d1e 100644 (file)
@@ -1,3 +1,9 @@
+Wed Apr  7 20:12:58 1999  ape@lrdpf.spacetec.no  (Asbjorn Pettersen)
+
+       * gmodule-os2.c: OS/2 specific file for gmodule.
+       * gmodule.c (_g_module_open): Add gmodule-os2.c if G_MODULE_IMPL_OS2.
+       * gmoduleconf.h.in: Add G_MODULE_IMPL_OS2.
+
 Wed Feb 10 12:06:30 1999  Tim Janik  <timj@gtk.org>
 
        * gmodule.c (CHECK_ERROR): be more descriptive on unsupported systems.
diff --git a/gmodule/gmodule-os2.c b/gmodule/gmodule-os2.c
new file mode 100644 (file)
index 0000000..7cfa720
--- /dev/null
@@ -0,0 +1,144 @@
+/* GMODULE - GLIB wrapper code for dynamic module loading
+ * Copyright (C) 1998 Tim Janik
+ *
+ * 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.
+ */
+
+/*
+ * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
+ * file for a list of people on the GLib Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/. 
+ */
+
+/* 
+ * MT safe
+ */
+
+#include <dlfcn.h>
+
+/* Perl includes <nlist.h> and <link.h> instead of <dlfcn.h> on some systmes? */
+
+
+/* dlerror() is not implemented on all systems
+ */
+#ifndef        G_MODULE_HAVE_DLERROR
+#  ifdef __NetBSD__
+#    define dlerror()  g_strerror (errno)
+#  else /* !__NetBSD__ */
+/* could we rely on errno's state here? */
+#    define dlerror()  "unknown dl-error"
+#  endif /* !__NetBSD__ */
+#endif /* G_MODULE_HAVE_DLERROR */
+
+/* some flags are missing on some systems, so we provide
+ * harmless defaults.
+ * The Perl sources say, RTLD_LAZY needs to be defined as (1),
+ * at least for Solaris 1.
+ *
+ * Mandatory:
+ * RTLD_LAZY   - resolve undefined symbols as code from the dynamic library
+ *              is executed.
+ * RTLD_NOW    - resolve all undefined symbols before dlopen returns, and fail
+ *              if this cannot be done.
+ * Optionally:
+ * RTLD_GLOBAL - the external symbols defined in the library will be made
+ *              available to subsequently loaded libraries.
+ */
+#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 */
+
+
+/* --- functions --- */
+static gpointer
+_g_module_open (const gchar    *file_name,
+               gboolean        bind_lazy)
+{
+  gpointer handle;
+  
+  handle = dlopen (file_name, RTLD_GLOBAL | (bind_lazy ? RTLD_LAZY : RTLD_NOW));
+  if (!handle)
+    g_module_set_error (dlerror ());
+  
+  return handle;
+}
+
+static gpointer
+_g_module_self (void)
+{
+  gpointer handle;
+  
+  /* to query symbols from the program itself, special link options
+   * are required on some systems.
+   */
+  
+/* XXX, not supported */
+  handle = NULL;
+  
+  return handle;
+}
+
+static void
+_g_module_close (gpointer        handle,
+                gboolean         is_unref)
+{
+  /* are there any systems out there that have dlopen()/dlclose()
+   * without a reference count implementation?
+   */
+  is_unref |= 1;
+  
+  if (is_unref)
+    {
+/* XXX, no return code */
+      dlclose (handle);
+    }
+}
+
+static gpointer
+_g_module_symbol (gpointer       handle,
+                 const gchar    *symbol_name)
+{
+  gpointer p;
+  
+  p = dlsym (handle, symbol_name);
+  if (!p)
+    g_module_set_error (dlerror ());
+  
+  return p;
+}
+
+static gchar*
+_g_module_build_path (const gchar *directory,
+                     const gchar *module_name)
+{
+  gchar *suffix = strrchr(module_name, '.');
+  if (directory && *directory)
+    if (suffix && (stricmp (suffix, ".dll") == 0))
+      return g_strconcat (directory, "/", module_name, NULL);
+    else
+      return g_strconcat (directory, "/", module_name, ".dll", NULL);
+  else if (suffix && (stricmp (suffix, ".dll") == 0))
+    return g_strdup (module_name);
+  else
+    return g_strconcat (module_name, ".dll", NULL);
+}
index e0ffc7bca5b602ebc52f04792b62899bddce30cc..b176a16e0f233de101ee5e3ebe37219608cda277 100644 (file)
@@ -134,6 +134,8 @@ g_module_set_error (const gchar *error)
 #include "gmodule-dld.c"
 #elif  (G_MODULE_IMPL == G_MODULE_IMPL_WIN32)
 #include "gmodule-win32.c"
+#elif  (G_MODULE_IMPL == G_MODULE_IMPL_OS2)
+#include "gmodule-os2.c"
 #else
 #undef CHECK_ERROR
 #define        CHECK_ERROR(rv) { g_module_set_error ("dynamic modules are " \
index ee2aa5c3c2e41232639aced3f1522d581f74dd3d..0f3b6f9ed24af0c2e77a9b1bdf915d069c130812 100644 (file)
@@ -29,6 +29,7 @@ extern "C" {
 #define        G_MODULE_IMPL_DL        1
 #define        G_MODULE_IMPL_DLD       2
 #define        G_MODULE_IMPL_WIN32     3
+#define        G_MODULE_IMPL_OS2       4
 
 #define        G_MODULE_IMPL           @G_MODULE_IMPL@
 #undef G_MODULE_HAVE_DLERROR