1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-12 06:41:13 +02:00

* upstream/ltdl.c: New copy from libtool 1.4.3.

* raw-ltdl.c: Merged in changes from libtool 1.4.3.
This commit is contained in:
Marius Vollmer 2002-10-25 15:02:46 +00:00
parent fc41ba03f3
commit f5d6f0fcab
2 changed files with 374 additions and 313 deletions

View file

@ -94,6 +94,11 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
#include "raw-ltdl.h" #include "raw-ltdl.h"
#if WITH_DMALLOC
# include <dmalloc.h>
#endif
/* Saves on those hard to debug '\0' typos.... */ /* Saves on those hard to debug '\0' typos.... */
#define LT_EOS_CHAR '\0' #define LT_EOS_CHAR '\0'
@ -167,6 +172,18 @@ SCMLTSTATIC LT_GLOBAL_DATA void (*lt_dlfree) LT_PARAMS((lt_ptr ptr))
/* The following macros reduce the amount of typing needed to cast /* The following macros reduce the amount of typing needed to cast
assigned memory. */ assigned memory. */
#if WITH_DMALLOC
#define LT_DLMALLOC(tp, n) ((tp *) xmalloc ((n) * sizeof(tp)))
#define LT_DLREALLOC(tp, p, n) ((tp *) xrealloc ((p), (n) * sizeof(tp)))
#define LT_DLFREE(p) \
LT_STMT_START { if (p) (p) = (xfree (p), (lt_ptr) 0); } LT_STMT_END
#define LT_EMALLOC(tp, n) ((tp *) xmalloc ((n) * sizeof(tp)))
#define LT_EREALLOC(tp, p, n) ((tp *) xrealloc ((p), (n) * sizeof(tp)))
#else
#define LT_DLMALLOC(tp, n) ((tp *) lt_dlmalloc ((n) * sizeof(tp))) #define LT_DLMALLOC(tp, n) ((tp *) lt_dlmalloc ((n) * sizeof(tp)))
#define LT_DLREALLOC(tp, p, n) ((tp *) rpl_realloc ((p), (n) * sizeof(tp))) #define LT_DLREALLOC(tp, p, n) ((tp *) rpl_realloc ((p), (n) * sizeof(tp)))
#define LT_DLFREE(p) \ #define LT_DLFREE(p) \
@ -175,8 +192,10 @@ SCMLTSTATIC LT_GLOBAL_DATA void (*lt_dlfree) LT_PARAMS((lt_ptr ptr))
#define LT_EMALLOC(tp, n) ((tp *) lt_emalloc ((n) * sizeof(tp))) #define LT_EMALLOC(tp, n) ((tp *) lt_emalloc ((n) * sizeof(tp)))
#define LT_EREALLOC(tp, p, n) ((tp *) lt_erealloc ((p), (n) * sizeof(tp))) #define LT_EREALLOC(tp, p, n) ((tp *) lt_erealloc ((p), (n) * sizeof(tp)))
#endif
#define LT_DLMEM_REASSIGN(p, q) LT_STMT_START { \ #define LT_DLMEM_REASSIGN(p, q) LT_STMT_START { \
if ((p) != (q)) { lt_dlfree (p); (p) = (q); (q) = 0; } \ if ((p) != (q)) { if (p) lt_dlfree (p); (p) = (q); (q) = 0; } \
} LT_STMT_END } LT_STMT_END
@ -188,11 +207,11 @@ SCMLTSTATIC LT_GLOBAL_DATA void (*lt_dlfree) LT_PARAMS((lt_ptr ptr))
static char *strdup LT_PARAMS((const char *str)); static char *strdup LT_PARAMS((const char *str));
char * static char *
strdup(str) strdup(str)
const char *str; const char *str;
{ {
char *tmp = 0; char *tmp = NULL;
if (str) if (str)
{ {
@ -214,16 +233,16 @@ strdup(str)
static int strcmp LT_PARAMS((const char *str1, const char *str2)); static int strcmp LT_PARAMS((const char *str1, const char *str2));
int static int
strcmp (str1, str2) strcmp (str1, str2)
const char *str1; const char *str1;
const char *str2; const char *str2;
{ {
if (str1 == str2) if (str1 == str2)
return 0; return 0;
if (str1 == 0) if (str1 == NULL)
return -1; return -1;
if (str2 == 0) if (str2 == NULL)
return 1; return 1;
for (;*str1 && *str2; ++str1, ++str2) for (;*str1 && *str2; ++str1, ++str2)
@ -246,7 +265,7 @@ strcmp (str1, str2)
static const char *strchr LT_PARAMS((const char *str, int ch)); static const char *strchr LT_PARAMS((const char *str, int ch));
const char* static const char*
strchr(str, ch) strchr(str, ch)
const char *str; const char *str;
int ch; int ch;
@ -272,12 +291,12 @@ strchr(str, ch)
static const char *strrchr LT_PARAMS((const char *str, int ch)); static const char *strrchr LT_PARAMS((const char *str, int ch));
const char* static const char*
strrchr(str, ch) strrchr(str, ch)
const char *str; const char *str;
int ch; int ch;
{ {
const char *p, *q = 0; const char *p, *q = NULL;
for (p = str; *p != LT_EOS_CHAR; ++p) for (p = str; *p != LT_EOS_CHAR; ++p)
{ {
@ -306,7 +325,7 @@ strrchr(str, ch)
static lt_ptr memcpy LT_PARAMS((lt_ptr dest, const lt_ptr src, size_t size)); static lt_ptr memcpy LT_PARAMS((lt_ptr dest, const lt_ptr src, size_t size));
lt_ptr static lt_ptr
memcpy (dest, src, size) memcpy (dest, src, size)
lt_ptr dest; lt_ptr dest;
const lt_ptr src; const lt_ptr src;
@ -330,7 +349,7 @@ memcpy (dest, src, size)
static lt_ptr memmove LT_PARAMS((lt_ptr dest, const lt_ptr src, size_t size)); static lt_ptr memmove LT_PARAMS((lt_ptr dest, const lt_ptr src, size_t size));
lt_ptr static lt_ptr
memmove (dest, src, size) memmove (dest, src, size)
lt_ptr dest; lt_ptr dest;
const lt_ptr src; const lt_ptr src;
@ -371,22 +390,22 @@ memmove (dest, src, size)
of the source unless you know enough about, or wrote malloc. So of the source unless you know enough about, or wrote malloc. So
this code is disabled... */ this code is disabled... */
lt_ptr static lt_ptr
realloc (ptr, size) realloc (ptr, size)
lt_ptr ptr; lt_ptr ptr;
size_t size; size_t size;
{ {
if (size <= 0) if (size == 0)
{ {
/* For zero or less bytes, free the original memory */ /* For zero or less bytes, free the original memory */
if (ptr != 0) if (ptr != NULL)
{ {
lt_dlfree (ptr); lt_dlfree (ptr);
} }
return (lt_ptr) 0; return (lt_ptr) 0;
} }
else if (ptr == 0) else if (ptr == NULL)
{ {
/* Allow reallocation of a NULL pointer. */ /* Allow reallocation of a NULL pointer. */
return lt_dlmalloc (size); return lt_dlmalloc (size);
@ -417,7 +436,7 @@ realloc (ptr, size)
static error_t argz_append LT_PARAMS((char **pargz, size_t *pargz_len, static error_t argz_append LT_PARAMS((char **pargz, size_t *pargz_len,
const char *buf, size_t buf_len)); const char *buf, size_t buf_len));
error_t static error_t
argz_append (pargz, pargz_len, buf, buf_len) argz_append (pargz, pargz_len, buf, buf_len)
char **pargz; char **pargz;
size_t *pargz_len; size_t *pargz_len;
@ -459,7 +478,7 @@ argz_append (pargz, pargz_len, buf, buf_len)
static error_t argz_create_sep LT_PARAMS((const char *str, int delim, static error_t argz_create_sep LT_PARAMS((const char *str, int delim,
char **pargz, size_t *pargz_len)); char **pargz, size_t *pargz_len));
error_t static error_t
argz_create_sep (str, delim, pargz, pargz_len) argz_create_sep (str, delim, pargz, pargz_len)
const char *str; const char *str;
int delim; int delim;
@ -467,7 +486,7 @@ argz_create_sep (str, delim, pargz, pargz_len)
size_t *pargz_len; size_t *pargz_len;
{ {
size_t argz_len; size_t argz_len;
char *argz = 0; char *argz = NULL;
assert (str); assert (str);
assert (pargz); assert (pargz);
@ -522,7 +541,7 @@ argz_create_sep (str, delim, pargz, pargz_len)
static error_t argz_insert LT_PARAMS((char **pargz, size_t *pargz_len, static error_t argz_insert LT_PARAMS((char **pargz, size_t *pargz_len,
char *before, const char *entry)); char *before, const char *entry));
error_t static error_t
argz_insert (pargz, pargz_len, before, entry) argz_insert (pargz, pargz_len, before, entry)
char **pargz; char **pargz;
size_t *pargz_len; size_t *pargz_len;
@ -533,11 +552,6 @@ argz_insert (pargz, pargz_len, before, entry)
assert (pargz_len); assert (pargz_len);
assert (entry && *entry); assert (entry && *entry);
/* Either PARGZ/PARGZ_LEN is empty and BEFORE is NULL,
or BEFORE points into an address within the ARGZ vector. */
assert ((!*pargz && !*pargz_len && !before)
|| ((*pargz <= before) && (before < (*pargz + *pargz_len))));
/* No BEFORE address indicates ENTRY should be inserted after the /* No BEFORE address indicates ENTRY should be inserted after the
current last element. */ current last element. */
if (!before) if (!before)
@ -584,7 +598,7 @@ argz_insert (pargz, pargz_len, before, entry)
static char *argz_next LT_PARAMS((char *argz, size_t argz_len, static char *argz_next LT_PARAMS((char *argz, size_t argz_len,
const char *entry)); const char *entry));
char * static char *
argz_next (argz, argz_len, entry) argz_next (argz, argz_len, entry)
char *argz; char *argz;
size_t argz_len; size_t argz_len;
@ -629,7 +643,7 @@ argz_next (argz, argz_len, entry)
static void argz_stringify LT_PARAMS((char *argz, size_t argz_len, static void argz_stringify LT_PARAMS((char *argz, size_t argz_len,
int sep)); int sep));
void static void
argz_stringify (argz, argz_len, sep) argz_stringify (argz, argz_len, sep)
char *argz; char *argz;
size_t argz_len; size_t argz_len;
@ -753,11 +767,11 @@ static const char sys_search_path[] = LTDL_SYSSEARCHPATH;
/* The mutex functions stored here are global, and are necessarily the /* The mutex functions stored here are global, and are necessarily the
same for all threads that wish to share access to libltdl. */ same for all threads that wish to share access to libltdl. */
static lt_dlmutex_lock *lt_dlmutex_lock_func = 0; static lt_dlmutex_lock *lt_dlmutex_lock_func = NULL;
static lt_dlmutex_unlock *lt_dlmutex_unlock_func = 0; static lt_dlmutex_unlock *lt_dlmutex_unlock_func = NULL;
static lt_dlmutex_seterror *lt_dlmutex_seterror_func = 0; static lt_dlmutex_seterror *lt_dlmutex_seterror_func = NULL;
static lt_dlmutex_geterror *lt_dlmutex_geterror_func = 0; static lt_dlmutex_geterror *lt_dlmutex_geterror_func = NULL;
static const char *lt_dllast_error = 0; static const char *lt_dllast_error = NULL;
/* Either set or reset the mutex functions. Either all the arguments must /* Either set or reset the mutex functions. Either all the arguments must
@ -805,7 +819,7 @@ lt_dlmutex_register (lock, unlock, seterror, geterror)
/* --- ERROR HANDLING --- */ /* --- ERROR HANDLING --- */
static const char **user_error_strings = 0; static const char **user_error_strings = NULL;
static int errorcount = LT_ERROR_MAX; static int errorcount = LT_ERROR_MAX;
int int
@ -814,7 +828,7 @@ lt_dladderror (diagnostic)
{ {
int errindex = 0; int errindex = 0;
int result = -1; int result = -1;
const char **temp = (const char **) 0; const char **temp = NULL;
assert (diagnostic); assert (diagnostic);
@ -864,7 +878,7 @@ lt_dlseterror (errindex)
return errors; return errors;
} }
lt_ptr static lt_ptr
lt_emalloc (size) lt_emalloc (size)
size_t size; size_t size;
{ {
@ -874,7 +888,7 @@ lt_emalloc (size)
return mem; return mem;
} }
lt_ptr static lt_ptr
lt_erealloc (addr, size) lt_erealloc (addr, size)
lt_ptr addr; lt_ptr addr;
size_t size; size_t size;
@ -885,14 +899,14 @@ lt_erealloc (addr, size)
return mem; return mem;
} }
char * static char *
lt_estrdup (str) lt_estrdup (str)
const char *str; const char *str;
{ {
char *dup = strdup (str); char *copy = strdup (str);
if (LT_STRLEN (str) && !dup) if (LT_STRLEN (str) && !copy)
LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_MEMORY)); LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_MEMORY));
return dup; return copy;
} }
@ -1126,7 +1140,7 @@ sys_shl_sym (loader_data, module, symbol)
lt_module module; lt_module module;
const char *symbol; const char *symbol;
{ {
lt_ptr address = 0; lt_ptr address = NULL;
/* sys_shl_open should never return a NULL module handle */ /* sys_shl_open should never return a NULL module handle */
if (module == (lt_module) 0) if (module == (lt_module) 0)
@ -1170,16 +1184,16 @@ sys_wll_open (loader_data, filename)
const char *filename; const char *filename;
{ {
lt_dlhandle cur; lt_dlhandle cur;
lt_module module = 0; lt_module module = NULL;
const char *errormsg = 0; const char *errormsg = NULL;
char *searchname = 0; char *searchname = NULL;
char *ext; char *ext;
char self_name_buf[MAX_PATH]; char self_name_buf[MAX_PATH];
if (!filename) if (!filename)
{ {
/* Get the name of main module */ /* Get the name of main module */
*self_name_buf = 0; *self_name_buf = '\0';
GetModuleFileName (NULL, self_name_buf, sizeof (self_name_buf)); GetModuleFileName (NULL, self_name_buf, sizeof (self_name_buf));
filename = ext = self_name_buf; filename = ext = self_name_buf;
} }
@ -1229,7 +1243,7 @@ sys_wll_open (loader_data, filename)
{ {
if (!cur->module) if (!cur->module)
{ {
cur = 0; cur = NULL;
break; break;
} }
@ -1245,7 +1259,7 @@ sys_wll_open (loader_data, filename)
if (cur || !module) if (cur || !module)
{ {
LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN)); LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN));
module = 0; module = NULL;
} }
return module; return module;
@ -1351,13 +1365,13 @@ sys_bedl_sym (loader_data, module, symbol)
lt_module module; lt_module module;
const char *symbol; const char *symbol;
{ {
lt_ptr address = 0; lt_ptr address = NULL;
image_id image = (image_id) module; image_id image = (image_id) module;
if (get_image_symbol (image, symbol, B_SYMBOL_TYPE_ANY, address) != B_OK) if (get_image_symbol (image, symbol, B_SYMBOL_TYPE_ANY, address) != B_OK)
{ {
LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND)); LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND));
address = 0; address = NULL;
} }
return address; return address;
@ -1394,7 +1408,7 @@ sys_dld_open (loader_data, filename)
{ {
LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN)); LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN));
LT_DLFREE (module); LT_DLFREE (module);
module = 0; module = NULL;
} }
return module; return module;
@ -1456,8 +1470,8 @@ typedef struct lt_dlsymlists_t
const lt_dlsymlist *syms; const lt_dlsymlist *syms;
} lt_dlsymlists_t; } lt_dlsymlists_t;
static const lt_dlsymlist *default_preloaded_symbols = 0; static const lt_dlsymlist *default_preloaded_symbols = NULL;
static lt_dlsymlists_t *preloaded_symbols = 0; static lt_dlsymlists_t *preloaded_symbols = NULL;
static int static int
presym_init (loader_data) presym_init (loader_data)
@ -1467,7 +1481,7 @@ presym_init (loader_data)
LT_DLMUTEX_LOCK (); LT_DLMUTEX_LOCK ();
preloaded_symbols = 0; preloaded_symbols = NULL;
if (default_preloaded_symbols) if (default_preloaded_symbols)
{ {
errors = lt_dlpreload (default_preloaded_symbols); errors = lt_dlpreload (default_preloaded_symbols);
@ -1493,7 +1507,7 @@ presym_free_symlists ()
lists = lists->next; lists = lists->next;
LT_DLFREE (tmp); LT_DLFREE (tmp);
} }
preloaded_symbols = 0; preloaded_symbols = NULL;
LT_DLMUTEX_UNLOCK (); LT_DLMUTEX_UNLOCK ();
@ -1602,7 +1616,7 @@ presym_close (loader_data, module)
lt_module module; lt_module module;
{ {
/* Just to silence gcc -Wall */ /* Just to silence gcc -Wall */
module = 0; module = NULL;
return 0; return 0;
} }
@ -1693,13 +1707,21 @@ static int lt_argz_insert LT_PARAMS((char **pargz,
static int lt_argz_insertinorder LT_PARAMS((char **pargz, static int lt_argz_insertinorder LT_PARAMS((char **pargz,
size_t *pargz_len, size_t *pargz_len,
const char *entry)); const char *entry));
static int lt_argz_insertdir LT_PARAMS((char **pargz,
size_t *pargz_len,
const char *dirnam,
struct dirent *dp));
static int lt_dlpath_insertdir LT_PARAMS((char **ppath, static int lt_dlpath_insertdir LT_PARAMS((char **ppath,
char *before, char *before,
const char *dir)); const char *dir));
static int list_files_by_dir LT_PARAMS((const char *dirnam,
char **pargz,
size_t *pargz_len));
static int file_not_found LT_PARAMS((void));
static char *user_search_path= 0; static char *user_search_path= NULL;
static lt_dlloader *loaders = 0; static lt_dlloader *loaders = NULL;
static lt_dlhandle handles = 0; static lt_dlhandle handles = NULL;
static int initialized = 0; static int initialized = 0;
/* Initialize libltdl. */ /* Initialize libltdl. */
@ -1713,8 +1735,8 @@ lt_dlinit ()
/* Initialize only at first call. */ /* Initialize only at first call. */
if (++initialized == 1) if (++initialized == 1)
{ {
handles = 0; handles = NULL;
user_search_path = 0; /* empty search path */ user_search_path = NULL; /* empty search path */
#if HAVE_LIBDL && !defined(__CYGWIN__) #if HAVE_LIBDL && !defined(__CYGWIN__)
errors += lt_dlloader_add (lt_dlloader_next (0), &sys_dl, "dlopen"); errors += lt_dlloader_add (lt_dlloader_next (0), &sys_dl, "dlopen");
@ -1849,7 +1871,7 @@ lt_dlexit ()
LT_DLMEM_REASSIGN (loader, next); LT_DLMEM_REASSIGN (loader, next);
} }
loaders = 0; loaders = NULL;
} }
done: done:
@ -1910,7 +1932,7 @@ tryall_dlopen (handle, filename)
} }
else else
{ {
cur->info.filename = 0; cur->info.filename = NULL;
} }
while (loader) while (loader)
@ -1919,7 +1941,7 @@ tryall_dlopen (handle, filename)
cur->module = loader->module_open (data, filename); cur->module = loader->module_open (data, filename);
if (cur->module != 0) if (cur->module != NULL)
{ {
break; break;
} }
@ -1950,7 +1972,7 @@ tryall_dlopen_module (handle, prefix, dirname, dlname)
const char *dlname; const char *dlname;
{ {
int error = 0; int error = 0;
char *filename = 0; char *filename = NULL;
size_t filename_len = 0; size_t filename_len = 0;
size_t dirname_len = LT_STRLEN (dirname); size_t dirname_len = LT_STRLEN (dirname);
@ -1960,7 +1982,7 @@ tryall_dlopen_module (handle, prefix, dirname, dlname)
#ifdef LT_DIRSEP_CHAR #ifdef LT_DIRSEP_CHAR
/* Only canonicalized names (i.e. with DIRSEP chars already converted) /* Only canonicalized names (i.e. with DIRSEP chars already converted)
should make it into this function: */ should make it into this function: */
assert (strchr (dirname, LT_DIRSEP_CHAR) == 0); assert (strchr (dirname, LT_DIRSEP_CHAR) == NULL);
#endif #endif
if (dirname_len > 0) if (dirname_len > 0)
@ -2045,7 +2067,7 @@ canonicalize_path (path, pcanonical)
const char *path; const char *path;
char **pcanonical; char **pcanonical;
{ {
char *canonical = 0; char *canonical = NULL;
assert (path && *path); assert (path && *path);
assert (pcanonical); assert (pcanonical);
@ -2147,11 +2169,11 @@ foreach_dirinpath (search_path, base_name, func, data1, data2)
{ {
int result = 0; int result = 0;
int filenamesize = 0; int filenamesize = 0;
int lenbase = LT_STRLEN (base_name); size_t lenbase = LT_STRLEN (base_name);
size_t argz_len = 0; size_t argz_len = 0;
char * argz = 0; char *argz = NULL;
char * filename = 0; char *filename = NULL;
char * canonical = 0; char *canonical = NULL;
LT_DLMUTEX_LOCK (); LT_DLMUTEX_LOCK ();
@ -2168,10 +2190,10 @@ foreach_dirinpath (search_path, base_name, func, data1, data2)
goto cleanup; goto cleanup;
{ {
char *dir_name = 0; char *dir_name = NULL;
while ((dir_name = argz_next (argz, argz_len, dir_name))) while ((dir_name = argz_next (argz, argz_len, dir_name)))
{ {
int lendir = LT_STRLEN (dir_name); size_t lendir = LT_STRLEN (dir_name);
if (lendir +1 +lenbase >= filenamesize) if (lendir +1 +lenbase >= filenamesize)
{ {
@ -2182,7 +2204,9 @@ foreach_dirinpath (search_path, base_name, func, data1, data2)
goto cleanup; goto cleanup;
} }
strncpy (filename, dir_name, lendir); assert (filenamesize > lendir);
strcpy (filename, dir_name);
if (base_name && *base_name) if (base_name && *base_name)
{ {
if (filename[lendir -1] != '/') if (filename[lendir -1] != '/')
@ -2233,7 +2257,7 @@ find_file_callback (filename, data1, data2)
LT_DLFREE (*pdir); LT_DLFREE (*pdir);
*pdir = lt_estrdup (filename); *pdir = lt_estrdup (filename);
is_done = (*pdir == 0) ? -1 : 1; is_done = (*pdir == NULL) ? -1 : 1;
} }
return is_done; return is_done;
@ -2245,7 +2269,7 @@ find_file (search_path, base_name, pdir)
const char *base_name; const char *base_name;
char **pdir; char **pdir;
{ {
FILE *file = 0; FILE *file = NULL;
foreach_dirinpath (search_path, base_name, find_file_callback, pdir, &file); foreach_dirinpath (search_path, base_name, find_file_callback, pdir, &file);
@ -2258,17 +2282,17 @@ find_handle_callback (filename, data, ignored)
lt_ptr data; lt_ptr data;
lt_ptr ignored; lt_ptr ignored;
{ {
lt_dlhandle *handle = (lt_dlhandle *) data; lt_dlhandle *handle = (lt_dlhandle *) data;
int found = !access (filename, F_OK); int notfound = access (filename, R_OK);
/* Bail out if file cannot be read... */ /* Bail out if file cannot be read... */
if (!found) if (notfound)
return 0; return 0;
/* Try to dlopen the file, but do not continue searching in any /* Try to dlopen the file, but do not continue searching in any
case. */ case. */
if (tryall_dlopen (handle, filename) != 0) if (tryall_dlopen (handle, filename) != 0)
*handle = 0; *handle = NULL;
return 1; return 1;
} }
@ -2297,10 +2321,10 @@ load_deplibs (handle, deplibs)
char *deplibs; char *deplibs;
{ {
#if LTDL_DLOPEN_DEPLIBS #if LTDL_DLOPEN_DEPLIBS
char *p, *save_search_path = 0; char *p, *save_search_path = NULL;
int depcount = 0; int depcount = 0;
int i; int i;
char **names = 0; char **names = NULL;
#endif #endif
int errors = 0; int errors = 0;
@ -2336,7 +2360,7 @@ load_deplibs (handle, deplibs)
if (strncmp(p, "-L", 2) == 0 || strncmp(p, "-R", 2) == 0) if (strncmp(p, "-L", 2) == 0 || strncmp(p, "-R", 2) == 0)
{ {
char save = *end; char save = *end;
*end = 0; /* set a temporary string terminator */ *end = '\0'; /* set a temporary string terminator */
if (lt_dladdsearchdir(p+2)) if (lt_dladdsearchdir(p+2))
{ {
goto cleanup; goto cleanup;
@ -2393,7 +2417,7 @@ load_deplibs (handle, deplibs)
{ {
char *name; char *name;
char save = *end; char save = *end;
*end = 0; /* set a temporary string terminator */ *end = '\0'; /* set a temporary string terminator */
if (strncmp(p, "-l", 2) == 0) if (strncmp(p, "-l", 2) == 0)
{ {
size_t name_len = 3+ /* "lib" */ LT_STRLEN (p + 2); size_t name_len = 3+ /* "lib" */ LT_STRLEN (p + 2);
@ -2482,7 +2506,7 @@ trim (dest, str)
/* remove the leading and trailing "'" from str /* remove the leading and trailing "'" from str
and store the result in dest */ and store the result in dest */
const char *end = strrchr (str, '\''); const char *end = strrchr (str, '\'');
int len = LT_STRLEN (str); size_t len = LT_STRLEN (str);
char *tmp; char *tmp;
LT_DLFREE (*dest); LT_DLFREE (*dest);
@ -2499,7 +2523,7 @@ trim (dest, str)
} }
else else
{ {
*dest = 0; *dest = NULL;
} }
return 0; return 0;
@ -2520,22 +2544,22 @@ free_vars (dlname, oldname, libdir, deplibs)
return 0; return 0;
} }
int static int
try_dlopen (phandle, filename) try_dlopen (phandle, filename)
lt_dlhandle *phandle; lt_dlhandle *phandle;
const char *filename; const char *filename;
{ {
const char * ext = 0; const char * ext = NULL;
const char * saved_error = 0; const char * saved_error = NULL;
char * canonical = 0; char * canonical = NULL;
char * base_name = 0; char * base_name = NULL;
char * dir = 0; char * dir = NULL;
char * name = 0; char * name = NULL;
int errors = 0; int errors = 0;
lt_dlhandle newhandle; lt_dlhandle newhandle;
assert (phandle); assert (phandle);
assert (*phandle == 0); assert (*phandle == NULL);
LT_DLMUTEX_GETERROR (saved_error); LT_DLMUTEX_GETERROR (saved_error);
@ -2543,7 +2567,7 @@ try_dlopen (phandle, filename)
if (!filename) if (!filename)
{ {
*phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1); *phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1);
if (*phandle == 0) if (*phandle == NULL)
return 1; return 1;
memset (*phandle, 0, sizeof(struct lt_dlhandle_struct)); memset (*phandle, 0, sizeof(struct lt_dlhandle_struct));
@ -2600,14 +2624,13 @@ try_dlopen (phandle, filename)
if (ext && strcmp (ext, archive_ext) == 0) if (ext && strcmp (ext, archive_ext) == 0)
{ {
/* this seems to be a libtool module */ /* this seems to be a libtool module */
FILE * file = 0; FILE * file = NULL;
char * dlname = 0; char * dlname = NULL;
char * old_name = 0; char * old_name = NULL;
char * libdir = 0; char * libdir = NULL;
char * deplibs = 0; char * deplibs = NULL;
char * line = 0; char * line = NULL;
size_t line_len; size_t line_len;
int i;
/* if we can't find the installed flag, it is probably an /* if we can't find the installed flag, it is probably an
installed libtool archive, produced with an old version installed libtool archive, produced with an old version
@ -2623,23 +2646,26 @@ try_dlopen (phandle, filename)
} }
/* canonicalize the module name */ /* canonicalize the module name */
for (i = 0; i < ext - base_name; ++i) {
{ size_t i;
if (isalnum ((int)(base_name[i]))) for (i = 0; i < ext - base_name; ++i)
{ {
name[i] = base_name[i]; if (isalnum ((int)(base_name[i])))
} {
else name[i] = base_name[i];
{ }
name[i] = '_'; else
} {
} name[i] = '_';
name[ext - base_name] = LT_EOS_CHAR; }
}
name[ext - base_name] = LT_EOS_CHAR;
}
/* Now try to open the .la file. If there is no directory name /* Now try to open the .la file. If there is no directory name
component, try to find it first in user_search_path and then other component, try to find it first in user_search_path and then other
prescribed paths. Otherwise (or in any case if the module was not prescribed paths. Otherwise (or in any case if the module was not
yet found) try opening just the module name as passed. */ yet found) try opening just the module name as passed. */
if (!dir) if (!dir)
{ {
const char *search_path; const char *search_path;
@ -2698,7 +2724,7 @@ try_dlopen (phandle, filename)
/* read the .la file */ /* read the .la file */
while (!feof (file)) while (!feof (file))
{ {
if (!fgets (line, line_len, file)) if (!fgets (line, (int) line_len, file))
{ {
break; break;
} }
@ -2708,7 +2734,7 @@ try_dlopen (phandle, filename)
while ((line[LT_STRLEN(line) -1] != '\n') && (!feof (file))) while ((line[LT_STRLEN(line) -1] != '\n') && (!feof (file)))
{ {
line = LT_DLREALLOC (char, line, line_len *2); line = LT_DLREALLOC (char, line, line_len *2);
if (!fgets (&line[line_len -1], line_len +1, file)) if (!fgets (&line[line_len -1], (int) line_len +1, file))
{ {
break; break;
} }
@ -2766,7 +2792,7 @@ try_dlopen (phandle, filename)
errors += trim (&dlname, &line[sizeof (STR_LIBRARY_NAMES) - 1]); errors += trim (&dlname, &line[sizeof (STR_LIBRARY_NAMES) - 1]);
if (!errors if (!errors
&& dlname && dlname
&& (last_libname = strrchr (dlname, ' ')) != 0) && (last_libname = strrchr (dlname, ' ')) != NULL)
{ {
last_libname = lt_estrdup (last_libname + 1); last_libname = lt_estrdup (last_libname + 1);
if (!last_libname) if (!last_libname)
@ -2787,7 +2813,7 @@ try_dlopen (phandle, filename)
/* allocate the handle */ /* allocate the handle */
*phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1); *phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1);
if (*phandle == 0) if (*phandle == NULL)
++errors; ++errors;
if (errors) if (errors)
@ -2831,7 +2857,7 @@ try_dlopen (phandle, filename)
{ {
/* not a libtool module */ /* not a libtool module */
*phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1); *phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1);
if (*phandle == 0) if (*phandle == NULL)
{ {
++errors; ++errors;
goto cleanup; goto cleanup;
@ -2856,8 +2882,10 @@ try_dlopen (phandle, filename)
#endif #endif
))) )))
{ {
if (tryall_dlopen (&newhandle, filename) != 0) if (tryall_dlopen (&newhandle, filename) != 0)
newhandle = 0; {
newhandle = NULL;
}
} }
if (!newhandle) if (!newhandle)
@ -2896,7 +2924,7 @@ lt_dlhandle
lt_dlopen (filename) lt_dlopen (filename)
const char *filename; const char *filename;
{ {
lt_dlhandle handle = 0; lt_dlhandle handle = NULL;
/* Just incase we missed a code path in try_dlopen() that reports /* Just incase we missed a code path in try_dlopen() that reports
an error, but forgets to reset handle... */ an error, but forgets to reset handle... */
@ -2911,7 +2939,7 @@ lt_dlopen (filename)
static int static int
file_not_found () file_not_found ()
{ {
const char *error = 0; const char *error = NULL;
LT_DLMUTEX_GETERROR (error); LT_DLMUTEX_GETERROR (error);
if (error == LT_DLSTRERROR (FILE_NOT_FOUND)) if (error == LT_DLSTRERROR (FILE_NOT_FOUND))
@ -2928,10 +2956,10 @@ lt_dlhandle
lt_dlopenext (filename) lt_dlopenext (filename)
const char *filename; const char *filename;
{ {
lt_dlhandle handle = 0; lt_dlhandle handle = NULL;
char * tmp = 0; char * tmp = NULL;
char * ext = 0; char * ext = NULL;
int len; size_t len;
int errors = 0; int errors = 0;
if (!filename) if (!filename)
@ -3011,7 +3039,7 @@ lt_dlopenext (filename)
} }
int static int
lt_argz_insert (pargz, pargz_len, before, entry) lt_argz_insert (pargz, pargz_len, before, entry)
char **pargz; char **pargz;
size_t *pargz_len; size_t *pargz_len;
@ -3037,13 +3065,13 @@ lt_argz_insert (pargz, pargz_len, before, entry)
return 0; return 0;
} }
int static int
lt_argz_insertinorder (pargz, pargz_len, entry) lt_argz_insertinorder (pargz, pargz_len, entry)
char **pargz; char **pargz;
size_t *pargz_len; size_t *pargz_len;
const char *entry; const char *entry;
{ {
char *before = 0; char *before = NULL;
assert (pargz); assert (pargz);
assert (pargz_len); assert (pargz_len);
@ -3068,9 +3096,9 @@ lt_argz_insertdir (pargz, pargz_len, dirnam, dp)
const char *dirnam; const char *dirnam;
struct dirent *dp; struct dirent *dp;
{ {
char *buf = 0; char *buf = NULL;
size_t buf_len = 0; size_t buf_len = 0;
char *end = 0; char *end = NULL;
size_t end_offset = 0; size_t end_offset = 0;
size_t dir_len = 0; size_t dir_len = 0;
int errors = 0; int errors = 0;
@ -3133,7 +3161,7 @@ list_files_by_dir (dirnam, pargz, pargz_len)
char **pargz; char **pargz;
size_t *pargz_len; size_t *pargz_len;
{ {
DIR *dirp = 0; DIR *dirp = NULL;
int errors = 0; int errors = 0;
assert (dirnam && *dirnam); assert (dirnam && *dirnam);
@ -3144,7 +3172,7 @@ list_files_by_dir (dirnam, pargz, pargz_len)
dirp = opendir (dirnam); dirp = opendir (dirnam);
if (dirp) if (dirp)
{ {
struct dirent *dp = 0; struct dirent *dp = NULL;
while ((dp = readdir (dirp))) while ((dp = readdir (dirp)))
if (dp->d_name[0] != '.') if (dp->d_name[0] != '.')
@ -3175,7 +3203,7 @@ foreachfile_callback (dirname, data1, data2)
= (int (*) LT_PARAMS((const char *filename, lt_ptr data))) data1; = (int (*) LT_PARAMS((const char *filename, lt_ptr data))) data1;
int is_done = 0; int is_done = 0;
char *argz = 0; char *argz = NULL;
size_t argz_len = 0; size_t argz_len = 0;
if (list_files_by_dir (dirname, &argz, &argz_len) != 0) if (list_files_by_dir (dirname, &argz, &argz_len) != 0)
@ -3184,7 +3212,7 @@ foreachfile_callback (dirname, data1, data2)
goto cleanup; goto cleanup;
{ {
char *filename = 0; char *filename = NULL;
while ((filename = argz_next (argz, argz_len, filename))) while ((filename = argz_next (argz, argz_len, filename)))
if ((is_done = (*func) (filename, data2))) if ((is_done = (*func) (filename, data2)))
break; break;
@ -3294,6 +3322,9 @@ lt_dlclose (handle)
errors += handle->loader->module_close (data, handle->module); errors += handle->loader->module_close (data, handle->module);
errors += unload_deplibs(handle); errors += unload_deplibs(handle);
/* It is up to the callers to free the data itself. */
LT_DLFREE (handle->caller_data);
LT_DLFREE (handle->info.filename); LT_DLFREE (handle->info.filename);
LT_DLFREE (handle->info.name); LT_DLFREE (handle->info.name);
LT_DLFREE (handle); LT_DLFREE (handle);
@ -3318,7 +3349,7 @@ lt_dlsym (handle, symbol)
lt_dlhandle handle; lt_dlhandle handle;
const char *symbol; const char *symbol;
{ {
int lensym; size_t lensym;
char lsym[LT_SYMBOL_LENGTH]; char lsym[LT_SYMBOL_LENGTH];
char *sym; char *sym;
lt_ptr address; lt_ptr address;
@ -3418,15 +3449,15 @@ lt_dlerror ()
return error ? error : LT_DLSTRERROR (UNKNOWN); return error ? error : LT_DLSTRERROR (UNKNOWN);
} }
int static int
lt_dlpath_insertdir (ppath, before, dir) lt_dlpath_insertdir (ppath, before, dir)
char **ppath; char **ppath;
char *before; char *before;
const char *dir; const char *dir;
{ {
int errors = 0; int errors = 0;
char *canonical = 0; char *canonical = NULL;
char *argz = 0; char *argz = NULL;
size_t argz_len = 0; size_t argz_len = 0;
assert (ppath); assert (ppath);
@ -3441,13 +3472,13 @@ lt_dlpath_insertdir (ppath, before, dir)
assert (canonical && *canonical); assert (canonical && *canonical);
/* If *PPATH is empty, set it to DIR. */ /* If *PPATH is empty, set it to DIR. */
if (*ppath == 0) if (*ppath == NULL)
{ {
assert (!before); /* BEFORE cannot be set without PPATH. */ assert (!before); /* BEFORE cannot be set without PPATH. */
assert (dir); /* Without DIR, don't call this function! */ assert (dir); /* Without DIR, don't call this function! */
*ppath = lt_estrdup (dir); *ppath = lt_estrdup (dir);
if (*ppath == 0) if (*ppath == NULL)
++errors; ++errors;
return errors; return errors;
@ -3681,7 +3712,7 @@ lt_dlcaller_set_data (key, handle, data)
lt_ptr data; lt_ptr data;
{ {
int n_elements = 0; int n_elements = 0;
lt_ptr stale = (lt_ptr) 0; lt_ptr stale = NULL;
int i; int i;
/* This needs to be locked so that the caller data can be updated /* This needs to be locked so that the caller data can be updated
@ -3710,7 +3741,7 @@ lt_dlcaller_set_data (key, handle, data)
if (!temp) if (!temp)
{ {
stale = 0; stale = NULL;
goto done; goto done;
} }
@ -3770,12 +3801,12 @@ lt_dlloader_add (place, dlloader, loader_name)
const char *loader_name; const char *loader_name;
{ {
int errors = 0; int errors = 0;
lt_dlloader *node = 0, *ptr = 0; lt_dlloader *node = NULL, *ptr = NULL;
if ((dlloader == 0) /* diagnose null parameters */ if ((dlloader == NULL) /* diagnose null parameters */
|| (dlloader->module_open == 0) || (dlloader->module_open == NULL)
|| (dlloader->module_close == 0) || (dlloader->module_close == NULL)
|| (dlloader->find_sym == 0)) || (dlloader->find_sym == NULL))
{ {
LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_LOADER)); LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_LOADER));
return 1; return 1;
@ -3786,7 +3817,7 @@ lt_dlloader_add (place, dlloader, loader_name)
if (!node) if (!node)
return 1; return 1;
node->next = 0; node->next = NULL;
node->loader_name = loader_name; node->loader_name = loader_name;
node->sym_prefix = dlloader->sym_prefix; node->sym_prefix = dlloader->sym_prefix;
node->dlloader_exit = dlloader->dlloader_exit; node->dlloader_exit = dlloader->dlloader_exit;
@ -3922,7 +3953,7 @@ const char *
lt_dlloader_name (place) lt_dlloader_name (place)
lt_dlloader *place; lt_dlloader *place;
{ {
const char *name = 0; const char *name = NULL;
if (place) if (place)
{ {
@ -3942,7 +3973,7 @@ lt_user_data *
lt_dlloader_data (place) lt_dlloader_data (place)
lt_dlloader *place; lt_dlloader *place;
{ {
lt_user_data *data = 0; lt_user_data *data = NULL;
if (place) if (place)
{ {
@ -3962,7 +3993,7 @@ lt_dlloader *
lt_dlloader_find (loader_name) lt_dlloader_find (loader_name)
const char *loader_name; const char *loader_name;
{ {
lt_dlloader *place = 0; lt_dlloader *place = NULL;
LT_DLMUTEX_LOCK (); LT_DLMUTEX_LOCK ();
for (place = loaders; place; place = place->next) for (place = loaders; place; place = place->next)

View file

@ -94,6 +94,10 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
#include "ltdl.h" #include "ltdl.h"
#if WITH_DMALLOC
# include <dmalloc.h>
#endif
@ -166,6 +170,18 @@ LT_GLOBAL_DATA void (*lt_dlfree) LT_PARAMS((lt_ptr ptr))
/* The following macros reduce the amount of typing needed to cast /* The following macros reduce the amount of typing needed to cast
assigned memory. */ assigned memory. */
#if WITH_DMALLOC
#define LT_DLMALLOC(tp, n) ((tp *) xmalloc ((n) * sizeof(tp)))
#define LT_DLREALLOC(tp, p, n) ((tp *) xrealloc ((p), (n) * sizeof(tp)))
#define LT_DLFREE(p) \
LT_STMT_START { if (p) (p) = (xfree (p), (lt_ptr) 0); } LT_STMT_END
#define LT_EMALLOC(tp, n) ((tp *) xmalloc ((n) * sizeof(tp)))
#define LT_EREALLOC(tp, p, n) ((tp *) xrealloc ((p), (n) * sizeof(tp)))
#else
#define LT_DLMALLOC(tp, n) ((tp *) lt_dlmalloc ((n) * sizeof(tp))) #define LT_DLMALLOC(tp, n) ((tp *) lt_dlmalloc ((n) * sizeof(tp)))
#define LT_DLREALLOC(tp, p, n) ((tp *) rpl_realloc ((p), (n) * sizeof(tp))) #define LT_DLREALLOC(tp, p, n) ((tp *) rpl_realloc ((p), (n) * sizeof(tp)))
#define LT_DLFREE(p) \ #define LT_DLFREE(p) \
@ -174,8 +190,10 @@ LT_GLOBAL_DATA void (*lt_dlfree) LT_PARAMS((lt_ptr ptr))
#define LT_EMALLOC(tp, n) ((tp *) lt_emalloc ((n) * sizeof(tp))) #define LT_EMALLOC(tp, n) ((tp *) lt_emalloc ((n) * sizeof(tp)))
#define LT_EREALLOC(tp, p, n) ((tp *) lt_erealloc ((p), (n) * sizeof(tp))) #define LT_EREALLOC(tp, p, n) ((tp *) lt_erealloc ((p), (n) * sizeof(tp)))
#endif
#define LT_DLMEM_REASSIGN(p, q) LT_STMT_START { \ #define LT_DLMEM_REASSIGN(p, q) LT_STMT_START { \
if ((p) != (q)) { lt_dlfree (p); (p) = (q); (q) = 0; } \ if ((p) != (q)) { if (p) lt_dlfree (p); (p) = (q); (q) = 0; } \
} LT_STMT_END } LT_STMT_END
@ -187,11 +205,11 @@ LT_GLOBAL_DATA void (*lt_dlfree) LT_PARAMS((lt_ptr ptr))
static char *strdup LT_PARAMS((const char *str)); static char *strdup LT_PARAMS((const char *str));
char * static char *
strdup(str) strdup(str)
const char *str; const char *str;
{ {
char *tmp = 0; char *tmp = NULL;
if (str) if (str)
{ {
@ -213,16 +231,16 @@ strdup(str)
static int strcmp LT_PARAMS((const char *str1, const char *str2)); static int strcmp LT_PARAMS((const char *str1, const char *str2));
int static int
strcmp (str1, str2) strcmp (str1, str2)
const char *str1; const char *str1;
const char *str2; const char *str2;
{ {
if (str1 == str2) if (str1 == str2)
return 0; return 0;
if (str1 == 0) if (str1 == NULL)
return -1; return -1;
if (str2 == 0) if (str2 == NULL)
return 1; return 1;
for (;*str1 && *str2; ++str1, ++str2) for (;*str1 && *str2; ++str1, ++str2)
@ -245,7 +263,7 @@ strcmp (str1, str2)
static const char *strchr LT_PARAMS((const char *str, int ch)); static const char *strchr LT_PARAMS((const char *str, int ch));
const char* static const char*
strchr(str, ch) strchr(str, ch)
const char *str; const char *str;
int ch; int ch;
@ -271,12 +289,12 @@ strchr(str, ch)
static const char *strrchr LT_PARAMS((const char *str, int ch)); static const char *strrchr LT_PARAMS((const char *str, int ch));
const char* static const char*
strrchr(str, ch) strrchr(str, ch)
const char *str; const char *str;
int ch; int ch;
{ {
const char *p, *q = 0; const char *p, *q = NULL;
for (p = str; *p != LT_EOS_CHAR; ++p) for (p = str; *p != LT_EOS_CHAR; ++p)
{ {
@ -305,7 +323,7 @@ strrchr(str, ch)
static lt_ptr memcpy LT_PARAMS((lt_ptr dest, const lt_ptr src, size_t size)); static lt_ptr memcpy LT_PARAMS((lt_ptr dest, const lt_ptr src, size_t size));
lt_ptr static lt_ptr
memcpy (dest, src, size) memcpy (dest, src, size)
lt_ptr dest; lt_ptr dest;
const lt_ptr src; const lt_ptr src;
@ -329,7 +347,7 @@ memcpy (dest, src, size)
static lt_ptr memmove LT_PARAMS((lt_ptr dest, const lt_ptr src, size_t size)); static lt_ptr memmove LT_PARAMS((lt_ptr dest, const lt_ptr src, size_t size));
lt_ptr static lt_ptr
memmove (dest, src, size) memmove (dest, src, size)
lt_ptr dest; lt_ptr dest;
const lt_ptr src; const lt_ptr src;
@ -364,22 +382,22 @@ memmove (dest, src, size)
#undef realloc #undef realloc
#define realloc rpl_realloc #define realloc rpl_realloc
lt_ptr static lt_ptr
realloc (ptr, size) realloc (ptr, size)
lt_ptr ptr; lt_ptr ptr;
size_t size; size_t size;
{ {
if (size <= 0) if (size == 0)
{ {
/* For zero or less bytes, free the original memory */ /* For zero or less bytes, free the original memory */
if (ptr != 0) if (ptr != NULL)
{ {
lt_dlfree (ptr); lt_dlfree (ptr);
} }
return (lt_ptr) 0; return (lt_ptr) 0;
} }
else if (ptr == 0) else if (ptr == NULL)
{ {
/* Allow reallocation of a NULL pointer. */ /* Allow reallocation of a NULL pointer. */
return lt_dlmalloc (size); return lt_dlmalloc (size);
@ -408,7 +426,7 @@ realloc (ptr, size)
static error_t argz_append LT_PARAMS((char **pargz, size_t *pargz_len, static error_t argz_append LT_PARAMS((char **pargz, size_t *pargz_len,
const char *buf, size_t buf_len)); const char *buf, size_t buf_len));
error_t static error_t
argz_append (pargz, pargz_len, buf, buf_len) argz_append (pargz, pargz_len, buf, buf_len)
char **pargz; char **pargz;
size_t *pargz_len; size_t *pargz_len;
@ -450,7 +468,7 @@ argz_append (pargz, pargz_len, buf, buf_len)
static error_t argz_create_sep LT_PARAMS((const char *str, int delim, static error_t argz_create_sep LT_PARAMS((const char *str, int delim,
char **pargz, size_t *pargz_len)); char **pargz, size_t *pargz_len));
error_t static error_t
argz_create_sep (str, delim, pargz, pargz_len) argz_create_sep (str, delim, pargz, pargz_len)
const char *str; const char *str;
int delim; int delim;
@ -458,7 +476,7 @@ argz_create_sep (str, delim, pargz, pargz_len)
size_t *pargz_len; size_t *pargz_len;
{ {
size_t argz_len; size_t argz_len;
char *argz = 0; char *argz = NULL;
assert (str); assert (str);
assert (pargz); assert (pargz);
@ -513,7 +531,7 @@ argz_create_sep (str, delim, pargz, pargz_len)
static error_t argz_insert LT_PARAMS((char **pargz, size_t *pargz_len, static error_t argz_insert LT_PARAMS((char **pargz, size_t *pargz_len,
char *before, const char *entry)); char *before, const char *entry));
error_t static error_t
argz_insert (pargz, pargz_len, before, entry) argz_insert (pargz, pargz_len, before, entry)
char **pargz; char **pargz;
size_t *pargz_len; size_t *pargz_len;
@ -524,11 +542,6 @@ argz_insert (pargz, pargz_len, before, entry)
assert (pargz_len); assert (pargz_len);
assert (entry && *entry); assert (entry && *entry);
/* Either PARGZ/PARGZ_LEN is empty and BEFORE is NULL,
or BEFORE points into an address within the ARGZ vector. */
assert ((!*pargz && !*pargz_len && !before)
|| ((*pargz <= before) && (before < (*pargz + *pargz_len))));
/* No BEFORE address indicates ENTRY should be inserted after the /* No BEFORE address indicates ENTRY should be inserted after the
current last element. */ current last element. */
if (!before) if (!before)
@ -575,7 +588,7 @@ argz_insert (pargz, pargz_len, before, entry)
static char *argz_next LT_PARAMS((char *argz, size_t argz_len, static char *argz_next LT_PARAMS((char *argz, size_t argz_len,
const char *entry)); const char *entry));
char * static char *
argz_next (argz, argz_len, entry) argz_next (argz, argz_len, entry)
char *argz; char *argz;
size_t argz_len; size_t argz_len;
@ -620,7 +633,7 @@ argz_next (argz, argz_len, entry)
static void argz_stringify LT_PARAMS((char *argz, size_t argz_len, static void argz_stringify LT_PARAMS((char *argz, size_t argz_len,
int sep)); int sep));
void static void
argz_stringify (argz, argz_len, sep) argz_stringify (argz, argz_len, sep)
char *argz; char *argz;
size_t argz_len; size_t argz_len;
@ -744,11 +757,11 @@ static const char sys_search_path[] = LTDL_SYSSEARCHPATH;
/* The mutex functions stored here are global, and are necessarily the /* The mutex functions stored here are global, and are necessarily the
same for all threads that wish to share access to libltdl. */ same for all threads that wish to share access to libltdl. */
static lt_dlmutex_lock *lt_dlmutex_lock_func = 0; static lt_dlmutex_lock *lt_dlmutex_lock_func = NULL;
static lt_dlmutex_unlock *lt_dlmutex_unlock_func = 0; static lt_dlmutex_unlock *lt_dlmutex_unlock_func = NULL;
static lt_dlmutex_seterror *lt_dlmutex_seterror_func = 0; static lt_dlmutex_seterror *lt_dlmutex_seterror_func = NULL;
static lt_dlmutex_geterror *lt_dlmutex_geterror_func = 0; static lt_dlmutex_geterror *lt_dlmutex_geterror_func = NULL;
static const char *lt_dllast_error = 0; static const char *lt_dllast_error = NULL;
/* Either set or reset the mutex functions. Either all the arguments must /* Either set or reset the mutex functions. Either all the arguments must
@ -797,7 +810,7 @@ lt_dlmutex_register (lock, unlock, seterror, geterror)
/* --- ERROR HANDLING --- */ /* --- ERROR HANDLING --- */
static const char **user_error_strings = 0; static const char **user_error_strings = NULL;
static int errorcount = LT_ERROR_MAX; static int errorcount = LT_ERROR_MAX;
int int
@ -806,7 +819,7 @@ lt_dladderror (diagnostic)
{ {
int errindex = 0; int errindex = 0;
int result = -1; int result = -1;
const char **temp = (const char **) 0; const char **temp = NULL;
assert (diagnostic); assert (diagnostic);
@ -856,7 +869,7 @@ lt_dlseterror (errindex)
return errors; return errors;
} }
lt_ptr static lt_ptr
lt_emalloc (size) lt_emalloc (size)
size_t size; size_t size;
{ {
@ -866,7 +879,7 @@ lt_emalloc (size)
return mem; return mem;
} }
lt_ptr static lt_ptr
lt_erealloc (addr, size) lt_erealloc (addr, size)
lt_ptr addr; lt_ptr addr;
size_t size; size_t size;
@ -877,14 +890,14 @@ lt_erealloc (addr, size)
return mem; return mem;
} }
char * static char *
lt_estrdup (str) lt_estrdup (str)
const char *str; const char *str;
{ {
char *dup = strdup (str); char *copy = strdup (str);
if (LT_STRLEN (str) && !dup) if (LT_STRLEN (str) && !copy)
LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_MEMORY)); LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_MEMORY));
return dup; return copy;
} }
@ -1118,7 +1131,7 @@ sys_shl_sym (loader_data, module, symbol)
lt_module module; lt_module module;
const char *symbol; const char *symbol;
{ {
lt_ptr address = 0; lt_ptr address = NULL;
/* sys_shl_open should never return a NULL module handle */ /* sys_shl_open should never return a NULL module handle */
if (module == (lt_module) 0) if (module == (lt_module) 0)
@ -1162,16 +1175,16 @@ sys_wll_open (loader_data, filename)
const char *filename; const char *filename;
{ {
lt_dlhandle cur; lt_dlhandle cur;
lt_module module = 0; lt_module module = NULL;
const char *errormsg = 0; const char *errormsg = NULL;
char *searchname = 0; char *searchname = NULL;
char *ext; char *ext;
char self_name_buf[MAX_PATH]; char self_name_buf[MAX_PATH];
if (!filename) if (!filename)
{ {
/* Get the name of main module */ /* Get the name of main module */
*self_name_buf = 0; *self_name_buf = '\0';
GetModuleFileName (NULL, self_name_buf, sizeof (self_name_buf)); GetModuleFileName (NULL, self_name_buf, sizeof (self_name_buf));
filename = ext = self_name_buf; filename = ext = self_name_buf;
} }
@ -1221,7 +1234,7 @@ sys_wll_open (loader_data, filename)
{ {
if (!cur->module) if (!cur->module)
{ {
cur = 0; cur = NULL;
break; break;
} }
@ -1237,7 +1250,7 @@ sys_wll_open (loader_data, filename)
if (cur || !module) if (cur || !module)
{ {
LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN)); LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN));
module = 0; module = NULL;
} }
return module; return module;
@ -1343,13 +1356,13 @@ sys_bedl_sym (loader_data, module, symbol)
lt_module module; lt_module module;
const char *symbol; const char *symbol;
{ {
lt_ptr address = 0; lt_ptr address = NULL;
image_id image = (image_id) module; image_id image = (image_id) module;
if (get_image_symbol (image, symbol, B_SYMBOL_TYPE_ANY, address) != B_OK) if (get_image_symbol (image, symbol, B_SYMBOL_TYPE_ANY, address) != B_OK)
{ {
LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND)); LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND));
address = 0; address = NULL;
} }
return address; return address;
@ -1386,7 +1399,7 @@ sys_dld_open (loader_data, filename)
{ {
LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN)); LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN));
LT_DLFREE (module); LT_DLFREE (module);
module = 0; module = NULL;
} }
return module; return module;
@ -1448,8 +1461,8 @@ typedef struct lt_dlsymlists_t
const lt_dlsymlist *syms; const lt_dlsymlist *syms;
} lt_dlsymlists_t; } lt_dlsymlists_t;
static const lt_dlsymlist *default_preloaded_symbols = 0; static const lt_dlsymlist *default_preloaded_symbols = NULL;
static lt_dlsymlists_t *preloaded_symbols = 0; static lt_dlsymlists_t *preloaded_symbols = NULL;
static int static int
presym_init (loader_data) presym_init (loader_data)
@ -1459,7 +1472,7 @@ presym_init (loader_data)
LT_DLMUTEX_LOCK (); LT_DLMUTEX_LOCK ();
preloaded_symbols = 0; preloaded_symbols = NULL;
if (default_preloaded_symbols) if (default_preloaded_symbols)
{ {
errors = lt_dlpreload (default_preloaded_symbols); errors = lt_dlpreload (default_preloaded_symbols);
@ -1485,7 +1498,7 @@ presym_free_symlists ()
lists = lists->next; lists = lists->next;
LT_DLFREE (tmp); LT_DLFREE (tmp);
} }
preloaded_symbols = 0; preloaded_symbols = NULL;
LT_DLMUTEX_UNLOCK (); LT_DLMUTEX_UNLOCK ();
@ -1594,7 +1607,7 @@ presym_close (loader_data, module)
lt_module module; lt_module module;
{ {
/* Just to silence gcc -Wall */ /* Just to silence gcc -Wall */
module = 0; module = NULL;
return 0; return 0;
} }
@ -1685,13 +1698,21 @@ static int lt_argz_insert LT_PARAMS((char **pargz,
static int lt_argz_insertinorder LT_PARAMS((char **pargz, static int lt_argz_insertinorder LT_PARAMS((char **pargz,
size_t *pargz_len, size_t *pargz_len,
const char *entry)); const char *entry));
static int lt_argz_insertdir LT_PARAMS((char **pargz,
size_t *pargz_len,
const char *dirnam,
struct dirent *dp));
static int lt_dlpath_insertdir LT_PARAMS((char **ppath, static int lt_dlpath_insertdir LT_PARAMS((char **ppath,
char *before, char *before,
const char *dir)); const char *dir));
static int list_files_by_dir LT_PARAMS((const char *dirnam,
char **pargz,
size_t *pargz_len));
static int file_not_found LT_PARAMS((void));
static char *user_search_path= 0; static char *user_search_path= NULL;
static lt_dlloader *loaders = 0; static lt_dlloader *loaders = NULL;
static lt_dlhandle handles = 0; static lt_dlhandle handles = NULL;
static int initialized = 0; static int initialized = 0;
/* Initialize libltdl. */ /* Initialize libltdl. */
@ -1705,8 +1726,8 @@ lt_dlinit ()
/* Initialize only at first call. */ /* Initialize only at first call. */
if (++initialized == 1) if (++initialized == 1)
{ {
handles = 0; handles = NULL;
user_search_path = 0; /* empty search path */ user_search_path = NULL; /* empty search path */
#if HAVE_LIBDL && !defined(__CYGWIN__) #if HAVE_LIBDL && !defined(__CYGWIN__)
errors += lt_dlloader_add (lt_dlloader_next (0), &sys_dl, "dlopen"); errors += lt_dlloader_add (lt_dlloader_next (0), &sys_dl, "dlopen");
@ -1841,7 +1862,7 @@ lt_dlexit ()
LT_DLMEM_REASSIGN (loader, next); LT_DLMEM_REASSIGN (loader, next);
} }
loaders = 0; loaders = NULL;
} }
done: done:
@ -1902,7 +1923,7 @@ tryall_dlopen (handle, filename)
} }
else else
{ {
cur->info.filename = 0; cur->info.filename = NULL;
} }
while (loader) while (loader)
@ -1911,7 +1932,7 @@ tryall_dlopen (handle, filename)
cur->module = loader->module_open (data, filename); cur->module = loader->module_open (data, filename);
if (cur->module != 0) if (cur->module != NULL)
{ {
break; break;
} }
@ -1942,7 +1963,7 @@ tryall_dlopen_module (handle, prefix, dirname, dlname)
const char *dlname; const char *dlname;
{ {
int error = 0; int error = 0;
char *filename = 0; char *filename = NULL;
size_t filename_len = 0; size_t filename_len = 0;
size_t dirname_len = LT_STRLEN (dirname); size_t dirname_len = LT_STRLEN (dirname);
@ -1952,7 +1973,7 @@ tryall_dlopen_module (handle, prefix, dirname, dlname)
#ifdef LT_DIRSEP_CHAR #ifdef LT_DIRSEP_CHAR
/* Only canonicalized names (i.e. with DIRSEP chars already converted) /* Only canonicalized names (i.e. with DIRSEP chars already converted)
should make it into this function: */ should make it into this function: */
assert (strchr (dirname, LT_DIRSEP_CHAR) == 0); assert (strchr (dirname, LT_DIRSEP_CHAR) == NULL);
#endif #endif
if (dirname[dirname_len -1] == '/') if (dirname[dirname_len -1] == '/')
@ -2036,7 +2057,7 @@ canonicalize_path (path, pcanonical)
const char *path; const char *path;
char **pcanonical; char **pcanonical;
{ {
char *canonical = 0; char *canonical = NULL;
assert (path && *path); assert (path && *path);
assert (pcanonical); assert (pcanonical);
@ -2138,11 +2159,11 @@ foreach_dirinpath (search_path, base_name, func, data1, data2)
{ {
int result = 0; int result = 0;
int filenamesize = 0; int filenamesize = 0;
int lenbase = LT_STRLEN (base_name); size_t lenbase = LT_STRLEN (base_name);
size_t argz_len = 0; size_t argz_len = 0;
char * argz = 0; char *argz = NULL;
char * filename = 0; char *filename = NULL;
char * canonical = 0; char *canonical = NULL;
LT_DLMUTEX_LOCK (); LT_DLMUTEX_LOCK ();
@ -2159,10 +2180,10 @@ foreach_dirinpath (search_path, base_name, func, data1, data2)
goto cleanup; goto cleanup;
{ {
char *dir_name = 0; char *dir_name = NULL;
while ((dir_name = argz_next (argz, argz_len, dir_name))) while ((dir_name = argz_next (argz, argz_len, dir_name)))
{ {
int lendir = LT_STRLEN (dir_name); size_t lendir = LT_STRLEN (dir_name);
if (lendir +1 +lenbase >= filenamesize) if (lendir +1 +lenbase >= filenamesize)
{ {
@ -2173,7 +2194,9 @@ foreach_dirinpath (search_path, base_name, func, data1, data2)
goto cleanup; goto cleanup;
} }
strncpy (filename, dir_name, lendir); assert (filenamesize > lendir);
strcpy (filename, dir_name);
if (base_name && *base_name) if (base_name && *base_name)
{ {
if (filename[lendir -1] != '/') if (filename[lendir -1] != '/')
@ -2224,7 +2247,7 @@ find_file_callback (filename, data1, data2)
LT_DLFREE (*pdir); LT_DLFREE (*pdir);
*pdir = lt_estrdup (filename); *pdir = lt_estrdup (filename);
is_done = (*pdir == 0) ? -1 : 1; is_done = (*pdir == NULL) ? -1 : 1;
} }
return is_done; return is_done;
@ -2236,7 +2259,7 @@ find_file (search_path, base_name, pdir)
const char *base_name; const char *base_name;
char **pdir; char **pdir;
{ {
FILE *file = 0; FILE *file = NULL;
foreach_dirinpath (search_path, base_name, find_file_callback, pdir, &file); foreach_dirinpath (search_path, base_name, find_file_callback, pdir, &file);
@ -2249,17 +2272,17 @@ find_handle_callback (filename, data, ignored)
lt_ptr data; lt_ptr data;
lt_ptr ignored; lt_ptr ignored;
{ {
lt_dlhandle *handle = (lt_dlhandle *) data; lt_dlhandle *handle = (lt_dlhandle *) data;
int found = access (filename, R_OK); int notfound = access (filename, R_OK);
/* Bail out if file cannot be read... */ /* Bail out if file cannot be read... */
if (!found) if (notfound)
return 0; return 0;
/* Try to dlopen the file, but do not continue searching in any /* Try to dlopen the file, but do not continue searching in any
case. */ case. */
if (tryall_dlopen (handle, filename) != 0) if (tryall_dlopen (handle, filename) != 0)
*handle = 0; *handle = NULL;
return 1; return 1;
} }
@ -2288,10 +2311,10 @@ load_deplibs (handle, deplibs)
char *deplibs; char *deplibs;
{ {
#if LTDL_DLOPEN_DEPLIBS #if LTDL_DLOPEN_DEPLIBS
char *p, *save_search_path = 0; char *p, *save_search_path = NULL;
int depcount = 0; int depcount = 0;
int i; int i;
char **names = 0; char **names = NULL;
#endif #endif
int errors = 0; int errors = 0;
@ -2327,7 +2350,7 @@ load_deplibs (handle, deplibs)
if (strncmp(p, "-L", 2) == 0 || strncmp(p, "-R", 2) == 0) if (strncmp(p, "-L", 2) == 0 || strncmp(p, "-R", 2) == 0)
{ {
char save = *end; char save = *end;
*end = 0; /* set a temporary string terminator */ *end = '\0'; /* set a temporary string terminator */
if (lt_dladdsearchdir(p+2)) if (lt_dladdsearchdir(p+2))
{ {
goto cleanup; goto cleanup;
@ -2384,7 +2407,7 @@ load_deplibs (handle, deplibs)
{ {
char *name; char *name;
char save = *end; char save = *end;
*end = 0; /* set a temporary string terminator */ *end = '\0'; /* set a temporary string terminator */
if (strncmp(p, "-l", 2) == 0) if (strncmp(p, "-l", 2) == 0)
{ {
size_t name_len = 3+ /* "lib" */ LT_STRLEN (p + 2); size_t name_len = 3+ /* "lib" */ LT_STRLEN (p + 2);
@ -2473,7 +2496,7 @@ trim (dest, str)
/* remove the leading and trailing "'" from str /* remove the leading and trailing "'" from str
and store the result in dest */ and store the result in dest */
const char *end = strrchr (str, '\''); const char *end = strrchr (str, '\'');
int len = LT_STRLEN (str); size_t len = LT_STRLEN (str);
char *tmp; char *tmp;
LT_DLFREE (*dest); LT_DLFREE (*dest);
@ -2490,7 +2513,7 @@ trim (dest, str)
} }
else else
{ {
*dest = 0; *dest = NULL;
} }
return 0; return 0;
@ -2511,22 +2534,22 @@ free_vars (dlname, oldname, libdir, deplibs)
return 0; return 0;
} }
int static int
try_dlopen (phandle, filename) try_dlopen (phandle, filename)
lt_dlhandle *phandle; lt_dlhandle *phandle;
const char *filename; const char *filename;
{ {
const char * ext = 0; const char * ext = NULL;
const char * saved_error = 0; const char * saved_error = NULL;
char * canonical = 0; char * canonical = NULL;
char * base_name = 0; char * base_name = NULL;
char * dir = 0; char * dir = NULL;
char * name = 0; char * name = NULL;
int errors = 0; int errors = 0;
lt_dlhandle newhandle; lt_dlhandle newhandle;
assert (phandle); assert (phandle);
assert (*phandle == 0); assert (*phandle == NULL);
LT_DLMUTEX_GETERROR (saved_error); LT_DLMUTEX_GETERROR (saved_error);
@ -2534,7 +2557,7 @@ try_dlopen (phandle, filename)
if (!filename) if (!filename)
{ {
*phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1); *phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1);
if (*phandle == 0) if (*phandle == NULL)
return 1; return 1;
memset (*phandle, 0, sizeof(struct lt_dlhandle_struct)); memset (*phandle, 0, sizeof(struct lt_dlhandle_struct));
@ -2591,14 +2614,13 @@ try_dlopen (phandle, filename)
if (ext && strcmp (ext, archive_ext) == 0) if (ext && strcmp (ext, archive_ext) == 0)
{ {
/* this seems to be a libtool module */ /* this seems to be a libtool module */
FILE * file = 0; FILE * file = NULL;
char * dlname = 0; char * dlname = NULL;
char * old_name = 0; char * old_name = NULL;
char * libdir = 0; char * libdir = NULL;
char * deplibs = 0; char * deplibs = NULL;
char * line = 0; char * line = NULL;
size_t line_len; size_t line_len;
int i;
/* if we can't find the installed flag, it is probably an /* if we can't find the installed flag, it is probably an
installed libtool archive, produced with an old version installed libtool archive, produced with an old version
@ -2614,23 +2636,26 @@ try_dlopen (phandle, filename)
} }
/* canonicalize the module name */ /* canonicalize the module name */
for (i = 0; i < ext - base_name; ++i) {
{ size_t i;
if (isalnum ((int)(base_name[i]))) for (i = 0; i < ext - base_name; ++i)
{ {
name[i] = base_name[i]; if (isalnum ((int)(base_name[i])))
} {
else name[i] = base_name[i];
{ }
name[i] = '_'; else
} {
} name[i] = '_';
name[ext - base_name] = LT_EOS_CHAR; }
}
name[ext - base_name] = LT_EOS_CHAR;
}
/* Now try to open the .la file. If there is no directory name /* Now try to open the .la file. If there is no directory name
component, try to find it first in user_search_path and then other component, try to find it first in user_search_path and then other
prescribed paths. Otherwise (or in any case if the module was not prescribed paths. Otherwise (or in any case if the module was not
yet found) try opening just the module name as passed. */ yet found) try opening just the module name as passed. */
if (!dir) if (!dir)
{ {
const char *search_path; const char *search_path;
@ -2689,7 +2714,7 @@ try_dlopen (phandle, filename)
/* read the .la file */ /* read the .la file */
while (!feof (file)) while (!feof (file))
{ {
if (!fgets (line, line_len, file)) if (!fgets (line, (int) line_len, file))
{ {
break; break;
} }
@ -2699,7 +2724,7 @@ try_dlopen (phandle, filename)
while (line[LT_STRLEN(line) -1] != '\n') while (line[LT_STRLEN(line) -1] != '\n')
{ {
line = LT_DLREALLOC (char, line, line_len *2); line = LT_DLREALLOC (char, line, line_len *2);
if (!fgets (&line[line_len -1], line_len +1, file)) if (!fgets (&line[line_len -1], (int) line_len +1, file))
{ {
break; break;
} }
@ -2757,7 +2782,7 @@ try_dlopen (phandle, filename)
errors += trim (&dlname, &line[sizeof (STR_LIBRARY_NAMES) - 1]); errors += trim (&dlname, &line[sizeof (STR_LIBRARY_NAMES) - 1]);
if (!errors if (!errors
&& dlname && dlname
&& (last_libname = strrchr (dlname, ' ')) != 0) && (last_libname = strrchr (dlname, ' ')) != NULL)
{ {
last_libname = lt_estrdup (last_libname + 1); last_libname = lt_estrdup (last_libname + 1);
if (!last_libname) if (!last_libname)
@ -2778,7 +2803,7 @@ try_dlopen (phandle, filename)
/* allocate the handle */ /* allocate the handle */
*phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1); *phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1);
if (*phandle == 0) if (*phandle == NULL)
++errors; ++errors;
if (errors) if (errors)
@ -2822,7 +2847,7 @@ try_dlopen (phandle, filename)
{ {
/* not a libtool module */ /* not a libtool module */
*phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1); *phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1);
if (*phandle == 0) if (*phandle == NULL)
{ {
++errors; ++errors;
goto cleanup; goto cleanup;
@ -2847,7 +2872,10 @@ try_dlopen (phandle, filename)
#endif #endif
))) )))
{ {
tryall_dlopen (&newhandle, filename); if (tryall_dlopen (&newhandle, filename) != 0)
{
newhandle = NULL;
}
} }
if (!newhandle) if (!newhandle)
@ -2886,7 +2914,7 @@ lt_dlhandle
lt_dlopen (filename) lt_dlopen (filename)
const char *filename; const char *filename;
{ {
lt_dlhandle handle = 0; lt_dlhandle handle = NULL;
/* Just incase we missed a code path in try_dlopen() that reports /* Just incase we missed a code path in try_dlopen() that reports
an error, but forgets to reset handle... */ an error, but forgets to reset handle... */
@ -2898,10 +2926,10 @@ lt_dlopen (filename)
/* If the last error messge store was `FILE_NOT_FOUND', then return /* If the last error messge store was `FILE_NOT_FOUND', then return
non-zero. */ non-zero. */
int static int
file_not_found () file_not_found ()
{ {
const char *error = 0; const char *error = NULL;
LT_DLMUTEX_GETERROR (error); LT_DLMUTEX_GETERROR (error);
if (error == LT_DLSTRERROR (FILE_NOT_FOUND)) if (error == LT_DLSTRERROR (FILE_NOT_FOUND))
@ -2918,12 +2946,11 @@ lt_dlhandle
lt_dlopenext (filename) lt_dlopenext (filename)
const char *filename; const char *filename;
{ {
lt_dlhandle handle = 0; lt_dlhandle handle = NULL;
char * tmp = 0; char * tmp = NULL;
char * ext = 0; char * ext = NULL;
int len; size_t len;
int errors = 0; int errors = 0;
int file_found = 1; /* until proven otherwise */
if (!filename) if (!filename)
{ {
@ -3002,7 +3029,7 @@ lt_dlopenext (filename)
} }
int static int
lt_argz_insert (pargz, pargz_len, before, entry) lt_argz_insert (pargz, pargz_len, before, entry)
char **pargz; char **pargz;
size_t *pargz_len; size_t *pargz_len;
@ -3028,13 +3055,13 @@ lt_argz_insert (pargz, pargz_len, before, entry)
return 0; return 0;
} }
int static int
lt_argz_insertinorder (pargz, pargz_len, entry) lt_argz_insertinorder (pargz, pargz_len, entry)
char **pargz; char **pargz;
size_t *pargz_len; size_t *pargz_len;
const char *entry; const char *entry;
{ {
char *before = 0; char *before = NULL;
assert (pargz); assert (pargz);
assert (pargz_len); assert (pargz_len);
@ -3052,16 +3079,16 @@ lt_argz_insertinorder (pargz, pargz_len, entry)
return lt_argz_insert (pargz, pargz_len, before, entry); return lt_argz_insert (pargz, pargz_len, before, entry);
} }
int static int
lt_argz_insertdir (pargz, pargz_len, dirnam, dp) lt_argz_insertdir (pargz, pargz_len, dirnam, dp)
char **pargz; char **pargz;
size_t *pargz_len; size_t *pargz_len;
const char *dirnam; const char *dirnam;
struct dirent *dp; struct dirent *dp;
{ {
char *buf = 0; char *buf = NULL;
size_t buf_len = 0; size_t buf_len = 0;
char *end = 0; char *end = NULL;
size_t end_offset = 0; size_t end_offset = 0;
size_t dir_len = 0; size_t dir_len = 0;
int errors = 0; int errors = 0;
@ -3118,13 +3145,13 @@ lt_argz_insertdir (pargz, pargz_len, dirnam, dp)
return errors; return errors;
} }
int static int
list_files_by_dir (dirnam, pargz, pargz_len) list_files_by_dir (dirnam, pargz, pargz_len)
const char *dirnam; const char *dirnam;
char **pargz; char **pargz;
size_t *pargz_len; size_t *pargz_len;
{ {
DIR *dirp = 0; DIR *dirp = NULL;
int errors = 0; int errors = 0;
assert (dirnam && *dirnam); assert (dirnam && *dirnam);
@ -3135,7 +3162,7 @@ list_files_by_dir (dirnam, pargz, pargz_len)
dirp = opendir (dirnam); dirp = opendir (dirnam);
if (dirp) if (dirp)
{ {
struct dirent *dp = 0; struct dirent *dp = NULL;
while ((dp = readdir (dirp))) while ((dp = readdir (dirp)))
if (dp->d_name[0] != '.') if (dp->d_name[0] != '.')
@ -3166,7 +3193,7 @@ foreachfile_callback (dirname, data1, data2)
= (int (*) LT_PARAMS((const char *filename, lt_ptr data))) data1; = (int (*) LT_PARAMS((const char *filename, lt_ptr data))) data1;
int is_done = 0; int is_done = 0;
char *argz = 0; char *argz = NULL;
size_t argz_len = 0; size_t argz_len = 0;
if (list_files_by_dir (dirname, &argz, &argz_len) != 0) if (list_files_by_dir (dirname, &argz, &argz_len) != 0)
@ -3175,7 +3202,7 @@ foreachfile_callback (dirname, data1, data2)
goto cleanup; goto cleanup;
{ {
char *filename = 0; char *filename = NULL;
while ((filename = argz_next (argz, argz_len, filename))) while ((filename = argz_next (argz, argz_len, filename)))
if ((is_done = (*func) (filename, data2))) if ((is_done = (*func) (filename, data2)))
break; break;
@ -3285,6 +3312,9 @@ lt_dlclose (handle)
errors += handle->loader->module_close (data, handle->module); errors += handle->loader->module_close (data, handle->module);
errors += unload_deplibs(handle); errors += unload_deplibs(handle);
/* It is up to the callers to free the data itself. */
LT_DLFREE (handle->caller_data);
LT_DLFREE (handle->info.filename); LT_DLFREE (handle->info.filename);
LT_DLFREE (handle->info.name); LT_DLFREE (handle->info.name);
LT_DLFREE (handle); LT_DLFREE (handle);
@ -3309,7 +3339,7 @@ lt_dlsym (handle, symbol)
lt_dlhandle handle; lt_dlhandle handle;
const char *symbol; const char *symbol;
{ {
int lensym; size_t lensym;
char lsym[LT_SYMBOL_LENGTH]; char lsym[LT_SYMBOL_LENGTH];
char *sym; char *sym;
lt_ptr address; lt_ptr address;
@ -3409,15 +3439,15 @@ lt_dlerror ()
return error ? error : LT_DLSTRERROR (UNKNOWN); return error ? error : LT_DLSTRERROR (UNKNOWN);
} }
int static int
lt_dlpath_insertdir (ppath, before, dir) lt_dlpath_insertdir (ppath, before, dir)
char **ppath; char **ppath;
char *before; char *before;
const char *dir; const char *dir;
{ {
int errors = 0; int errors = 0;
char *canonical = 0; char *canonical = NULL;
char *argz = 0; char *argz = NULL;
size_t argz_len = 0; size_t argz_len = 0;
assert (ppath); assert (ppath);
@ -3432,13 +3462,13 @@ lt_dlpath_insertdir (ppath, before, dir)
assert (canonical && *canonical); assert (canonical && *canonical);
/* If *PPATH is empty, set it to DIR. */ /* If *PPATH is empty, set it to DIR. */
if (*ppath == 0) if (*ppath == NULL)
{ {
assert (!before); /* BEFORE cannot be set without PPATH. */ assert (!before); /* BEFORE cannot be set without PPATH. */
assert (dir); /* Without DIR, don't call this function! */ assert (dir); /* Without DIR, don't call this function! */
*ppath = lt_estrdup (dir); *ppath = lt_estrdup (dir);
if (*ppath == 0) if (*ppath == NULL)
++errors; ++errors;
return errors; return errors;
@ -3672,7 +3702,7 @@ lt_dlcaller_set_data (key, handle, data)
lt_ptr data; lt_ptr data;
{ {
int n_elements = 0; int n_elements = 0;
lt_ptr stale = (lt_ptr) 0; lt_ptr stale = NULL;
int i; int i;
/* This needs to be locked so that the caller data can be updated /* This needs to be locked so that the caller data can be updated
@ -3701,7 +3731,7 @@ lt_dlcaller_set_data (key, handle, data)
if (!temp) if (!temp)
{ {
stale = 0; stale = NULL;
goto done; goto done;
} }
@ -3761,12 +3791,12 @@ lt_dlloader_add (place, dlloader, loader_name)
const char *loader_name; const char *loader_name;
{ {
int errors = 0; int errors = 0;
lt_dlloader *node = 0, *ptr = 0; lt_dlloader *node = NULL, *ptr = NULL;
if ((dlloader == 0) /* diagnose null parameters */ if ((dlloader == NULL) /* diagnose null parameters */
|| (dlloader->module_open == 0) || (dlloader->module_open == NULL)
|| (dlloader->module_close == 0) || (dlloader->module_close == NULL)
|| (dlloader->find_sym == 0)) || (dlloader->find_sym == NULL))
{ {
LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_LOADER)); LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_LOADER));
return 1; return 1;
@ -3777,7 +3807,7 @@ lt_dlloader_add (place, dlloader, loader_name)
if (!node) if (!node)
return 1; return 1;
node->next = 0; node->next = NULL;
node->loader_name = loader_name; node->loader_name = loader_name;
node->sym_prefix = dlloader->sym_prefix; node->sym_prefix = dlloader->sym_prefix;
node->dlloader_exit = dlloader->dlloader_exit; node->dlloader_exit = dlloader->dlloader_exit;
@ -3913,7 +3943,7 @@ const char *
lt_dlloader_name (place) lt_dlloader_name (place)
lt_dlloader *place; lt_dlloader *place;
{ {
const char *name = 0; const char *name = NULL;
if (place) if (place)
{ {
@ -3933,7 +3963,7 @@ lt_user_data *
lt_dlloader_data (place) lt_dlloader_data (place)
lt_dlloader *place; lt_dlloader *place;
{ {
lt_user_data *data = 0; lt_user_data *data = NULL;
if (place) if (place)
{ {
@ -3953,7 +3983,7 @@ lt_dlloader *
lt_dlloader_find (loader_name) lt_dlloader_find (loader_name)
const char *loader_name; const char *loader_name;
{ {
lt_dlloader *place = 0; lt_dlloader *place = NULL;
LT_DLMUTEX_LOCK (); LT_DLMUTEX_LOCK ();
for (place = loaders; place; place = place->next) for (place = loaders; place; place = place->next)