diff options
-rw-r--r-- | auto.def | 16 | ||||
-rw-r--r-- | jim-exec.c | 14 | ||||
-rw-r--r-- | jim-load.c | 9 | ||||
-rw-r--r-- | jim-win32compat.h | 1 | ||||
-rw-r--r-- | jim.c | 41 | ||||
-rw-r--r-- | jim.h | 4 |
6 files changed, 61 insertions, 24 deletions
@@ -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 {} @@ -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; @@ -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); @@ -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)); } } @@ -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 */ |