diff options
Diffstat (limited to 'freebsd/dependencies/imlib/files/patch-gmodule.diff')
| -rw-r--r-- | freebsd/dependencies/imlib/files/patch-gmodule.diff | 734 | 
1 files changed, 734 insertions, 0 deletions
| diff --git a/freebsd/dependencies/imlib/files/patch-gmodule.diff b/freebsd/dependencies/imlib/files/patch-gmodule.diff new file mode 100644 index 000000000..6aed03bc7 --- /dev/null +++ b/freebsd/dependencies/imlib/files/patch-gmodule.diff @@ -0,0 +1,734 @@ +--- imlib-1.9.15.orig/gdk_imlib/local-hack-gmodule/gmodule-dl.c ++++ imlib-1.9.15/gdk_imlib/local-hack-gmodule/gmodule-dl.c +@@ -0,0 +1,158 @@ ++/* GMODULE - GLIB wrapper code for dynamic module loading ++ * Copyright (C) 1998, 2000 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	LOCAL_HACK_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	/* LOCAL_HACK_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_LAZY ++#define	RTLD_LAZY	1 ++#endif	/* RTLD_LAZY */ ++#ifndef	RTLD_NOW ++#define	RTLD_NOW	0 ++#endif	/* RTLD_NOW */ ++/* some systems (OSF1 V5.0) have broken RTLD_GLOBAL linkage */ ++#ifdef LOCAL_HACK_G_MODULE_BROKEN_RTLD_GLOBAL ++#undef  RTLD_GLOBAL ++#endif /* LOCAL_HACK_G_MODULE_BROKEN_RTLD_GLOBAL */ ++#ifndef	RTLD_GLOBAL ++#define	RTLD_GLOBAL	0 ++#endif	/* RTLD_GLOBAL */ ++ ++ ++/* --- functions --- */ ++static gchar* ++fetch_dlerror (void) ++{ ++  gchar *msg = dlerror (); ++ ++  /* make sure we always return an error message != NULL */ ++ ++  return msg ? msg : "unknown dl-error"; ++} ++ ++static gpointer ++_local_hack_g_module_open (const gchar *file_name, ++		gboolean     bind_lazy) ++{ ++  gpointer handle; ++   ++  handle = dlopen (file_name, (bind_lazy ? RTLD_LAZY : RTLD_NOW)); ++  if (!handle) ++    local_hack_g_module_set_error (fetch_dlerror ()); ++   ++  return handle; ++} ++ ++static gpointer ++_local_hack_g_module_self (void) ++{ ++  gpointer handle; ++   ++  /* to query symbols from the program itself, special link options ++   * are required on some systems. ++   */ ++   ++  handle = dlopen (NULL, RTLD_LAZY); ++  if (!handle) ++    local_hack_g_module_set_error (fetch_dlerror ()); ++   ++  return handle; ++} ++ ++static void ++_local_hack_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) ++    { ++      if (dlclose (handle) != 0) ++	local_hack_g_module_set_error (fetch_dlerror ()); ++    } ++} ++ ++static gpointer ++_local_hack_g_module_symbol (gpointer     handle, ++		  const gchar *symbol_name) ++{ ++  gpointer p; ++   ++  p = dlsym (handle, symbol_name); ++  if (!p) ++    local_hack_g_module_set_error (fetch_dlerror ()); ++   ++  return p; ++} ++ ++static gchar* ++_local_hack_g_module_build_path (const gchar *directory, ++		      const gchar *module_name) ++{ ++  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); ++} +--- imlib-1.9.15.orig/gdk_imlib/local-hack-gmodule/gmodule-local.h ++++ imlib-1.9.15/gdk_imlib/local-hack-gmodule/gmodule-local.h +@@ -0,0 +1,100 @@ ++/* 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/.  ++ */ ++ ++#ifndef __GMODULE_H__ ++#define __GMODULE_H__ ++ ++#include <glib.h> ++ ++#ifdef __cplusplus ++extern "C" { ++#endif /* __cplusplus */ ++ ++/* exporting and importing functions, this is special cased ++ * to feature Windows dll stubs. ++ */ ++#define	LOCAL_HACK_G_MODULE_IMPORT		extern ++#ifdef NATIVE_WIN32 ++#  define	LOCAL_HACK_G_MODULE_EXPORT		__declspec(dllexport) ++#else /* !NATIVE_WIN32 */ ++#  define	LOCAL_HACK_G_MODULE_EXPORT ++#endif /* !NATIVE_WIN32 */ ++ ++typedef enum ++{ ++  LOCAL_HACK_G_MODULE_BIND_LAZY	= 1 << 0, ++  LOCAL_HACK_G_MODULE_BIND_MASK	= 0x01 ++} LocalHackGModuleFlags; ++ ++typedef	struct _LocalHackGModule			 LocalHackGModule; ++typedef const gchar* (*LocalHackGModuleCheckInit) (LocalHackGModule	*module); ++typedef void	     (*LocalHackGModuleUnload)	 (LocalHackGModule	*module); ++ ++/* return TRUE if dynamic module loading is supported */ ++gboolean	local_hack_g_module_supported	   (void); ++ ++/* open a module `file_name' and return handle, which is NULL on error */ ++LocalHackGModule*	local_hack_g_module_open		   (const gchar		*file_name, ++					    LocalHackGModuleFlags	 flags); ++ ++/* close a previously opened module, returns TRUE on success */ ++gboolean	local_hack_g_module_close		   (LocalHackGModule		*module); ++ ++/* make a module resident so local_hack_g_module_close on it will be ignored */ ++void		local_hack_g_module_make_resident	   (LocalHackGModule		*module); ++ ++/* query the last module error as a string */ ++gchar*		local_hack_g_module_error		   (void); ++ ++/* retrive a symbol pointer from `module', returns TRUE on success */ ++gboolean	local_hack_g_module_symbol		   (LocalHackGModule		*module, ++					    const gchar		*symbol_name, ++					    gpointer		*symbol); ++ ++/* retrive the file name from an existing module */ ++gchar*		local_hack_g_module_name		   (LocalHackGModule		*module); ++ ++ ++/* Build the actual file name containing a module. `directory' is the ++ * directory where the module file is supposed to be, or NULL or empty ++ * in which case it should either be in the current directory or, on ++ * some operating systems, in some standard place, for instance on the ++ * PATH. Hence, to be absoultely sure to get the correct module, ++ * always pass in a directory. The file name consists of the directory, ++ * if supplied, and `module_name' suitably decorated accoring to ++ * the operating system's conventions (for instance lib*.so or *.dll). ++ * ++ * No checks are made that the file exists, or is of correct type. ++ */ ++gchar*		local_hack_g_module_build_path	  (const gchar		*directory, ++					   const gchar		*module_name); ++ ++#ifdef __cplusplus ++} ++#endif /* __cplusplus */ ++ ++ ++#endif /* __GMODULE_H__ */ +--- imlib-1.9.15.orig/gdk_imlib/local-hack-gmodule/gmoduleconf.h ++++ imlib-1.9.15/gdk_imlib/local-hack-gmodule/gmoduleconf.h +@@ -0,0 +1,45 @@ ++/* 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. ++ */ ++#ifndef __LOCAL_HACK_G_MODULE_CONF_H__ ++#define __LOCAL_HACK_G_MODULE_CONF_H__ ++ ++ ++#ifdef __cplusplus ++extern "C" { ++#endif /* __cplusplus */ ++ ++ ++#define	LOCAL_HACK_G_MODULE_IMPL_NONE	0 ++#define	LOCAL_HACK_G_MODULE_IMPL_DL	1 ++#define	LOCAL_HACK_G_MODULE_IMPL_DLD	2 ++#define	LOCAL_HACK_G_MODULE_IMPL_WIN32	3 ++ ++#define	LOCAL_HACK_G_MODULE_IMPL		LOCAL_HACK_G_MODULE_IMPL_DL ++#undef	LOCAL_HACK_G_MODULE_HAVE_DLERROR ++#if	(1) ++#define	LOCAL_HACK_G_MODULE_HAVE_DLERROR ++#endif ++ ++ ++#ifdef __cplusplus ++} ++#endif /* __cplusplus */ ++ ++ ++#endif /* __LOCAL_HACK_G_MODULE_CONF_H__ */ +--- imlib-1.9.15.orig/gdk_imlib/local-hack-gmodule/gmodule-local.c ++++ imlib-1.9.15/gdk_imlib/local-hack-gmodule/gmodule-local.c +@@ -0,0 +1,418 @@ ++/* 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	"gmodule-local.h" ++#include	"gmoduleconf.h" ++#include	<errno.h> ++#include	<string.h> ++ ++ ++/* We maintain a list of modules, so we can reference count them. ++ * That's needed because some platforms don't support refernce counts on ++ * modules e.g. the shl_* implementation of HP-UX ++ * (http://www.stat.umn.edu/~luke/xls/projects/dlbasics/dlbasics.html). ++ * Also, the module for the program itself is kept seperatedly for ++ * faster access and because it has special semantics. ++ */ ++ ++ ++/* --- structures --- */ ++struct _LocalHackGModule ++{ ++  gchar	*file_name; ++  gpointer handle; ++  guint ref_count : 31; ++  guint is_resident : 1; ++  LocalHackGModuleUnload unload; ++  LocalHackGModule *next; ++}; ++ ++ ++/* --- prototypes --- */ ++static gpointer		_local_hack_g_module_open		(const gchar	*file_name, ++						 gboolean	 bind_lazy); ++static void		_local_hack_g_module_close		(gpointer	 handle, ++						 gboolean	 is_unref); ++static gpointer		_local_hack_g_module_self		(void); ++static gpointer		_local_hack_g_module_symbol	(gpointer	 handle, ++						 const gchar	*symbol_name); ++static gchar*		_local_hack_g_module_build_path	(const gchar	*directory, ++						 const gchar	*module_name); ++static inline void	local_hack_g_module_set_error	(const gchar	*error); ++static inline LocalHackGModule*	local_hack_g_module_find_by_handle (gpointer	 handle); ++static inline LocalHackGModule*	local_hack_g_module_find_by_name	(const gchar	*name); ++ ++ ++/* --- variables --- */ ++G_LOCK_DEFINE_STATIC (LocalHackGModule); ++static LocalHackGModule	     *modules = NULL; ++static LocalHackGModule	     *main_module = NULL; ++static GStaticPrivate module_error_private = G_STATIC_PRIVATE_INIT; ++ ++ ++/* --- inline functions --- */ ++static inline LocalHackGModule* ++local_hack_g_module_find_by_handle (gpointer handle) ++{ ++  LocalHackGModule *module; ++  LocalHackGModule *retval = NULL; ++   ++  G_LOCK (LocalHackGModule); ++  if (main_module && main_module->handle == handle) ++    retval = main_module; ++  else ++    for (module = modules; module; module = module->next) ++      if (handle == module->handle) ++	{ ++	  retval = module; ++	  break; ++	} ++  G_UNLOCK (LocalHackGModule); ++ ++  return retval; ++} ++ ++static inline LocalHackGModule* ++local_hack_g_module_find_by_name (const gchar *name) ++{ ++  LocalHackGModule *module; ++  LocalHackGModule *retval = NULL; ++   ++  G_LOCK (LocalHackGModule); ++  for (module = modules; module; module = module->next) ++    if (strcmp (name, module->file_name) == 0) ++	{ ++	  retval = module; ++	  break; ++	} ++  G_UNLOCK (LocalHackGModule); ++ ++  return retval; ++} ++ ++static inline void ++local_hack_g_module_set_error (const gchar *error) ++{ ++  g_static_private_set (&module_error_private, g_strdup (error), g_free); ++  errno = 0; ++} ++ ++ ++/* --- include platform specifc code --- */ ++#define	SUPPORT_OR_RETURN(rv)	{ local_hack_g_module_set_error (NULL); } ++#if	(LOCAL_HACK_G_MODULE_IMPL == LOCAL_HACK_G_MODULE_IMPL_DL) ++#include "gmodule-dl.c" ++#elif	(LOCAL_HACK_G_MODULE_IMPL == LOCAL_HACK_G_MODULE_IMPL_DLD) ++#include "gmodule-dld.c" ++#elif	(LOCAL_HACK_G_MODULE_IMPL == LOCAL_HACK_G_MODULE_IMPL_WIN32) ++#include "gmodule-win32.c" ++#else ++#undef	SUPPORT_OR_RETURN ++#define	SUPPORT_OR_RETURN(rv)	{ local_hack_g_module_set_error ("dynamic modules are " \ ++                                              "not supported by this system"); return rv; } ++static gpointer ++_local_hack_g_module_open (const gchar	*file_name, ++		gboolean	 bind_lazy) ++{ ++  return NULL; ++} ++static void ++_local_hack_g_module_close	(gpointer	 handle, ++		 gboolean	 is_unref) ++{ ++} ++static gpointer ++_local_hack_g_module_self (void) ++{ ++  return NULL; ++} ++static gpointer ++_local_hack_g_module_symbol (gpointer	 handle, ++		  const gchar	*symbol_name) ++{ ++  return NULL; ++} ++static gchar* ++_local_hack_g_module_build_path (const gchar *directory, ++		      const gchar *module_name) ++{ ++  return NULL; ++} ++#endif	/* no implementation */ ++ ++#if defined (NATIVE_WIN32) && defined (__LCC__) ++int __stdcall  ++LibMain (void         *hinstDll, ++	 unsigned long dwReason, ++	 void         *reserved) ++{ ++  return 1; ++} ++#endif /* NATIVE_WIN32 && __LCC__ */ ++ ++ ++/* --- functions --- */ ++gboolean ++local_hack_g_module_supported (void) ++{ ++  SUPPORT_OR_RETURN (FALSE); ++   ++  return TRUE; ++} ++ ++LocalHackGModule* ++local_hack_g_module_open (const gchar    *file_name, ++	       LocalHackGModuleFlags    flags) ++{ ++  LocalHackGModule *module; ++  gpointer handle; ++   ++  SUPPORT_OR_RETURN (NULL); ++   ++  if (!file_name) ++    {       ++      G_LOCK (LocalHackGModule); ++      if (!main_module) ++	{ ++	  handle = _local_hack_g_module_self (); ++	  if (handle) ++	    { ++	      main_module = g_new (LocalHackGModule, 1); ++	      main_module->file_name = NULL; ++	      main_module->handle = handle; ++	      main_module->ref_count = 1; ++	      main_module->is_resident = TRUE; ++	      main_module->unload = NULL; ++	      main_module->next = NULL; ++	    } ++	} ++      G_UNLOCK (LocalHackGModule); ++ ++      return main_module; ++    } ++   ++  /* we first search the module list by name */ ++  module = local_hack_g_module_find_by_name (file_name); ++  if (module) ++    { ++      module->ref_count++; ++       ++      return module; ++    } ++   ++  /* open the module */ ++  handle = _local_hack_g_module_open (file_name, (flags & LOCAL_HACK_G_MODULE_BIND_LAZY) != 0); ++  if (handle) ++    { ++      gchar *saved_error; ++      LocalHackGModuleCheckInit check_init; ++      const gchar *check_failed = NULL; ++       ++      /* search the module list by handle, since file names are not unique */ ++      module = local_hack_g_module_find_by_handle (handle); ++      if (module) ++	{ ++	  _local_hack_g_module_close (module->handle, TRUE); ++	  module->ref_count++; ++	  local_hack_g_module_set_error (NULL); ++	   ++	  return module; ++	} ++       ++      saved_error = g_strdup (local_hack_g_module_error ()); ++      local_hack_g_module_set_error (NULL); ++       ++      module = g_new (LocalHackGModule, 1); ++      module->file_name = g_strdup (file_name); ++      module->handle = handle; ++      module->ref_count = 1; ++      module->is_resident = FALSE; ++      module->unload = NULL; ++      G_LOCK (LocalHackGModule); ++      module->next = modules; ++      modules = module; ++      G_UNLOCK (LocalHackGModule); ++       ++      /* check initialization */ ++      if (local_hack_g_module_symbol (module, "local_hack_g_module_check_init", (gpointer) &check_init)) ++	check_failed = check_init (module); ++       ++      /* we don't call unload() if the initialization check failed. */ ++      if (!check_failed) ++	local_hack_g_module_symbol (module, "local_hack_g_module_unload", (gpointer) &module->unload); ++       ++      if (check_failed) ++	{ ++	  gchar *error; ++ ++	  error = g_strconcat ("LocalHackGModule initialization check failed: ", check_failed, NULL); ++	  local_hack_g_module_close (module); ++	  module = NULL; ++	  local_hack_g_module_set_error (error); ++	  g_free (error); ++	} ++      else ++	local_hack_g_module_set_error (saved_error); ++ ++      g_free (saved_error); ++    } ++   ++  return module; ++} ++ ++gboolean ++local_hack_g_module_close (LocalHackGModule	       *module) ++{ ++  SUPPORT_OR_RETURN (FALSE); ++   ++  g_return_val_if_fail (module != NULL, FALSE); ++  g_return_val_if_fail (module->ref_count > 0, FALSE); ++   ++  module->ref_count--; ++   ++  if (!module->ref_count && !module->is_resident && module->unload) ++    { ++      LocalHackGModuleUnload unload; ++ ++      unload = module->unload; ++      module->unload = NULL; ++      unload (module); ++    } ++ ++  if (!module->ref_count && !module->is_resident) ++    { ++      LocalHackGModule *last; ++      LocalHackGModule *node; ++       ++      last = NULL; ++       ++      G_LOCK (LocalHackGModule); ++      node = modules; ++      while (node) ++	{ ++	  if (node == module) ++	    { ++	      if (last) ++		last->next = node->next; ++	      else ++		modules = node->next; ++	      break; ++	    } ++	  last = node; ++	  node = last->next; ++	} ++      module->next = NULL; ++      G_UNLOCK (LocalHackGModule); ++       ++      _local_hack_g_module_close (module->handle, FALSE); ++      g_free (module->file_name); ++       ++      g_free (module); ++    } ++   ++  return local_hack_g_module_error() == NULL; ++} ++ ++void ++local_hack_g_module_make_resident (LocalHackGModule *module) ++{ ++  g_return_if_fail (module != NULL); ++ ++  module->is_resident = TRUE; ++} ++ ++gchar* ++local_hack_g_module_error (void) ++{ ++  return g_static_private_get (&module_error_private); ++} ++ ++gboolean ++local_hack_g_module_symbol (LocalHackGModule	*module, ++		 const gchar	*symbol_name, ++		 gpointer	*symbol) ++{ ++  gchar *module_error; ++ ++  if (symbol) ++    *symbol = NULL; ++  SUPPORT_OR_RETURN (FALSE); ++   ++  g_return_val_if_fail (module != NULL, FALSE); ++  g_return_val_if_fail (symbol_name != NULL, FALSE); ++  g_return_val_if_fail (symbol != NULL, FALSE); ++   ++#ifdef	LOCAL_HACK_G_MODULE_NEED_USCORE ++  { ++    gchar *name; ++ ++    name = g_strconcat ("_", symbol_name, NULL); ++    *symbol = _local_hack_g_module_symbol (module->handle, name); ++    g_free (name); ++  } ++#else	/* !LOCAL_HACK_G_MODULE_NEED_USCORE */ ++  *symbol = _local_hack_g_module_symbol (module->handle, symbol_name); ++#endif	/* !LOCAL_HACK_G_MODULE_NEED_USCORE */ ++   ++  module_error = local_hack_g_module_error (); ++  if (module_error) ++    { ++      gchar *error; ++ ++      error = g_strconcat ("`", symbol_name, "': ", module_error, NULL); ++      local_hack_g_module_set_error (error); ++      g_free (error); ++      *symbol = NULL; ++ ++      return FALSE; ++    } ++   ++  return TRUE; ++} ++ ++gchar* ++local_hack_g_module_name (LocalHackGModule *module) ++{ ++  g_return_val_if_fail (module != NULL, NULL); ++   ++  if (module == main_module) ++    return "main"; ++   ++  return module->file_name; ++} ++ ++gchar* ++local_hack_g_module_build_path (const gchar *directory, ++		     const gchar *module_name) ++{ ++  g_return_val_if_fail (module_name != NULL, NULL); ++   ++  return _local_hack_g_module_build_path (directory, module_name); ++} + | 
