13 #ifndef __BINRELOC_C__ 14 #define __BINRELOC_C__ 18 #ifdef ENABLE_BINRELOC 19 #include <sys/types.h> 36 # define DIRSEP_C '\\' 50 #ifndef ENABLE_BINRELOC 55 char *path, *path2, *line, *result;
62 if (
sizeof(path) > SSIZE_MAX)
63 buf_size = SSIZE_MAX - 1;
65 buf_size = PATH_MAX - 1;
66 path = (
char *) malloc(buf_size);
73 path2 = (
char *) malloc(buf_size);
82 strncpy(path2,
"/proc/self/exe", buf_size - 1);
87 size = readlink(path2, path, buf_size - 1);
99 i = stat(path, &stat_buf);
107 if (!S_ISLNK(stat_buf.st_mode)) {
114 strncpy(path, path2, buf_size - 1);
121 buf_size = PATH_MAX + 128;
122 line = (
char *) realloc(path, buf_size);
131 f = fopen(
"/proc/self/maps",
"r");
140 result = fgets(line, (
int) buf_size, f);
141 if (result ==
NULL) {
150 buf_size = strlen(line);
159 if (line[buf_size - 1] == 10)
160 line[buf_size - 1] = 0;
166 if (strstr(line,
" r-xp ") ==
NULL || path ==
NULL) {
189 #ifndef ENABLE_BINRELOC 192 return (
char *)
NULL;
194 #define SIZE PATH_MAX + 100 196 size_t address_string_len;
197 char *address_string, line[SIZE], *found;
200 return (
char *)
NULL;
202 f = fopen(
"/proc/self/maps",
"r");
204 return (
char *)
NULL;
206 address_string_len = 4;
207 address_string = (
char *) malloc(address_string_len);
208 found = (
char *)
NULL;
211 char *start_addr, *end_addr, *end_addr_end, *file;
212 void *start_addr_p, *end_addr_p;
215 if (fgets(line, SIZE, f) ==
NULL)
219 if (strstr(line,
" r-xp ") ==
NULL || strchr(line,
'/') ==
NULL)
224 end_addr = strchr(line,
'-');
225 file = strchr(line,
'/');
228 if (!(file > end_addr && end_addr !=
NULL && end_addr[0] ==
'-'))
233 end_addr_end = strchr(end_addr,
' ');
234 if (end_addr_end ==
NULL)
237 end_addr_end[0] =
'\0';
241 if (file[len - 1] ==
'\n')
242 file[len - 1] =
'\0';
246 if (len > 10 && strcmp(file + len - 10,
" (deleted)") == 0)
247 file[len - 10] =
'\0';
250 len = strlen(start_addr);
251 if (len != strlen(end_addr))
257 if (address_string_len < len + 3) {
258 char *tmp_address_string;
260 address_string_len = len + 3;
261 tmp_address_string = (
char *) realloc(address_string, address_string_len);
262 if (tmp_address_string==
NULL)
263 free(address_string);
264 address_string = tmp_address_string;
267 memcpy(address_string,
"0x", 2);
268 memcpy(address_string + 2, start_addr, len);
269 address_string[2 + len] =
'\0';
270 sscanf(address_string,
"%p", &start_addr_p);
272 memcpy(address_string,
"0x", 2);
273 memcpy(address_string + 2, end_addr, len);
274 address_string[2 + len] =
'\0';
275 sscanf(address_string,
"%p", &end_addr_p);
278 if (symbol >= start_addr_p && symbol < end_addr_p) {
284 free(address_string);
288 return (
char *)
NULL;
290 return strdup(found);
295 #ifndef BINRELOC_RUNNING_DOXYGEN 297 #define NULL ((void *) 0) 361 if (default_exe != (
const char *)
NULL)
362 return strdup(default_exe);
364 return (
char *)
NULL;
389 if (default_dir !=
NULL)
390 return strdup(default_dir);
419 if (default_prefix != (
const char *)
NULL)
420 return strdup(default_prefix);
422 return (
char *)
NULL;
451 if (prefix == (
char *)
NULL) {
453 if (default_bin_dir != (
const char *)
NULL)
454 return strdup(default_bin_dir);
456 return (
char *)
NULL;
484 if (prefix == (
char *)
NULL) {
486 if (default_sbin_dir != (
const char *)
NULL)
487 return strdup(default_sbin_dir);
489 return (
char *)
NULL;
518 if (prefix == (
char *)
NULL) {
520 if (default_data_dir != (
const char *)
NULL)
521 return strdup(default_data_dir);
523 return (
char *)
NULL;
548 char *data_dir, *dir;
551 if (data_dir == (
char *)
NULL) {
553 if (default_locale_dir != (
const char *)
NULL)
554 return strdup(default_locale_dir);
556 return (
char *)
NULL;
584 if (prefix == (
char *)
NULL) {
586 if (default_lib_dir != (
const char *)
NULL)
587 return strdup(default_lib_dir);
589 return (
char *)
NULL;
617 if (prefix == (
char *)
NULL) {
619 if (default_libexec_dir != (
const char *)
NULL)
620 return strdup(default_libexec_dir);
622 return (
char *)
NULL;
650 if (prefix == (
char *)
NULL) {
652 if (default_etc_dir != (
const char *)
NULL)
653 return strdup(default_etc_dir);
655 return (
char *)
NULL;
688 result = (
char *) malloc(len1 + len2 + 1);
689 memcpy(result, str1, len1);
690 memcpy(result + len1, str2, len2);
691 result[len1 + len2] =
'\0';
705 if (len > 0 && dir[len - 1] !=
DIRSEP_C) {
723 char *result = (
char *)
NULL;
726 if (str == (
const char *)
NULL)
727 return (
char *)
NULL;
735 result = (
char *) malloc(len + 1);
736 memcpy(result, str, size);
759 if (path == (
const char *)
NULL)
760 return (
char *)
NULL;
763 if (end == (
const char *)
NULL)
766 while (end > path && *end ==
DIRSEP_C)
769 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)