aboutsummaryrefslogtreecommitdiffstats
path: root/pseudo_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'pseudo_util.c')
-rw-r--r--pseudo_util.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/pseudo_util.c b/pseudo_util.c
index be07951..0c156cf 100644
--- a/pseudo_util.c
+++ b/pseudo_util.c
@@ -81,6 +81,16 @@ typedef struct {
char *data;
} pseudo_evlog_entry;
+/* so bash overrides getenv/unsetenv/etcetera, preventing them from
+ * actually modifying environ, so we have pseudo_wrappers try to dlsym
+ * the right values. This could fail, in which case we'd get null
+ * pointers, and we'll just call whatever the linker gives us and
+ * hope for the best.
+ */
+#define SETENV(x, y, z) (pseudo_real_setenv ? pseudo_real_setenv : setenv)(x, y, z)
+#define GETENV(x) (pseudo_real_getenv ? pseudo_real_getenv : getenv)(x)
+#define UNSETENV(x) (pseudo_real_unsetenv ? pseudo_real_unsetenv : unsetenv)(x)
+
#define PSEUDO_EVLOG_ENTRIES 250
#define PSEUDO_EVLOG_LENGTH 256
static pseudo_evlog_entry event_log[PSEUDO_EVLOG_ENTRIES];
@@ -102,6 +112,10 @@ static int pseudo_util_initted = -1; /* Not yet run */
/* bypass wrapper logic on path computations */
int (*pseudo_real_lstat)(const char *path, PSEUDO_STATBUF *buf) = NULL;
+/* bash workaround */
+int (*pseudo_real_unsetenv)(const char *) = unsetenv;
+char * (*pseudo_real_getenv)(const char *) = getenv;
+int (*pseudo_real_setenv)(const char *, const char *, int) = setenv;
#if 0
static void
@@ -126,7 +140,7 @@ pseudo_has_unload(char * const *envp) {
size_t i = 0;
/* Is it in the caller environment? */
- if (NULL != getenv(unload))
+ if (NULL != GETENV(unload))
return 1;
/* Is it in the environment cache? */
@@ -161,7 +175,7 @@ pseudo_get_value(const char *key) {
/* Check if the environment has it and we don't ...
* if so, something went wrong... so we'll attempt to recover
*/
- if (pseudo_env[i].key && !pseudo_env[i].value && getenv(pseudo_env[i].key))
+ if (pseudo_env[i].key && !pseudo_env[i].value && GETENV(pseudo_env[i].key))
pseudo_init_util();
if (pseudo_env[i].value)
@@ -215,8 +229,8 @@ pseudo_init_util(void) {
pseudo_util_initted = 1;
for (i = 0; pseudo_env[i].key; i++) {
- if (getenv(pseudo_env[i].key))
- pseudo_set_value(pseudo_env[i].key, getenv(pseudo_env[i].key));
+ if (GETENV(pseudo_env[i].key))
+ pseudo_set_value(pseudo_env[i].key, GETENV(pseudo_env[i].key));
}
pseudo_util_initted = 0;
@@ -820,7 +834,7 @@ pseudo_fix_path(const char *base, const char *path, size_t rootlen, size_t basel
* we don't try to fix the library path.
*/
void pseudo_dropenv() {
- char *ld_preload = getenv(PRELINK_LIBRARIES);
+ char *ld_preload = GETENV(PRELINK_LIBRARIES);
if (ld_preload) {
ld_preload = without_libpseudo(ld_preload);
@@ -828,9 +842,9 @@ void pseudo_dropenv() {
pseudo_diag("fatal: can't allocate new %s variable.\n", PRELINK_LIBRARIES);
}
if (ld_preload && strlen(ld_preload)) {
- setenv(PRELINK_LIBRARIES, ld_preload, 1);
+ SETENV(PRELINK_LIBRARIES, ld_preload, 1);
} else {
- unsetenv(PRELINK_LIBRARIES);
+ UNSETENV(PRELINK_LIBRARIES);
}
}
}
@@ -886,14 +900,14 @@ pseudo_setupenv() {
while (pseudo_env[i].key) {
if (pseudo_env[i].value) {
- setenv(pseudo_env[i].key, pseudo_env[i].value, 0);
+ SETENV(pseudo_env[i].key, pseudo_env[i].value, 0);
pseudo_debug(PDBGF_ENV | PDBGF_VERBOSE, "pseudo_env: %s => %s\n",
pseudo_env[i].key, pseudo_env[i].value);
}
i++;
}
- const char *ld_library_path = getenv(PRELINK_PATH);
+ const char *ld_library_path = GETENV(PRELINK_PATH);
char *libdir_path = pseudo_libdir_path(NULL);
if (!ld_library_path) {
size_t len = strlen(libdir_path) + 1 + (strlen(libdir_path) + 2) + 1;
@@ -902,7 +916,7 @@ pseudo_setupenv() {
pseudo_diag("fatal: can't allocate new %s variable.\n", PRELINK_PATH);
}
snprintf(newenv, len, "%s:%s64", libdir_path, libdir_path);
- setenv(PRELINK_PATH, newenv, 1);
+ SETENV(PRELINK_PATH, newenv, 1);
} else if (!strstr(ld_library_path, libdir_path)) {
size_t len = strlen(ld_library_path) + 1 + strlen(libdir_path) + 1 + (strlen(libdir_path) + 2) + 1;
char *newenv = malloc(len);
@@ -910,26 +924,26 @@ pseudo_setupenv() {
pseudo_diag("fatal: can't allocate new %s variable.\n", PRELINK_PATH);
}
snprintf(newenv, len, "%s:%s:%s64", ld_library_path, libdir_path, libdir_path);
- setenv(PRELINK_PATH, newenv, 1);
+ SETENV(PRELINK_PATH, newenv, 1);
} else {
/* nothing to do, ld_library_path exists and contains
* our preferred path */
}
- char *ld_preload = getenv(PRELINK_LIBRARIES);
+ char *ld_preload = GETENV(PRELINK_LIBRARIES);
if (ld_preload) {
ld_preload = with_libpseudo(ld_preload, libdir_path);
if (!ld_preload) {
pseudo_diag("fatal: can't allocate new %s variable.\n", PRELINK_LIBRARIES);
}
- setenv(PRELINK_LIBRARIES, ld_preload, 1);
+ SETENV(PRELINK_LIBRARIES, ld_preload, 1);
free(ld_preload);
} else {
ld_preload = with_libpseudo("", libdir_path);
if (!ld_preload) {
pseudo_diag("fatal: can't allocate new %s variable.\n", PRELINK_LIBRARIES);
}
- setenv(PRELINK_LIBRARIES, ld_preload, 1);
+ SETENV(PRELINK_LIBRARIES, ld_preload, 1);
free(ld_preload);
}
@@ -940,9 +954,9 @@ pseudo_setupenv() {
#if PSEUDO_PORT_DARWIN
- char *force_flat = getenv("DYLD_FORCE_FLAT_NAMESPACE");
+ char *force_flat = GETENV("DYLD_FORCE_FLAT_NAMESPACE");
if (!force_flat) {
- setenv("DYLD_FORCE_FLAT_NAMESPACE", "1", 1);
+ SETENV("DYLD_FORCE_FLAT_NAMESPACE", "1", 1);
}
#endif
}