13 #ifndef __BINRELOC_C__ 14 #define __BINRELOC_C__ 18 #include <gwenhywfar/gwenhywfarapi.h> 21 #ifdef ENABLE_BINRELOC 22 #include <sys/types.h> 39 # define DIRSEP_C '\\' 53 #ifndef ENABLE_BINRELOC 58 char *path, *path2, *line, *result;
65 if (
sizeof(path) > SSIZE_MAX)
66 buf_size = SSIZE_MAX - 1;
68 buf_size = PATH_MAX - 1;
69 path = (
char *) malloc(buf_size);
76 path2 = (
char *) malloc(buf_size);
85 strncpy(path2,
"/proc/self/exe", buf_size - 1);
90 size = readlink(path2, path, buf_size - 1);
102 i = stat(path, &stat_buf);
110 if (!S_ISLNK(stat_buf.st_mode)) {
117 strncpy(path, path2, buf_size - 1);
124 buf_size = PATH_MAX + 128;
125 line = (
char *) realloc(path, buf_size);
134 f = fopen(
"/proc/self/maps",
"r");
143 result = fgets(line, (
int) buf_size, f);
144 if (result ==
NULL) {
153 buf_size = strlen(line);
162 if (line[buf_size - 1] == 10)
163 line[buf_size - 1] = 0;
169 if (strstr(line,
" r-xp ") ==
NULL || path ==
NULL) {
192 #ifndef ENABLE_BINRELOC 195 return (
char *)
NULL;
197 #define SIZE PATH_MAX + 100 199 size_t address_string_len;
200 char *address_string, line[SIZE], *found;
203 return (
char *)
NULL;
205 f = fopen(
"/proc/self/maps",
"r");
207 return (
char *)
NULL;
209 address_string_len = 4;
210 address_string = (
char *) malloc(address_string_len);
211 found = (
char *)
NULL;
214 char *start_addr, *end_addr, *end_addr_end, *file;
215 void *start_addr_p, *end_addr_p;
218 if (fgets(line, SIZE, f) ==
NULL)
222 if (strstr(line,
" r-xp ") ==
NULL || strchr(line,
'/') ==
NULL)
227 end_addr = strchr(line,
'-');
228 file = strchr(line,
'/');
231 if (!(file > end_addr && end_addr !=
NULL && end_addr[0] ==
'-'))
236 end_addr_end = strchr(end_addr,
' ');
237 if (end_addr_end ==
NULL)
240 end_addr_end[0] =
'\0';
244 if (file[len - 1] ==
'\n')
245 file[len - 1] =
'\0';
249 if (len > 10 && strcmp(file + len - 10,
" (deleted)") == 0)
250 file[len - 10] =
'\0';
253 len = strlen(start_addr);
254 if (len != strlen(end_addr))
260 if (address_string_len < len + 3) {
261 char *tmp_address_string;
263 address_string_len = len + 3;
264 tmp_address_string = (
char *) realloc(address_string, address_string_len);
265 if (tmp_address_string==
NULL)
266 free(address_string);
267 address_string = tmp_address_string;
270 memcpy(address_string,
"0x", 2);
271 memcpy(address_string + 2, start_addr, len);
272 address_string[2 + len] =
'\0';
273 sscanf(address_string,
"%p", &start_addr_p);
275 memcpy(address_string,
"0x", 2);
276 memcpy(address_string + 2, end_addr, len);
277 address_string[2 + len] =
'\0';
278 sscanf(address_string,
"%p", &end_addr_p);
281 if (symbol >= start_addr_p && symbol < end_addr_p) {
287 free(address_string);
291 return (
char *)
NULL;
293 return strdup(found);
298 #ifndef BINRELOC_RUNNING_DOXYGEN 300 #define NULL ((void *) 0) 364 if (default_exe != (
const char *)
NULL)
365 return strdup(default_exe);
367 return (
char *)
NULL;
392 if (default_dir !=
NULL)
393 return strdup(default_dir);
422 if (default_prefix != (
const char *)
NULL)
423 return strdup(default_prefix);
425 return (
char *)
NULL;
454 if (prefix == (
char *)
NULL) {
456 if (default_bin_dir != (
const char *)
NULL)
457 return strdup(default_bin_dir);
459 return (
char *)
NULL;
487 if (prefix == (
char *)
NULL) {
489 if (default_sbin_dir != (
const char *)
NULL)
490 return strdup(default_sbin_dir);
492 return (
char *)
NULL;
521 if (prefix == (
char *)
NULL) {
523 if (default_data_dir != (
const char *)
NULL)
524 return strdup(default_data_dir);
526 return (
char *)
NULL;
551 char *data_dir, *dir;
554 if (data_dir == (
char *)
NULL) {
556 if (default_locale_dir != (
const char *)
NULL)
557 return strdup(default_locale_dir);
559 return (
char *)
NULL;
587 if (prefix == (
char *)
NULL) {
589 if (default_lib_dir != (
const char *)
NULL)
590 return strdup(default_lib_dir);
592 return (
char *)
NULL;
620 if (prefix == (
char *)
NULL) {
622 if (default_libexec_dir != (
const char *)
NULL)
623 return strdup(default_libexec_dir);
625 return (
char *)
NULL;
653 if (prefix == (
char *)
NULL) {
655 if (default_etc_dir != (
const char *)
NULL)
656 return strdup(default_etc_dir);
658 return (
char *)
NULL;
691 result = (
char *) malloc(len1 + len2 + 1);
692 memcpy(result, str1, len1);
693 memcpy(result + len1, str2, len2);
694 result[len1 + len2] =
'\0';
708 if (len > 0 && dir[len - 1] !=
DIRSEP_C) {
726 char *result = (
char *)
NULL;
729 if (str == (
const char *)
NULL)
730 return (
char *)
NULL;
738 result = (
char *) malloc(len + 1);
739 memcpy(result, str, size);
762 if (path == (
const char *)
NULL)
763 return (
char *)
NULL;
766 if (end == (
const char *)
NULL)
769 while (end > path && *end ==
DIRSEP_C)
772 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)
int br_init(BrInitError *error)
static char * _br_find_exe_for_symbol(const void *symbol, GWEN_UNUSED BrInitError *error)
char * br_strcat(const char *str1, const char *str2)