17 #include <sys/types.h>
52 path = (
char *) malloc (MAX_PATH);
59 len = GetModuleFileNameA(
NULL, path, MAX_PATH);
60 if (len == 0 || len >= MAX_PATH) {
68 for (DWORD i = 0; i < len; i++) {
74#elif !defined(ENABLE_BINRELOC)
80 char *path, *path2, *line, *result;
87 if (
sizeof (path) > SSIZE_MAX)
88 buf_size = SSIZE_MAX - 1;
90 buf_size = PATH_MAX - 1;
91 path = (
char *) malloc (buf_size);
98 path2 = (
char *) malloc (buf_size);
107 strncpy (path2,
"/proc/self/exe", buf_size - 1);
112 size = readlink (path2, path, buf_size - 1);
124 i = stat (path, &stat_buf);
132 if (!S_ISLNK (stat_buf.st_mode)) {
139 strncpy (path, path2, buf_size - 1);
146 buf_size = PATH_MAX + 128;
147 line = (
char *) realloc (path, buf_size);
156 f = fopen (
"/proc/self/maps",
"r");
165 result = fgets (line, (
int) buf_size, f);
166 if (result ==
NULL) {
175 buf_size = strlen (line);
184 if (line[buf_size - 1] == 10)
185 line[buf_size - 1] = 0;
188 path = strchr (line,
'/');
191 if (strstr (line,
" r-xp ") ==
NULL || path ==
NULL) {
199 path = strdup (path);
212_br_find_exe_for_symbol (
const void *symbol,
BrInitError *error)
214#ifndef ENABLE_BINRELOC
217 return (
char *)
NULL;
219 #define SIZE PATH_MAX + 100
221 size_t address_string_len;
222 char *address_string, line[SIZE], *found;
225 return (
char *)
NULL;
227 f = fopen (
"/proc/self/maps",
"r");
229 return (
char *)
NULL;
231 address_string_len = 4;
232 address_string = (
char *) malloc (address_string_len);
233 found = (
char *)
NULL;
236 char *start_addr, *end_addr, *end_addr_end, *file;
237 void *start_addr_p, *end_addr_p;
240 if (fgets (line, SIZE, f) ==
NULL)
244 if (strstr (line,
" r-xp ") ==
NULL || strchr (line,
'/') ==
NULL)
249 end_addr = strchr (line,
'-');
250 file = strchr (line,
'/');
253 if (!(file > end_addr && end_addr !=
NULL && end_addr[0] ==
'-'))
258 end_addr_end = strchr (end_addr,
' ');
259 if (end_addr_end ==
NULL)
262 end_addr_end[0] =
'\0';
266 if (file[len - 1] ==
'\n')
267 file[len - 1] =
'\0';
271 if (len > 10 && strcmp (file + len - 10,
" (deleted)") == 0)
272 file[len - 10] =
'\0';
275 len = strlen (start_addr);
276 if (len != strlen (end_addr))
282 if (address_string_len < len + 3) {
283 address_string_len = len + 3;
284 address_string = (
char *) realloc (address_string, address_string_len);
287 memcpy (address_string,
"0x", 2);
288 memcpy (address_string + 2, start_addr, len);
289 address_string[2 + len] =
'\0';
290 sscanf (address_string,
"%p", &start_addr_p);
292 memcpy (address_string,
"0x", 2);
293 memcpy (address_string + 2, end_addr, len);
294 address_string[2 + len] =
'\0';
295 sscanf (address_string,
"%p", &end_addr_p);
298 if (symbol >= start_addr_p && symbol < end_addr_p) {
304 free (address_string);
308 return (
char *)
NULL;
310 return strdup (found);
315#ifndef BINRELOC_RUNNING_DOXYGEN
317 #define NULL ((void *) 0)
320static char *exe = (
char *)
NULL;
340 exe = _br_find_exe (error);
362 exe = _br_find_exe_for_symbol ((
const void *)
"", error);
379 if (exe == (
char *)
NULL) {
381 if (default_exe != (
const char *)
NULL)
382 return strdup (default_exe);
384 return (
char *)
NULL;
409 if (default_dir !=
NULL)
410 return strdup (default_dir);
437 if (exe == (
char *)
NULL) {
439 if (default_prefix != (
const char *)
NULL)
440 return strdup (default_prefix);
442 return (
char *)
NULL;
471 if (prefix == (
char *)
NULL) {
473 if (default_bin_dir != (
const char *)
NULL)
474 return strdup (default_bin_dir);
476 return (
char *)
NULL;
504 if (prefix == (
char *)
NULL) {
506 if (default_sbin_dir != (
const char *)
NULL)
507 return strdup (default_sbin_dir);
509 return (
char *)
NULL;
538 if (prefix == (
char *)
NULL) {
540 if (default_data_dir != (
const char *)
NULL)
541 return strdup (default_data_dir);
543 return (
char *)
NULL;
568 char *data_dir, *dir;
571 if (data_dir == (
char *)
NULL) {
573 if (default_locale_dir != (
const char *)
NULL)
574 return strdup (default_locale_dir);
576 return (
char *)
NULL;
604 if (prefix == (
char *)
NULL) {
606 if (default_lib_dir != (
const char *)
NULL)
607 return strdup (default_lib_dir);
609 return (
char *)
NULL;
637 if (prefix == (
char *)
NULL) {
639 if (default_libexec_dir != (
const char *)
NULL)
640 return strdup (default_libexec_dir);
642 return (
char *)
NULL;
670 if (prefix == (
char *)
NULL) {
672 if (default_etc_dir != (
const char *)
NULL)
673 return strdup (default_etc_dir);
675 return (
char *)
NULL;
705 len1 = strlen (str1);
706 len2 = strlen (str2);
708 result = (
char *) malloc (len1 + len2 + 1);
709 memcpy (result, str1, len1);
710 memcpy (result + len1, str2, len2);
711 result[len1 + len2] =
'\0';
725 if (len > 0 && dir[len - 1] !=
'/') {
740br_strndup (
const char *str,
size_t size)
742 char *result = (
char *)
NULL;
745 if (str == (
const char *)
NULL)
746 return (
char *)
NULL;
754 result = (
char *) malloc (len + 1);
755 memcpy (result, str, size);
781 if (path == (
const char *)
NULL)
782 return (
char *)
NULL;
784 end = strrchr (path,
'/');
785 if (end == (
const char *)
NULL)
788 while (end > path && *end ==
'/')
790 result = br_strndup (path, end - path + 1);
791 if (result[0] == 0) {
char * br_find_prefix(const char *default_prefix)
char * br_find_bin_dir(const char *default_bin_dir)
char * br_dirname(const char *path)
char * br_find_locale_dir(const char *default_locale_dir)
int br_init(BrInitError *error)
char * br_find_sbin_dir(const char *default_sbin_dir)
char * br_strcat(const char *str1, const char *str2)
char * br_find_exe_dir(const char *default_dir)
int br_init_lib(BrInitError *error)
char * br_find_exe(const char *default_exe)
char * br_find_lib_dir(const char *default_lib_dir)
char * br_find_etc_dir(const char *default_etc_dir)
char * br_build_path(const char *dir, const char *file)
char * br_find_data_dir(const char *default_data_dir)
char * br_find_libexec_dir(const char *default_libexec_dir)
@ BR_INIT_ERROR_OPEN_MAPS
@ BR_INIT_ERROR_INVALID_MAPS
@ BR_INIT_ERROR_READ_MAPS