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