aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--auto.def16
-rw-r--r--jim-exec.c14
-rw-r--r--jim-load.c9
-rw-r--r--jim-win32compat.h1
-rw-r--r--jim.c41
-rw-r--r--jim.h4
6 files changed, 61 insertions, 24 deletions
diff --git a/auto.def b/auto.def
index 053a463..ae1ff8d 100644
--- a/auto.def
+++ b/auto.def
@@ -56,7 +56,7 @@ options {
cc-check-types "long long"
-cc-check-includes sys/un.h dlfcn.h unistd.h
+cc-check-includes sys/un.h dlfcn.h unistd.h crt_externs.h
cc-check-functions ualarm sysinfo lstat fork vfork system
cc-check-functions backtrace geteuid mkstemp realpath strptime
@@ -74,12 +74,14 @@ switch -glob -- [get-define host] {
cc-check-tools ar ranlib strip
define tclsh [info nameofexecutable]
-msg-checking "Checking environ declared in unistd.h..."
-if {[cctest -cflags -D_GNU_SOURCE -includes unistd.h -code {char **ep = environ;}]} {
- define NO_ENVIRON_EXTERN
- msg-result "yes"
-} else {
- msg-result "no"
+if {![cc-check-functions _NSGetEnviron]} {
+ msg-checking "Checking environ declared in unistd.h..."
+ if {[cctest -cflags -D_GNU_SOURCE -includes unistd.h -code {char **ep = environ;}]} {
+ define NO_ENVIRON_EXTERN
+ msg-result "yes"
+ } else {
+ msg-result "no"
+ }
}
set extra_objs {}
diff --git a/jim-exec.c b/jim-exec.c
index f792fe0..5c9b49f 100644
--- a/jim-exec.c
+++ b/jim-exec.c
@@ -36,8 +36,6 @@
#include <errno.h>
#include <sys/wait.h>
-extern char **environ;
-
#if defined(__GNUC__) && !defined(__clang__)
#define IGNORE_RC(EXPR) ((EXPR) < 0 ? -1 : 0)
#else
@@ -121,7 +119,7 @@ static char **JimBuildEnv(Jim_Interp *interp)
Jim_Obj *objPtr = Jim_GetGlobalVariableStr(interp, "env", JIM_NONE);
if (!objPtr) {
- return environ;
+ return Jim_GetEnviron();
}
/* Calculate the required size */
@@ -151,7 +149,7 @@ static char **JimBuildEnv(Jim_Interp *interp)
return env;
#else
- return environ;
+ return Jim_GetEnviron();
#endif
}
@@ -631,8 +629,8 @@ badargs:
}
/* Must do this before vfork(), so do it now */
- orig_environ = environ;
- environ = JimBuildEnv(interp);
+ orig_environ = Jim_GetEnviron();
+ Jim_SetEnviron(JimBuildEnv(interp));
/*
* Set up the redirected input source for the pipeline, if
@@ -954,8 +952,8 @@ badargs:
}
Jim_Free(arg_array);
- JimFreeEnv(interp, environ, orig_environ);
- environ = orig_environ;
+ JimFreeEnv(interp, Jim_GetEnviron(), orig_environ);
+ Jim_SetEnviron(orig_environ);
return numPids;
diff --git a/jim-load.c b/jim-load.c
index 6047839..8877260 100644
--- a/jim-load.c
+++ b/jim-load.c
@@ -12,6 +12,13 @@
#include <dlfcn.h>
#endif
+#ifndef RTLD_NOW
+ #define RTLD_NOW 0
+#endif
+#ifndef RTLD_LOCAL
+ #define RTLD_LOCAL 0
+#endif
+
/**
* Note that Jim_LoadLibrary() requires a path to an existing file.
*
@@ -19,7 +26,7 @@
*/
int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName)
{
- void *handle = dlopen(pathName, RTLD_LAZY);
+ void *handle = dlopen(pathName, RTLD_NOW | RTLD_LOCAL);
if (handle == NULL) {
Jim_SetResultFormatted(interp, "error loading extension \"%s\": %s", pathName,
dlerror());
diff --git a/jim-win32compat.h b/jim-win32compat.h
index dab0a01..4976579 100644
--- a/jim-win32compat.h
+++ b/jim-win32compat.h
@@ -15,7 +15,6 @@
#define JIM_ANSIC
#define MKDIR_ONE_ARG
-#define RTLD_LAZY 0
void *dlopen(const char *path, int mode);
int dlclose(void *handle);
void *dlsym(void *handle, const char *symbol);
diff --git a/jim.c b/jim.c
index 483daf1..c415a67 100644
--- a/jim.c
+++ b/jim.c
@@ -65,6 +65,9 @@
#ifdef HAVE_BACKTRACE
#include <execinfo.h>
#endif
+#ifdef HAVE_CRT_EXTERNS_H
+#include <crt_externs.h>
+#endif
/* For INFINITY, even if math functions are not enabled */
#include <math.h>
@@ -13869,6 +13872,32 @@ static int Jim_LrepeatCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *
return JIM_OK;
}
+char **Jim_GetEnviron(void)
+{
+#if defined(HAVE__NSGETENVIRON)
+ return *_NSGetEnviron();
+#else
+ #if !defined(NO_ENVIRON_EXTERN)
+ extern char **environ;
+ #endif
+
+ return environ;
+#endif
+}
+
+void Jim_SetEnviron(char **env)
+{
+#if defined(HAVE__NSGETENVIRON)
+ *_NSGetEnviron() = env;
+#else
+ #if !defined(NO_ENVIRON_EXTERN)
+ extern char **environ;
+ #endif
+
+ environ = env;
+#endif
+}
+
/* [env] */
static int Jim_EnvCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
@@ -13876,19 +13905,17 @@ static int Jim_EnvCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv
const char *val;
if (argc == 1) {
-#ifndef NO_ENVIRON_EXTERN
- extern char **environ;
-#endif
+ char **e = Jim_GetEnviron();
int i;
Jim_Obj *listObjPtr = Jim_NewListObj(interp, NULL, 0);
- for (i = 0; environ[i]; i++) {
- const char *equals = strchr(environ[i], '=');
+ for (i = 0; e[i]; i++) {
+ const char *equals = strchr(e[i], '=');
if (equals) {
- Jim_ListAppendElement(interp, listObjPtr, Jim_NewStringObj(interp, environ[i],
- equals - environ[i]));
+ Jim_ListAppendElement(interp, listObjPtr, Jim_NewStringObj(interp, e[i],
+ equals - e[i]));
Jim_ListAppendElement(interp, listObjPtr, Jim_NewStringObj(interp, equals + 1, -1));
}
}
diff --git a/jim.h b/jim.h
index 6411be0..c055456 100644
--- a/jim.h
+++ b/jim.h
@@ -620,6 +620,10 @@ JIM_EXPORT void Jim_Free (void *ptr);
JIM_EXPORT char * Jim_StrDup (const char *s);
JIM_EXPORT char *Jim_StrDupLen(const char *s, int l);
+/* environment */
+JIM_EXPORT char **Jim_GetEnviron(void);
+JIM_EXPORT void Jim_SetEnviron(char **env);
+
/* evaluation */
JIM_EXPORT int Jim_Eval(Jim_Interp *interp, const char *script);
/* in C code, you can do this and get better error messages */