diff options
author | Asbjørn Pettersen <asbjoer@src.gnome.org> | 1999-04-07 18:17:38 +0000 |
---|---|---|
committer | Asbjørn Pettersen <asbjoer@src.gnome.org> | 1999-04-07 18:17:38 +0000 |
commit | 76a78f059ac215b131258e87fc5195f218e088c5 (patch) | |
tree | bbf6c5ce71efad5d4f2e1f8bf30399f40689c2b8 /gmodule | |
parent | 8b63644aabc2754aee20815b52e121b38dda9d3e (diff) | |
download | glib-76a78f059ac215b131258e87fc5195f218e088c5.tar.gz |
Add G_MODULE_IMPL_OS2
Diffstat (limited to 'gmodule')
-rw-r--r-- | gmodule/ChangeLog | 6 | ||||
-rw-r--r-- | gmodule/gmodule-os2.c | 144 | ||||
-rw-r--r-- | gmodule/gmodule.c | 2 | ||||
-rw-r--r-- | gmodule/gmoduleconf.h.in | 1 |
4 files changed, 153 insertions, 0 deletions
diff --git a/gmodule/ChangeLog b/gmodule/ChangeLog index 514cca801..bdac07045 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 <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 index 000000000..7cfa720d3 --- /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 <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); +} diff --git a/gmodule/gmodule.c b/gmodule/gmodule.c index e0ffc7bca..b176a16e0 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 ee2aa5c3c..0f3b6f9ed 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 |