(environ_init): Explicitly initialize __cygwin_environ.
(cur_environ): New function. Detects when user has updated their environment.
* exec.cc: Use 'environ' define throughout rather than __cygwin_environ.
* spawn.cc: Ditto.
* winsup.h: Declare cur_environ, main_environ, environ.
+Sun Jul 16 16:03:00 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * environ.cc: Use new definition of "environ" throughout.
+ (environ_init): Explicitly initialize __cygwin_environ.
+ (cur_environ): New function. Detects when user has updated
+ their environment.
+ * exec.cc: Use 'environ' define throughout rather than __cygwin_environ.
+ * spawn.cc: Ditto.
+ * winsup.h: Declare cur_environ, main_environ, environ.
+
Sun Jul 16 13:23:04 2000 Christopher Faylor <cgf@cygnus.com>
* acconfig.h: Add support for NEWVFORK.
#include <ctype.h>
#include <fcntl.h>
-#define environ __cygwin_environ
-
extern BOOL allow_glob;
extern BOOL allow_ntea;
extern BOOL strip_title_path;
for (P = environ, cnt = 0; *P; ++P, ++cnt)
;
- environ = (char **) realloc ((char *) environ,
+ __cygwin_environ = (char **) realloc ((char *) environ,
(size_t) (sizeof (char *) * (cnt + 2)));
if (!environ)
return -1;
if (!sawTERM)
envp[i++] = strdup ("TERM=cygwin");
envp[i] = NULL;
- environ = envp;
+ __cygwin_environ = envp;
update_envptrs ();
FreeEnvironmentStringsA ((char *) rawenv);
parse_options (NULL);
return envblock;
}
+
+/* This idiocy is necessary because the early implementers of cygwin
+ did not seem to know about importing data variables from the DLL.
+ So, we have to synchronize cygwin's idea of the environment with the
+ main program's with each reference to the environment. */
+char ** __stdcall
+cur_environ ()
+{
+ if (*main_environ != __cygwin_environ)
+ {
+ __cygwin_environ = *main_environ;
+ update_envptrs ();
+ }
+
+ return __cygwin_environ;
+}
while (argv[i++] != NULL);
va_end (args);
MALLOC_CHECK;
- return _execve (path, (char * const *) argv, __cygwin_environ);
+ return _execve (path, (char * const *) argv, environ);
}
extern "C"
execv (const char *path, char * const *argv)
{
MALLOC_CHECK;
- return _execve (path, (char * const *) argv, __cygwin_environ);
+ return _execve (path, (char * const *) argv, environ);
}
/* the same as a standard exec() calls family, but with NT security support */
va_end (args);
MALLOC_CHECK;
- return sexecve (hToken, path, (char * const *) argv, __cygwin_environ);
+ return sexecve (hToken, path, (char * const *) argv, environ);
}
extern "C"
va_end (args);
MALLOC_CHECK;
- return sexecvpe (hToken, path, (const char * const *) argv, __cygwin_environ);
+ return sexecvpe (hToken, path, (const char * const *) argv, environ);
}
extern "C"
sexecv (HANDLE hToken, const char *path, const char * const *argv)
{
MALLOC_CHECK;
- return sexecve (hToken, path, argv, __cygwin_environ);
+ return sexecve (hToken, path, argv, environ);
}
extern "C"
sexecp (HANDLE hToken, const char *path, const char * const *argv)
{
MALLOC_CHECK;
- return sexecvpe (hToken, path, argv, __cygwin_environ);
+ return sexecvpe (hToken, path, argv, environ);
}
/*
else
{
one_line.add ("\"", 1);
- for (0; p = strpbrk (a, "\"\\"); a = ++p)
+ for (; (p = strpbrk (a, "\"\\")); a = ++p)
{
one_line.add (a, p - a);
if (*p == '\\' || *p == '"')
va_end (args);
- return _spawnve (NULL, mode, path, (char * const *) argv,
- __cygwin_environ);
+ return _spawnve (NULL, mode, path, (char * const *) argv, environ);
}
extern "C"
va_end (args);
- return spawnvpe (mode, path, (char * const *) argv, __cygwin_environ);
+ return spawnvpe (mode, path, (char * const *) argv, environ);
}
extern "C"
int
spawnv (int mode, const char *path, const char * const *argv)
{
- return _spawnve (NULL, mode, path, argv, __cygwin_environ);
+ return _spawnve (NULL, mode, path, argv, environ);
}
extern "C"
int
spawnvp (int mode, const char *path, const char * const *argv)
{
- return spawnvpe (mode, path, argv, __cygwin_environ);
+ return spawnvpe (mode, path, argv, environ);
}
extern "C"
void __stdcall update_envptrs ();
char * __stdcall winenv (const char * const *, int);
-extern char **__cygwin_environ;
+extern char **__cygwin_environ, ***main_environ;
+extern char __stdcall **cur_environ ();
+#define environ (cur_environ ())
/* The title on program start. */
extern char *old_title;