2005 |
|| (path[1+ src] == LT_EOS_CHAR)) |
|| (path[1+ src] == LT_EOS_CHAR)) |
2006 |
continue; |
continue; |
2007 |
} |
} |
2008 |
|
|
2009 |
/* Anything other than a directory separator is copied verbatim. */ |
/* Anything other than a directory separator is copied verbatim. */ |
2010 |
else if ((path[src] != '/') |
if ((path[src] != '/') |
2011 |
#ifdef LT_DIRSEP_CHAR |
#ifdef LT_DIRSEP_CHAR |
2012 |
&& (path[src] != LT_DIRSEP_CHAR) |
&& (path[src] != LT_DIRSEP_CHAR) |
2013 |
#endif |
#endif |
2014 |
) |
) |
2015 |
{ |
{ |
2016 |
canonical[dest++] = path[src]; |
canonical[dest++] = path[src]; |
2017 |
} |
} |
2019 |
not at the end of a path -- i.e. before a path separator or |
not at the end of a path -- i.e. before a path separator or |
2020 |
NULL terminator. */ |
NULL terminator. */ |
2021 |
else if ((path[1+ src] != LT_PATHSEP_CHAR) |
else if ((path[1+ src] != LT_PATHSEP_CHAR) |
2022 |
&& (path[1 + src] != LT_EOS_CHAR)) |
&& (path[1+ src] != LT_EOS_CHAR) |
2023 |
|
#ifdef LT_DIRSEP_CHAR |
2024 |
|
&& (path[1+ src] != LT_DIRSEP_CHAR) |
2025 |
|
#endif |
2026 |
|
&& (path[1+ src] != '/')) |
2027 |
{ |
{ |
2028 |
canonical[dest++] = '/'; |
canonical[dest++] = '/'; |
2029 |
} |
} |
2084 |
int result = 0; |
int result = 0; |
2085 |
int filenamesize = 0; |
int filenamesize = 0; |
2086 |
int lenbase = LT_STRLEN (base_name); |
int lenbase = LT_STRLEN (base_name); |
2087 |
|
int argz_len = 0; |
2088 |
|
char *argz = 0; |
2089 |
char *filename = 0; |
char *filename = 0; |
2090 |
char *canonical = 0; |
char *canonical = 0; |
|
char *next; |
|
2091 |
|
|
2092 |
LT_DLMUTEX_LOCK (); |
LT_DLMUTEX_LOCK (); |
2093 |
|
|
2098 |
} |
} |
2099 |
|
|
2100 |
if (canonicalize_path (search_path, &canonical) != 0) |
if (canonicalize_path (search_path, &canonical) != 0) |
2101 |
{ |
goto cleanup; |
|
LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_MEMORY)); |
|
|
goto cleanup; |
|
|
} |
|
|
|
|
|
next = canonical; |
|
|
while (next) |
|
|
{ |
|
|
char *cur = next; |
|
|
int lendir; |
|
2102 |
|
|
2103 |
next = strchr (cur, LT_PATHSEP_CHAR); |
if (argzize_path (canonical, &argz, &argz_len) != 0) |
2104 |
if (!next) |
goto cleanup; |
|
next = cur + strlen (cur); |
|
|
|
|
|
lendir = next - cur; |
|
|
if (*next == LT_PATHSEP_CHAR) |
|
|
++next; |
|
|
else |
|
|
next = 0; |
|
2105 |
|
|
2106 |
if (lendir == 0) |
{ |
2107 |
continue; |
char *dir_name = 0; |
2108 |
|
while ((dir_name = argz_next (argz, argz_len, dir_name))) |
2109 |
|
{ |
2110 |
|
int lendir = LT_STRLEN (dir_name); |
2111 |
|
|
2112 |
if (lendir +1 +lenbase >= filenamesize) |
if (lendir +1 +lenbase >= filenamesize) |
2113 |
{ |
{ |
2114 |
LT_DLFREE (filename); |
LT_DLFREE (filename); |
2115 |
filenamesize = lendir +1 +lenbase +1; /* "/d" + '/' + "f" + '\0' */ |
filenamesize = lendir +1 +lenbase +1; /* "/d" + '/' + "f" + '\0' */ |
2116 |
filename = LT_DLMALLOC (char, filenamesize); |
filename = LT_EMALLOC (char, filenamesize); |
|
|
|
2117 |
if (!filename) |
if (!filename) |
2118 |
{ |
goto cleanup; |
|
LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_MEMORY)); |
|
|
goto cleanup; |
|
|
} |
|
2119 |
} |
} |
2120 |
|
|
2121 |
strncpy (filename, cur, lendir); |
strncpy (filename, dir_name, lendir); |
2122 |
if (filename[lendir -1] != '/') |
if (base_name && *base_name) |
2123 |
filename[lendir++] = '/'; |
{ |
2124 |
if (base_name && *base_name) |
if (filename[lendir -1] != '/') |
2125 |
strcpy (filename +lendir, base_name); |
filename[lendir++] = '/'; |
2126 |
|
strcpy (filename +lendir, base_name); |
2127 |
if ((result = (*func) (filename, data1, data2))) |
} |
2128 |
{ |
|
2129 |
break; |
if ((result = (*func) (filename, data1, data2))) |
2130 |
} |
{ |
2131 |
} |
break; |
2132 |
|
} |
2133 |
|
} |
2134 |
|
} |
2135 |
|
|
2136 |
cleanup: |
cleanup: |
2137 |
|
LT_DLFREE (argz); |
2138 |
LT_DLFREE (canonical); |
LT_DLFREE (canonical); |
2139 |
LT_DLFREE (filename); |
LT_DLFREE (filename); |
2140 |
|
|
2682 |
LT_DLFREE (line); |
LT_DLFREE (line); |
2683 |
|
|
2684 |
/* allocate the handle */ |
/* allocate the handle */ |
2685 |
handle = (lt_dlhandle) LT_DLMALLOC (struct lt_dlhandle_struct, 1); |
handle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1); |
2686 |
if (!handle) |
if (!handle) |
2687 |
++error; |
++error; |
2688 |
|
|
2942 |
/* Prepend the directory name. */ |
/* Prepend the directory name. */ |
2943 |
end_offset = end - dp->d_name; |
end_offset = end - dp->d_name; |
2944 |
buf_len = dir_len + 1+ end_offset; |
buf_len = dir_len + 1+ end_offset; |
2945 |
buf = LT_DLMALLOC (char, 1+ buf_len); |
buf = LT_EMALLOC (char, 1+ buf_len); |
2946 |
if (!buf) |
if (!buf) |
2947 |
return ++errors; |
return ++errors; |
2948 |
|
|
2969 |
size_t *pargz_len; |
size_t *pargz_len; |
2970 |
{ |
{ |
2971 |
DIR *dirp = 0; |
DIR *dirp = 0; |
|
char *argz = 0; |
|
|
size_t argz_len = 0; |
|
2972 |
int errors = 0; |
int errors = 0; |
2973 |
|
|
2974 |
assert (dirnam && *dirnam); |
assert (dirnam && *dirnam); |
2983 |
|
|
2984 |
while ((dp = readdir (dirp))) |
while ((dp = readdir (dirp))) |
2985 |
if (dp->d_name[0] != '.') |
if (dp->d_name[0] != '.') |
2986 |
if (lt_argz_insertdir (&argz, &argz_len, dirnam, dp)) |
if (lt_argz_insertdir (pargz, pargz_len, dirnam, dp)) |
2987 |
{ |
{ |
2988 |
++errors; |
++errors; |
2989 |
break; |
break; |
2991 |
|
|
2992 |
closedir (dirp); |
closedir (dirp); |
2993 |
} |
} |
2994 |
|
else |
2995 |
|
++errors; |
2996 |
|
|
2997 |
return errors; |
return errors; |
2998 |
} |
} |
3009 |
int (*func) LT_PARAMS((const char *filename, lt_ptr data)) |
int (*func) LT_PARAMS((const char *filename, lt_ptr data)) |
3010 |
= (int (*) LT_PARAMS((const char *filename, lt_ptr data))) data1; |
= (int (*) LT_PARAMS((const char *filename, lt_ptr data))) data1; |
3011 |
|
|
3012 |
int is_done = 0; |
int is_done = 0; |
3013 |
char *argz; |
char *argz = 0; |
3014 |
size_t argz_len; |
size_t argz_len = 0; |
3015 |
|
|
3016 |
if (list_files_by_dir (dirname, &argz, &argz_len) != 0) |
if (list_files_by_dir (dirname, &argz, &argz_len) != 0) |
3017 |
goto cleanup; |
goto cleanup; |
3018 |
|
if (!argz) |
3019 |
|
goto cleanup; |
3020 |
|
|
3021 |
{ |
{ |
3022 |
char *filename = 0; |
char *filename = 0; |