ltdl.h

00001 /* ltdl.h -- generic dlopen functions
00002    Copyright (C) 1998-2001, 2003, 2004, 2007 Free Software Foundation, Inc.
00003    Originally by Thomas Tanner <tanner@ffii.org>
00004    This file is part of GNU Libtool.
00005 
00006 This library is free software; you can redistribute it and/or
00007 modify it under the terms of the GNU Lesser General Public
00008 License as published by the Free Software Foundation; either
00009 version 2 of the License, or (at your option) any later version.
00010 
00011 As a special exception to the GNU Lesser General Public License,
00012 if you distribute this file as part of a program or library that
00013 is built using GNU libtool, you may include it under the same
00014 distribution terms that you use for the rest of that program.
00015 
00016 This library is distributed in the hope that it will be useful,
00017 but WITHOUT ANY WARRANTY; without even the implied warranty of
00018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00019 Lesser General Public License for more details.
00020 
00021 You should have received a copy of the GNU Lesser General Public
00022 License along with this library; if not, write to the Free
00023 Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
00024 02110-1301  USA
00025 */
00026 
00027 /* Only include this header file once. */
00028 #ifndef LTDL_H
00029 #define LTDL_H 1
00030 
00031 #include <sys/types.h>          /* for size_t declaration */
00032 
00033 
00034 /* --- MACROS FOR PORTABILITY --- */
00035 
00036 
00037 /* Saves on those hard to debug '\0' typos....  */
00038 #define LT_EOS_CHAR     '\0'
00039 
00040 /* LTDL_BEGIN_C_DECLS should be used at the beginning of your declarations,
00041    so that C++ compilers don't mangle their names.  Use LTDL_END_C_DECLS at
00042    the end of C declarations. */
00043 #ifdef __cplusplus
00044 # define LT_BEGIN_C_DECLS       extern "C" {
00045 # define LT_END_C_DECLS         }
00046 #else
00047 # define LT_BEGIN_C_DECLS       /* empty */
00048 # define LT_END_C_DECLS         /* empty */
00049 #endif
00050 
00051 LT_BEGIN_C_DECLS
00052 
00053 
00054 /* LT_PARAMS is a macro used to wrap function prototypes, so that compilers
00055    that don't understand ANSI C prototypes still work, and ANSI C
00056    compilers can issue warnings about type mismatches.  */
00057 #if defined (__STDC__) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(WIN32) || defined(__cplusplus)
00058 # define LT_PARAMS(protos)      protos
00059 # define lt_ptr         void*
00060 #else
00061 # define LT_PARAMS(protos)      ()
00062 # define lt_ptr         char*
00063 #endif
00064 
00065 /* LT_STMT_START/END are used to create macros which expand to a
00066    a single compound statement in a portable way.  */
00067 #if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
00068 #  define LT_STMT_START        (void)(
00069 #  define LT_STMT_END          )
00070 #else
00071 #  if (defined (sun) || defined (__sun__))
00072 #    define LT_STMT_START      if (1)
00073 #    define LT_STMT_END        else (void)0
00074 #  else
00075 #    define LT_STMT_START      do
00076 #    define LT_STMT_END        while (0)
00077 #  endif
00078 #endif
00079 
00080 /* LT_CONC creates a new concatenated symbol for the compiler
00081    in a portable way.  */
00082 #if defined(__STDC__) || defined(__cplusplus) || defined(_MSC_VER) || defined(_AIX)
00083 #  define LT_CONC(s,t)  s##t
00084 #else
00085 #  define LT_CONC(s,t)  s/**/t
00086 #endif
00087 
00088 /* LT_STRLEN can be used safely on NULL pointers.  */
00089 #define LT_STRLEN(s)    (((s) && (s)[0]) ? strlen (s) : 0)
00090 
00091 
00092 
00093 /* --- WINDOWS SUPPORT --- */
00094 
00095 
00096 /* Canonicalise Windows and Cygwin recognition macros.  */
00097 #ifdef __CYGWIN32__
00098 #  ifndef __CYGWIN__
00099 #    define __CYGWIN__ __CYGWIN32__
00100 #  endif
00101 #endif
00102 #if defined(_WIN32) || defined(WIN32)
00103 #  ifndef __WINDOWS__
00104 #    ifdef _WIN32
00105 #      define __WINDOWS__ _WIN32
00106 #    else
00107 #      ifdef WIN32
00108 #        define __WINDOWS__ WIN32
00109 #      endif
00110 #    endif
00111 #  endif
00112 #endif
00113 
00114 
00115 #ifdef __WINDOWS__
00116 #  ifndef __CYGWIN__
00117 /* LT_DIRSEP_CHAR is accepted *in addition* to '/' as a directory
00118    separator when it is set. */
00119 #    define LT_DIRSEP_CHAR      '\\'
00120 #    define LT_PATHSEP_CHAR     ';'
00121 #  endif
00122 #endif
00123 #ifndef LT_PATHSEP_CHAR
00124 #  define LT_PATHSEP_CHAR       ':'
00125 #endif
00126 
00127 /* DLL building support on win32 hosts;  mostly to workaround their
00128    ridiculous implementation of data symbol exporting. */
00129 #ifndef LT_SCOPE
00130 #  if defined(__WINDOWS__) || defined(__CYGWIN__)
00131 #    ifdef DLL_EXPORT           /* defined by libtool (if required) */
00132 #      define LT_SCOPE  __declspec(dllexport)
00133 #    endif
00134 #    ifdef LIBLTDL_DLL_IMPORT   /* define if linking with this dll */
00135        /* note: cygwin/mingw compilers can rely instead on auto-import */
00136 #      define LT_SCOPE  extern __declspec(dllimport)
00137 #    endif
00138 #  endif
00139 #  ifndef LT_SCOPE              /* static linking or !__WINDOWS__ */
00140 #    define LT_SCOPE    extern
00141 #  endif
00142 #endif
00143 
00144 
00145 #if defined(_MSC_VER) /* Visual Studio */
00146 #  define R_OK 4
00147 #endif
00148 
00149 
00150 
00151 /* --- DYNAMIC MODULE LOADING API --- */
00152 
00153 
00154 typedef struct lt_dlhandle_struct *lt_dlhandle; /* A loaded module.  */
00155 
00156 /* Initialisation and finalisation functions for libltdl. */
00157 LT_SCOPE        int         lt_dlinit           LT_PARAMS((void));
00158 LT_SCOPE        int         lt_dlexit           LT_PARAMS((void));
00159 
00160 /* Module search path manipulation.  */
00161 LT_SCOPE        int         lt_dladdsearchdir    LT_PARAMS((const char *search_dir));
00162 LT_SCOPE        int         lt_dlinsertsearchdir LT_PARAMS((const char *before,
00163                                                     const char *search_dir));
00164 LT_SCOPE        int         lt_dlsetsearchpath   LT_PARAMS((const char *search_path));
00165 LT_SCOPE        const char *lt_dlgetsearchpath   LT_PARAMS((void));
00166 LT_SCOPE        int         lt_dlforeachfile     LT_PARAMS((
00167                         const char *search_path,
00168                         int (*func) (const char *filename, lt_ptr data),
00169                         lt_ptr data));
00170 
00171 /* Portable libltdl versions of the system dlopen() API. */
00172 LT_SCOPE        lt_dlhandle lt_dlopen           LT_PARAMS((const char *filename));
00173 LT_SCOPE        lt_dlhandle lt_dlopenext        LT_PARAMS((const char *filename));
00174 LT_SCOPE        lt_ptr      lt_dlsym            LT_PARAMS((lt_dlhandle handle,
00175                                                      const char *name));
00176 LT_SCOPE        const char *lt_dlerror          LT_PARAMS((void));
00177 LT_SCOPE        int         lt_dlclose          LT_PARAMS((lt_dlhandle handle));
00178 
00179 /* Module residency management. */
00180 LT_SCOPE        int         lt_dlmakeresident   LT_PARAMS((lt_dlhandle handle));
00181 LT_SCOPE        int         lt_dlisresident     LT_PARAMS((lt_dlhandle handle));
00182 
00183 
00184 
00185 
00186 /* --- MUTEX LOCKING --- */
00187 
00188 
00189 typedef void    lt_dlmutex_lock         LT_PARAMS((void));
00190 typedef void    lt_dlmutex_unlock       LT_PARAMS((void));
00191 typedef void    lt_dlmutex_seterror     LT_PARAMS((const char *errmsg));
00192 typedef const char *lt_dlmutex_geterror LT_PARAMS((void));
00193 
00194 LT_SCOPE        int     lt_dlmutex_register     LT_PARAMS((lt_dlmutex_lock *lock,
00195                                             lt_dlmutex_unlock *unlock,
00196                                             lt_dlmutex_seterror *seterror,
00197                                             lt_dlmutex_geterror *geterror));
00198 
00199 
00200 
00201 
00202 /* --- MEMORY HANDLING --- */
00203 
00204 
00205 /* By default, the realloc function pointer is set to our internal
00206    realloc implementation which iself uses lt_dlmalloc and lt_dlfree.
00207    libltdl relies on a featureful realloc, but if you are sure yours
00208    has the right semantics then you can assign it directly.  Generally,
00209    it is safe to assign just a malloc() and a free() function.  */
00210 LT_SCOPE  lt_ptr   (*lt_dlmalloc)       LT_PARAMS((size_t size));
00211 LT_SCOPE  lt_ptr   (*lt_dlrealloc)      LT_PARAMS((lt_ptr ptr, size_t size));
00212 LT_SCOPE  void     (*lt_dlfree)         LT_PARAMS((lt_ptr ptr));
00213 
00214 
00215 
00216 
00217 /* --- PRELOADED MODULE SUPPORT --- */
00218 
00219 
00220 /* A preopened symbol. Arrays of this type comprise the exported
00221    symbols for a dlpreopened module. */
00222 typedef struct {
00223   const char *name;
00224   lt_ptr      address;
00225 } lt_dlsymlist;
00226 
00227 LT_SCOPE        int     lt_dlpreload    LT_PARAMS((const lt_dlsymlist *preloaded));
00228 LT_SCOPE        int     lt_dlpreload_default
00229                                 LT_PARAMS((const lt_dlsymlist *preloaded));
00230 
00231 #define LTDL_SET_PRELOADED_SYMBOLS()            LT_STMT_START{  \
00232         extern const lt_dlsymlist lt_preloaded_symbols[];               \
00233         lt_dlpreload_default(lt_preloaded_symbols);                     \
00234                                                 }LT_STMT_END
00235 
00236 
00237 
00238 
00239 /* --- MODULE INFORMATION --- */
00240 
00241 
00242 /* Read only information pertaining to a loaded module. */
00243 typedef struct {
00244   char  *filename;              /* file name */
00245   char  *name;                  /* module name */
00246   int   ref_count;              /* number of times lt_dlopened minus
00247                                    number of times lt_dlclosed. */
00248 } lt_dlinfo;
00249 
00250 LT_SCOPE        const lt_dlinfo *lt_dlgetinfo       LT_PARAMS((lt_dlhandle handle));
00251 LT_SCOPE        lt_dlhandle     lt_dlhandle_next    LT_PARAMS((lt_dlhandle place));
00252 LT_SCOPE        int             lt_dlforeach        LT_PARAMS((
00253                                 int (*func) (lt_dlhandle handle, lt_ptr data),
00254                                 lt_ptr data));
00255 
00256 /* Associating user data with loaded modules. */
00257 typedef unsigned lt_dlcaller_id;
00258 
00259 LT_SCOPE        lt_dlcaller_id  lt_dlcaller_register  LT_PARAMS((void));
00260 LT_SCOPE        lt_ptr          lt_dlcaller_set_data  LT_PARAMS((lt_dlcaller_id key,
00261                                                 lt_dlhandle handle,
00262                                                 lt_ptr data));
00263 LT_SCOPE        lt_ptr          lt_dlcaller_get_data  LT_PARAMS((lt_dlcaller_id key,
00264                                                 lt_dlhandle handle));
00265 
00266 
00267 
00268 /* --- USER MODULE LOADER API --- */
00269 
00270 
00271 typedef struct lt_dlloader      lt_dlloader;
00272 typedef lt_ptr                  lt_user_data;
00273 typedef lt_ptr                  lt_module;
00274 
00275 /* Function pointer types for creating user defined module loaders. */
00276 typedef lt_module   lt_module_open      LT_PARAMS((lt_user_data loader_data,
00277                                             const char *filename));
00278 typedef int         lt_module_close     LT_PARAMS((lt_user_data loader_data,
00279                                             lt_module handle));
00280 typedef lt_ptr      lt_find_sym         LT_PARAMS((lt_user_data loader_data,
00281                                             lt_module handle,
00282                                             const char *symbol));
00283 typedef int         lt_dlloader_exit    LT_PARAMS((lt_user_data loader_data));
00284 
00285 struct lt_user_dlloader {
00286   const char           *sym_prefix;
00287   lt_module_open       *module_open;
00288   lt_module_close      *module_close;
00289   lt_find_sym          *find_sym;
00290   lt_dlloader_exit     *dlloader_exit;
00291   lt_user_data          dlloader_data;
00292 };
00293 
00294 LT_SCOPE        lt_dlloader    *lt_dlloader_next    LT_PARAMS((lt_dlloader *place));
00295 LT_SCOPE        lt_dlloader    *lt_dlloader_find    LT_PARAMS((
00296                                                 const char *loader_name));
00297 LT_SCOPE        const char     *lt_dlloader_name    LT_PARAMS((lt_dlloader *place));
00298 LT_SCOPE        lt_user_data   *lt_dlloader_data    LT_PARAMS((lt_dlloader *place));
00299 LT_SCOPE        int             lt_dlloader_add     LT_PARAMS((lt_dlloader *place,
00300                                 const struct lt_user_dlloader *dlloader,
00301                                 const char *loader_name));
00302 LT_SCOPE        int             lt_dlloader_remove  LT_PARAMS((
00303                                                 const char *loader_name));
00304 
00305 
00306 
00307 /* --- ERROR MESSAGE HANDLING --- */
00308 
00309 
00310 /* Defining error strings alongside their symbolic names in a macro in
00311    this way allows us to expand the macro in different contexts with
00312    confidence that the enumeration of symbolic names will map correctly
00313    onto the table of error strings.  */
00314 #define lt_dlerror_table                                                \
00315     LT_ERROR(UNKNOWN,               "unknown error")                    \
00316     LT_ERROR(DLOPEN_NOT_SUPPORTED,  "dlopen support not available")     \
00317     LT_ERROR(INVALID_LOADER,        "invalid loader")                   \
00318     LT_ERROR(INIT_LOADER,           "loader initialization failed")     \
00319     LT_ERROR(REMOVE_LOADER,         "loader removal failed")            \
00320     LT_ERROR(FILE_NOT_FOUND,        "file not found")                   \
00321     LT_ERROR(DEPLIB_NOT_FOUND,      "dependency library not found")     \
00322     LT_ERROR(NO_SYMBOLS,            "no symbols defined")               \
00323     LT_ERROR(CANNOT_OPEN,           "can't open the module")            \
00324     LT_ERROR(CANNOT_CLOSE,          "can't close the module")           \
00325     LT_ERROR(SYMBOL_NOT_FOUND,      "symbol not found")                 \
00326     LT_ERROR(NO_MEMORY,             "not enough memory")                \
00327     LT_ERROR(INVALID_HANDLE,        "invalid module handle")            \
00328     LT_ERROR(BUFFER_OVERFLOW,       "internal buffer overflow")         \
00329     LT_ERROR(INVALID_ERRORCODE,     "invalid errorcode")                \
00330     LT_ERROR(SHUTDOWN,              "library already shutdown")         \
00331     LT_ERROR(CLOSE_RESIDENT_MODULE, "can't close resident module")      \
00332     LT_ERROR(INVALID_MUTEX_ARGS,    "invalid mutex handler registration") \
00333     LT_ERROR(INVALID_POSITION,      "invalid search path insert position")
00334 
00335 /* Enumerate the symbolic error names. */
00336 enum {
00337 #define LT_ERROR(name, diagnostic)      LT_CONC(LT_ERROR_, name),
00338         lt_dlerror_table
00339 #undef LT_ERROR
00340 
00341         LT_ERROR_MAX
00342 };
00343 
00344 /* These functions are only useful from inside custom module loaders. */
00345 LT_SCOPE        int     lt_dladderror   LT_PARAMS((const char *diagnostic));
00346 LT_SCOPE        int     lt_dlseterror   LT_PARAMS((int errorcode));
00347 
00348 
00349 
00350 
00351 /* --- SOURCE COMPATIBILITY WITH OLD LIBLTDL --- */
00352 
00353 
00354 #ifdef LT_NON_POSIX_NAMESPACE
00355 #  define lt_ptr_t              lt_ptr
00356 #  define lt_module_t           lt_module
00357 #  define lt_module_open_t      lt_module_open
00358 #  define lt_module_close_t     lt_module_close
00359 #  define lt_find_sym_t         lt_find_sym
00360 #  define lt_dlloader_exit_t    lt_dlloader_exit
00361 #  define lt_dlloader_t         lt_dlloader
00362 #  define lt_dlloader_data_t    lt_user_data
00363 #endif
00364 
00365 LT_END_C_DECLS
00366 
00367 #endif /* !LTDL_H */

Generated on Tue Oct 7 20:25:47 2008 for spandsp by  doxygen 1.5.6