mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-22 00:38:06 +08:00
Move the core environment parsing of environ_init into a new win32env_to_cygenv function.
win32env_to_cygwenv handles converting wchar to char and some other minor taks. Optionally it handles converting any paths in variables to posix paths. This will be useful for implementing /proc/<pid>/environ
This commit is contained in:
parent
387521976d
commit
7fd70a9706
@ -758,18 +758,12 @@ ucenv (char *p, const char *eq)
|
|||||||
void
|
void
|
||||||
environ_init (char **envp, int envc)
|
environ_init (char **envp, int envc)
|
||||||
{
|
{
|
||||||
PWCHAR rawenv, w;
|
PWCHAR rawenv;
|
||||||
int i;
|
|
||||||
char *p;
|
char *p;
|
||||||
char *newp;
|
|
||||||
int sawTERM = 0;
|
|
||||||
bool envp_passed_in;
|
bool envp_passed_in;
|
||||||
static char NO_COPY cygterm[] = "TERM=cygwin";
|
|
||||||
tmp_pathbuf tp;
|
|
||||||
|
|
||||||
__try
|
__try
|
||||||
{
|
{
|
||||||
char *tmpbuf = tp.t_get ();
|
|
||||||
if (!envp)
|
if (!envp)
|
||||||
envp_passed_in = 0;
|
envp_passed_in = 0;
|
||||||
else
|
else
|
||||||
@ -794,9 +788,6 @@ environ_init (char **envp, int envc)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate space for environment + trailing NULL + CYGWIN env. */
|
|
||||||
lastenviron = envp = (char **) malloc ((4 + (envc = 100)) * sizeof (char *));
|
|
||||||
|
|
||||||
rawenv = GetEnvironmentStringsW ();
|
rawenv = GetEnvironmentStringsW ();
|
||||||
if (!rawenv)
|
if (!rawenv)
|
||||||
{
|
{
|
||||||
@ -805,32 +796,8 @@ environ_init (char **envp, int envc)
|
|||||||
}
|
}
|
||||||
debug_printf ("GetEnvironmentStrings returned %p", rawenv);
|
debug_printf ("GetEnvironmentStrings returned %p", rawenv);
|
||||||
|
|
||||||
/* Current directory information is recorded as variables of the
|
lastenviron = envp = win32env_to_cygenv (rawenv, true);
|
||||||
form "=X:=X:\foo\bar; these must be changed into something legal
|
|
||||||
(we could just ignore them but maybe an application will
|
|
||||||
eventually want to use them). */
|
|
||||||
for (i = 0, w = rawenv; *w != L'\0'; w = wcschr (w, L'\0') + 1, i++)
|
|
||||||
{
|
|
||||||
sys_wcstombs_alloc_no_path (&newp, HEAP_NOTHEAP, w);
|
|
||||||
if (i >= envc)
|
|
||||||
envp = (char **) realloc (envp, (4 + (envc += 100)) * sizeof (char *));
|
|
||||||
envp[i] = newp;
|
|
||||||
if (*newp == '=')
|
|
||||||
*newp = '!';
|
|
||||||
char *eq = strchrnul (newp, '=');
|
|
||||||
ucenv (newp, eq); /* uppercase env vars which need it */
|
|
||||||
if (*newp == 'T' && strncmp (newp, "TERM=", 5) == 0)
|
|
||||||
sawTERM = 1;
|
|
||||||
else if (*newp == 'C' && strncmp (newp, "CYGWIN=", 7) == 0)
|
|
||||||
parse_options (newp + 7);
|
|
||||||
if (*eq)
|
|
||||||
posify_maybe (envp + i, *++eq ? eq : --eq, tmpbuf);
|
|
||||||
debug_printf ("%p: %s", envp[i], envp[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sawTERM)
|
|
||||||
envp[i++] = strdup (cygterm);
|
|
||||||
envp[i] = NULL;
|
|
||||||
FreeEnvironmentStringsW (rawenv);
|
FreeEnvironmentStringsW (rawenv);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
@ -852,6 +819,53 @@ environ_init (char **envp, int envc)
|
|||||||
__endtry
|
__endtry
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char ** __reg2
|
||||||
|
win32env_to_cygenv (PWCHAR rawenv, bool posify)
|
||||||
|
{
|
||||||
|
tmp_pathbuf tp;
|
||||||
|
char **envp;
|
||||||
|
int envc;
|
||||||
|
char *newp;
|
||||||
|
int i;
|
||||||
|
int sawTERM = 0;
|
||||||
|
static char NO_COPY cygterm[] = "TERM=cygwin";
|
||||||
|
char *tmpbuf = tp.t_get ();
|
||||||
|
PWCHAR w;
|
||||||
|
|
||||||
|
/* Allocate space for environment + trailing NULL + CYGWIN env. */
|
||||||
|
envp = (char **) malloc ((4 + (envc = 100)) * sizeof (char *));
|
||||||
|
|
||||||
|
/* Current directory information is recorded as variables of the
|
||||||
|
form "=X:=X:\foo\bar; these must be changed into something legal
|
||||||
|
(we could just ignore them but maybe an application will
|
||||||
|
eventually want to use them). */
|
||||||
|
for (i = 0, w = rawenv; *w != L'\0'; w = wcschr (w, L'\0') + 1, i++)
|
||||||
|
{
|
||||||
|
sys_wcstombs_alloc_no_path (&newp, HEAP_NOTHEAP, w);
|
||||||
|
if (i >= envc)
|
||||||
|
envp = (char **) realloc (envp, (4 + (envc += 100)) * sizeof (char *));
|
||||||
|
envp[i] = newp;
|
||||||
|
if (*newp == '=')
|
||||||
|
*newp = '!';
|
||||||
|
char *eq = strchrnul (newp, '=');
|
||||||
|
ucenv (newp, eq); /* uppercase env vars which need it */
|
||||||
|
if (*newp == 'T' && strncmp (newp, "TERM=", 5) == 0)
|
||||||
|
sawTERM = 1;
|
||||||
|
else if (*newp == 'C' && strncmp (newp, "CYGWIN=", 7) == 0)
|
||||||
|
parse_options (newp + 7);
|
||||||
|
if (*eq && posify)
|
||||||
|
posify_maybe (envp + i, *++eq ? eq : --eq, tmpbuf);
|
||||||
|
debug_printf ("%p: %s", envp[i], envp[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!sawTERM)
|
||||||
|
envp[i++] = strdup (cygterm);
|
||||||
|
|
||||||
|
envp[i] = NULL;
|
||||||
|
return envp;
|
||||||
|
}
|
||||||
|
|
||||||
/* Function called by qsort to sort environment strings. */
|
/* Function called by qsort to sort environment strings. */
|
||||||
static int
|
static int
|
||||||
env_sort (const void *a, const void *b)
|
env_sort (const void *a, const void *b)
|
||||||
|
@ -45,4 +45,6 @@ extern "C" char __stdcall **cur_environ ();
|
|||||||
char ** __reg3 build_env (const char * const *envp, PWCHAR &envblock,
|
char ** __reg3 build_env (const char * const *envp, PWCHAR &envblock,
|
||||||
int &envc, bool need_envblock, HANDLE new_token);
|
int &envc, bool need_envblock, HANDLE new_token);
|
||||||
|
|
||||||
|
char ** __reg2 win32env_to_cygenv (PWCHAR rawenv, bool posify);
|
||||||
|
|
||||||
#define ENV_CVT -1
|
#define ENV_CVT -1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user