1 /*
2  * BinReloc - a library for creating relocatable executables
3  * Written by: Mike Hearn <mike@theoretic.com>
4  *             Hongli Lai <h.lai@chello.nl>
5  * http://autopackage.org/
6  *
7  * This source code is public domain. You can relicense this code
8  * under whatever license you want.
9  *
10  * See http://autopackage.org/docs/binreloc/ for
11  * more information and how to use this.
12  *
13  * NOTE: if you're using C++ and are getting "undefined reference
14  * to br_*", try renaming prefix.c to prefix.cpp
15  */
16 
17 #ifndef _PREFIX_H_
18 #define _PREFIX_H_
19 
20 #ifdef __cplusplus
21 extern "C" {
22 #endif /* __cplusplus */
23 
24 /* WARNING, BEFORE YOU MODIFY PREFIX.C:
25  *
26  * If you make changes to any of the functions in prefix.c, you MUST
27  * change the BR_NAMESPACE macro.
28  * This way you can avoid symbol table conflicts with other libraries
29  * that also happen to use BinReloc.
30  *
31  * Example:
32  * #define BR_NAMESPACE(funcName) foobar_ ## funcName
33  * --> expands br_locate to foobar_br_locate
34  */
35 #undef BR_NAMESPACE
36 #define BR_NAMESPACE(funcName) funcName
37 
38 
39 #ifdef ENABLE_BINRELOC
40 
41 #define br_thread_local_store BR_NAMESPACE(br_thread_local_store)
42 #define br_locate BR_NAMESPACE(br_locate)
43 #define br_locate_prefix BR_NAMESPACE(br_locate_prefix)
44 #define br_prepend_prefix BR_NAMESPACE(br_prepend_prefix)
45 
46 #ifndef BR_NO_MACROS
47 	/* These are convience macros that replace the ones usually used
48 	   in Autoconf/Automake projects */
49 	#undef SELFPATH
50 	#undef PREFIX
51 	#undef PREFIXDIR
52 	#undef BINDIR
53 	#undef SBINDIR
54 	#undef DATADIR
55 	#undef LIBDIR
56 	#undef LIBEXECDIR
57 	#undef ETCDIR
58 	#undef SYSCONFDIR
59 	#undef CONFDIR
60 	#undef LOCALEDIR
61 
62 	#define SELFPATH	(br_thread_local_store (br_locate ((void *) "")))
63 	#define PREFIX		(br_thread_local_store (br_locate_prefix ((void *) "")))
64 	#define PREFIXDIR	(br_thread_local_store (br_locate_prefix ((void *) "")))
65 	#define BINDIR		(br_thread_local_store (br_prepend_prefix ((void *) "", "/bin")))
66 	#define SBINDIR		(br_thread_local_store (br_prepend_prefix ((void *) "", "/sbin")))
67 	#define DATADIR		(br_thread_local_store (br_prepend_prefix ((void *) "", "/share")))
68 	#define LIBDIR		(br_thread_local_store (br_prepend_prefix ((void *) "", "/lib")))
69 	#define LIBEXECDIR	(br_thread_local_store (br_prepend_prefix ((void *) "", "/libexec")))
70 	#define ETCDIR		(br_thread_local_store (br_prepend_prefix ((void *) "", "/etc")))
71 	#define SYSCONFDIR	(br_thread_local_store (br_prepend_prefix ((void *) "", "/etc")))
72 	#define CONFDIR		(br_thread_local_store (br_prepend_prefix ((void *) "", "/etc")))
73 	#define LOCALEDIR	(br_thread_local_store (br_prepend_prefix ((void *) "", "/share/locale")))
74 #endif /* BR_NO_MACROS */
75 
76 
77 /* The following functions are used internally by BinReloc
78    and shouldn't be used directly in applications. */
79 
80 char *br_locate		(void *symbol);
81 char *br_locate_prefix	(void *symbol);
82 char *br_prepend_prefix	(void *symbol, char *path);
83 
84 #endif /* ENABLE_BINRELOC */
85 
86 const char *br_thread_local_store (char *str);
87 
88 
89 /* These macros and functions are not guarded by the ENABLE_BINRELOC
90  * macro because they are portable. You can use these functions.
91  */
92 
93 #define br_strcat BR_NAMESPACE(br_strcat)
94 #define br_extract_dir BR_NAMESPACE(br_extract_dir)
95 #define br_extract_prefix BR_NAMESPACE(br_extract_prefix)
96 #define br_set_locate_fallback_func BR_NAMESPACE(br_set_locate_fallback_func)
97 
98 #ifndef BR_NO_MACROS
99   #ifndef ENABLE_BINRELOC
100 	#define BR_SELFPATH(suffix)	SELFPATH suffix
101 	#define BR_PREFIX(suffix)	PREFIX suffix
102 	#define BR_PREFIXDIR(suffix)	BR_PREFIX suffix
103 	#define BR_BINDIR(suffix)	BINDIR suffix
104 	#define BR_SBINDIR(suffix)	SBINDIR suffix
105 	#define BR_DATADIR(suffix)	DATADIR suffix
106 	#define BR_LIBDIR(suffix)	LIBDIR suffix
107 	#define BR_LIBEXECDIR(suffix)	LIBEXECDIR suffix
108 	#define BR_ETCDIR(suffix)	ETCDIR suffix
109 	#define BR_SYSCONFDIR(suffix)	SYSCONFDIR suffix
110 	#define BR_CONFDIR(suffix)	CONFDIR suffix
111 	#define BR_LOCALEDIR(suffix)	LOCALEDIR suffix
112   #else
113 	#define BR_SELFPATH(suffix)	(br_thread_local_store (br_strcat (SELFPATH, suffix)))
114 	#define BR_PREFIX(suffix)	(br_thread_local_store (br_strcat (PREFIX, suffix)))
115 	#define BR_PREFIXDIR(suffix)	(br_thread_local_store (br_strcat (BR_PREFIX, suffix)))
116 	#define BR_BINDIR(suffix)	(br_thread_local_store (br_strcat (BINDIR, suffix)))
117 	#define BR_SBINDIR(suffix)	(br_thread_local_store (br_strcat (SBINDIR, suffix)))
118 	#define BR_DATADIR(suffix)	(br_thread_local_store (br_strcat (DATADIR, suffix)))
119 	#define BR_LIBDIR(suffix)	(br_thread_local_store (br_strcat (LIBDIR, suffix)))
120 	#define BR_LIBEXECDIR(suffix)	(br_thread_local_store (br_strcat (LIBEXECDIR, suffix)))
121 	#define BR_ETCDIR(suffix)	(br_thread_local_store (br_strcat (ETCDIR, suffix)))
122 	#define BR_SYSCONFDIR(suffix)	(br_thread_local_store (br_strcat (SYSCONFDIR, suffix)))
123 	#define BR_CONFDIR(suffix)	(br_thread_local_store (br_strcat (CONFDIR, suffix)))
124 	#define BR_LOCALEDIR(suffix)	(br_thread_local_store (br_strcat (LOCALEDIR, suffix)))
125   #endif
126 #endif
127 
128 char *br_strcat	(const char *str1, const char *str2);
129 char *br_extract_dir	(const char *path);
130 char *br_extract_prefix(const char *path);
131 typedef char *(*br_locate_fallback_func) (void *symbol, void *data);
132 void br_set_locate_fallback_func (br_locate_fallback_func func, void *data);
133 
134 
135 #ifdef __cplusplus
136 }
137 #endif /* __cplusplus */
138 
139 #endif /* _PREFIX_H_ */
140