From 76a78f059ac215b131258e87fc5195f218e088c5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Asbj=C3=B8rn=20Pettersen?= Date: Wed, 7 Apr 1999 18:17:38 +0000 Subject: [PATCH] Add G_MODULE_IMPL_OS2 --- gmodule/ChangeLog | 6 ++ gmodule/gmodule-os2.c | 144 +++++++++++++++++++++++++++++++++++++++ gmodule/gmodule.c | 2 + gmodule/gmoduleconf.h.in | 1 + 4 files changed, 153 insertions(+) create mode 100644 gmodule/gmodule-os2.c diff --git a/gmodule/ChangeLog b/gmodule/ChangeLog index 514cca80..bdac0704 100644 --- a/gmodule/ChangeLog +++ b/gmodule/ChangeLog @@ -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 * 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 index 00000000..7cfa720d --- /dev/null +++ b/gmodule/gmodule-os2.c @@ -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 + +/* Perl includes and instead of 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); +} diff --git a/gmodule/gmodule.c b/gmodule/gmodule.c index e0ffc7bc..b176a16e 100644 --- a/gmodule/gmodule.c +++ b/gmodule/gmodule.c @@ -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 " \ diff --git a/gmodule/gmoduleconf.h.in b/gmodule/gmoduleconf.h.in index ee2aa5c3..0f3b6f9e 100644 --- a/gmodule/gmoduleconf.h.in +++ b/gmodule/gmoduleconf.h.in @@ -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 -- 2.34.1