13 #ifndef __BINRELOC_C__
14 #define __BINRELOC_C__
18 #ifdef ENABLE_BINRELOC
19 #include <sys/types.h>
36 # define DIRSEP_C '\\'
49 #ifndef ENABLE_BINRELOC
54 char *path, *path2, *line, *result;
61 if (
sizeof (path) > SSIZE_MAX)
62 buf_size = SSIZE_MAX - 1;
64 buf_size = PATH_MAX - 1;
65 path = (
char *) malloc (buf_size);
72 path2 = (
char *) malloc (buf_size);
81 strncpy (path2,
"/proc/self/exe", buf_size - 1);
86 size = readlink (path2, path, buf_size - 1);
98 i = stat (path, &stat_buf);
106 if (!S_ISLNK (stat_buf.st_mode)) {
113 strncpy (path, path2, buf_size - 1);
120 buf_size = PATH_MAX + 128;
121 line = (
char *) realloc (path, buf_size);
130 f = fopen (
"/proc/self/maps",
"r");
139 result = fgets (line, (
int) buf_size, f);
140 if (result ==
NULL) {
149 buf_size = strlen (line);
158 if (line[buf_size - 1] == 10)
159 line[buf_size - 1] = 0;
165 if (strstr (line,
" r-xp ") ==
NULL || path ==
NULL) {
173 path = strdup (path);
187 #ifndef ENABLE_BINRELOC
190 return (
char *)
NULL;
192 #define SIZE PATH_MAX + 100
194 size_t address_string_len;
195 char *address_string, line[SIZE], *found;
198 return (
char *)
NULL;
200 f = fopen (
"/proc/self/maps",
"r");
202 return (
char *)
NULL;
204 address_string_len = 4;
205 address_string = (
char *) malloc (address_string_len);
206 found = (
char *)
NULL;
209 char *start_addr, *end_addr, *end_addr_end, *file;
210 void *start_addr_p, *end_addr_p;
213 if (fgets (line, SIZE, f) ==
NULL)
217 if (strstr (line,
" r-xp ") ==
NULL || strchr (line,
'/') ==
NULL)
222 end_addr = strchr (line,
'-');
223 file = strchr (line,
'/');
226 if (!(file > end_addr && end_addr !=
NULL && end_addr[0] ==
'-'))
231 end_addr_end = strchr (end_addr,
' ');
232 if (end_addr_end ==
NULL)
235 end_addr_end[0] =
'\0';
239 if (file[len - 1] ==
'\n')
240 file[len - 1] =
'\0';
244 if (len > 10 && strcmp (file + len - 10,
" (deleted)") == 0)
245 file[len - 10] =
'\0';
248 len = strlen (start_addr);
249 if (len != strlen (end_addr))
255 if (address_string_len < len + 3) {
256 address_string_len = len + 3;
257 address_string = (
char *) realloc (address_string, address_string_len);
260 memcpy (address_string,
"0x", 2);
261 memcpy (address_string + 2, start_addr, len);
262 address_string[2 + len] =
'\0';
263 sscanf (address_string,
"%p", &start_addr_p);
265 memcpy (address_string,
"0x", 2);
266 memcpy (address_string + 2, end_addr, len);
267 address_string[2 + len] =
'\0';
268 sscanf (address_string,
"%p", &end_addr_p);
271 if (symbol >= start_addr_p && symbol < end_addr_p) {
277 free (address_string);
281 return (
char *)
NULL;
283 return strdup (found);
288 #ifndef BINRELOC_RUNNING_DOXYGEN
290 #define NULL ((void *) 0)
349 if (exe == (
char *)
NULL) {
351 if (default_exe != (
const char *)
NULL)
352 return strdup (default_exe);
354 return (
char *)
NULL;
378 if (default_dir !=
NULL)
379 return strdup (default_dir);
405 if (exe == (
char *)
NULL) {
407 if (default_prefix != (
const char *)
NULL)
408 return strdup (default_prefix);
410 return (
char *)
NULL;
438 if (prefix == (
char *)
NULL) {
440 if (default_bin_dir != (
const char *)
NULL)
441 return strdup (default_bin_dir);
443 return (
char *)
NULL;
470 if (prefix == (
char *)
NULL) {
472 if (default_sbin_dir != (
const char *)
NULL)
473 return strdup (default_sbin_dir);
475 return (
char *)
NULL;
503 if (prefix == (
char *)
NULL) {
505 if (default_data_dir != (
const char *)
NULL)
506 return strdup (default_data_dir);
508 return (
char *)
NULL;
532 char *data_dir, *dir;
535 if (data_dir == (
char *)
NULL) {
537 if (default_locale_dir != (
const char *)
NULL)
538 return strdup (default_locale_dir);
540 return (
char *)
NULL;
567 if (prefix == (
char *)
NULL) {
569 if (default_lib_dir != (
const char *)
NULL)
570 return strdup (default_lib_dir);
572 return (
char *)
NULL;
599 if (prefix == (
char *)
NULL) {
601 if (default_libexec_dir != (
const char *)
NULL)
602 return strdup (default_libexec_dir);
604 return (
char *)
NULL;
631 if (prefix == (
char *)
NULL) {
633 if (default_etc_dir != (
const char *)
NULL)
634 return strdup (default_etc_dir);
636 return (
char *)
NULL;
665 len1 = strlen (str1);
666 len2 = strlen (str2);
668 result = (
char *) malloc (len1 + len2 + 1);
669 memcpy (result, str1, len1);
670 memcpy (result + len1, str2, len2);
671 result[len1 + len2] =
'\0';
684 if (len > 0 && dir[len - 1] !=
DIRSEP_C) {
701 char *result = (
char *)
NULL;
704 if (str == (
const char *)
NULL)
705 return (
char *)
NULL;
713 result = (
char *) malloc (len + 1);
714 memcpy (result, str, size);
736 if (path == (
const char *)
NULL)
737 return (
char *)
NULL;
740 if (end == (
const char *)
NULL)
743 while (end > path && *end ==
DIRSEP_C)
746 if (result[0] == 0) {
char * br_find_bin_dir(const char *default_bin_dir)
char * br_find_exe_dir(const char *default_dir)
char * br_dirname(const char *path)
char * br_find_exe(const char *default_exe)
char * br_find_locale_dir(const char *default_locale_dir)
char * br_find_libexec_dir(const char *default_libexec_dir)
int br_init_lib(BrInitError *error)
char * br_find_etc_dir(const char *default_etc_dir)
static char * br_strndup(const char *str, size_t size)
static char * _br_find_exe(BrInitError *error)
char * br_find_data_dir(const char *default_data_dir)
char * br_find_lib_dir(const char *default_lib_dir)
char * br_find_prefix(const char *default_prefix)
char * br_build_path(const char *dir, const char *file)
char * br_find_sbin_dir(const char *default_sbin_dir)
static char * _br_find_exe_for_symbol(const void *symbol, BrInitError *error)
int br_init(BrInitError *error)
char * br_strcat(const char *str1, const char *str2)