* environ.cc (env_win32_to_posix_path_list): Declare.

(conv_envvars): Use env_win32_to_posix_path_list rather than
cygwin_win32_to_posix_path_list.
(posify): Translate back to win32 path if errno is EIDRM.
* environ.h: Update copyright.  Define ENV_CVT.
* path.cc (conv_path_list): If converting for the environment and removed an
element set errno to ENV_CVT.
(env_win32_to_posix_path_list): New function.
This commit is contained in:
Christopher Faylor 2006-08-02 15:11:48 +00:00
parent 2dba45f4aa
commit 6f1d48621e
4 changed files with 44 additions and 5 deletions

View File

@ -1,3 +1,14 @@
2006-08-02 Christopher Faylor <cgf@timesys.com>
* environ.cc (env_win32_to_posix_path_list): Declare.
(conv_envvars): Use env_win32_to_posix_path_list rather than
cygwin_win32_to_posix_path_list.
(posify): Translate back to win32 path if errno is EIDRM.
* environ.h: Update copyright. Define ENV_CVT.
* path.cc (conv_path_list): If converting for the environment and
removed an element set errno to ENV_CVT.
(env_win32_to_posix_path_list): New function.
2006-08-01 Christopher Faylor <cgf@timesys.com> 2006-08-01 Christopher Faylor <cgf@timesys.com>
* environ.cc (dos_file_warning): Declare. * environ.cc (dos_file_warning): Declare.

View File

@ -43,6 +43,8 @@ extern bool allow_server;
static char **lastenviron; static char **lastenviron;
extern "C" int env_win32_to_posix_path_list (const char *, char *posix);
#define ENVMALLOC \ #define ENVMALLOC \
(CYGWIN_VERSION_DLL_MAKE_COMBINED (user_data->api_major, user_data->api_minor) \ (CYGWIN_VERSION_DLL_MAKE_COMBINED (user_data->api_major, user_data->api_minor) \
<= CYGWIN_VERSION_DLL_MALLOC_ENV) <= CYGWIN_VERSION_DLL_MALLOC_ENV)
@ -57,7 +59,7 @@ static char **lastenviron;
static int return_MAX_PATH (const char *) {return CYG_MAX_PATH;} static int return_MAX_PATH (const char *) {return CYG_MAX_PATH;}
static win_env conv_envvars[] = static win_env conv_envvars[] =
{ {
{NL ("PATH="), NULL, NULL, cygwin_win32_to_posix_path_list, {NL ("PATH="), NULL, NULL, env_win32_to_posix_path_list,
cygwin_posix_to_win32_path_list, cygwin_posix_to_win32_path_list,
cygwin_win32_to_posix_path_list_buf_size, cygwin_win32_to_posix_path_list_buf_size,
cygwin_posix_to_win32_path_list_buf_size, true}, cygwin_posix_to_win32_path_list_buf_size, true},
@ -181,8 +183,17 @@ posify (char **here, const char *value)
char *outenv = (char *) malloc (1 + len + conv->posix_len (value)); char *outenv = (char *) malloc (1 + len + conv->posix_len (value));
memcpy (outenv, src, len); memcpy (outenv, src, len);
conv->toposix (value, outenv + len); char *newvalue = outenv + len;
conv->add_cache (outenv + len, *value != '/' ? value : NULL); if (!conv->toposix (value, newvalue) || _impure_ptr->_errno != EIDRM)
conv->add_cache (newvalue, *value != '/' ? value : NULL);
else
{
/* The conversion routine removed elements from a path list so we have
to recalculate the windows path to remove elements there, too. */
char cleanvalue[strlen (value) + 1];
conv->towin32 (newvalue, cleanvalue);
conv->add_cache (newvalue, cleanvalue);
}
debug_printf ("env var converted to %s", outenv); debug_printf ("env var converted to %s", outenv);
*here = outenv; *here = outenv;

View File

@ -1,6 +1,6 @@
/* environ.h: Declarations for environ manipulation /* environ.h: Declarations for environ manipulation
Copyright 2000, 2001, 2002 Red Hat, Inc. Copyright 2000, 2001, 2002, 2003, 2005, 2006 Red Hat, Inc.
This file is part of Cygwin. This file is part of Cygwin.
@ -48,3 +48,5 @@ extern "C" char __stdcall **cur_environ ();
char ** __stdcall build_env (const char * const *envp, char *&envblock, char ** __stdcall build_env (const char * const *envp, char *&envblock,
int &envc, bool need_envblock) int &envc, bool need_envblock)
__attribute__ ((regparm (3))); __attribute__ ((regparm (3)));
#define ENV_CVT -1

View File

@ -75,6 +75,7 @@ details. */
#include "shared_info.h" #include "shared_info.h"
#include "registry.h" #include "registry.h"
#include "cygtls.h" #include "cygtls.h"
#include "environ.h"
#include <assert.h> #include <assert.h>
bool dos_file_warning = true; bool dos_file_warning = true;
@ -1329,6 +1330,7 @@ conv_path_list (const char *src, char *dst, int to_posix)
int err = 0; int err = 0;
char *d = dst - 1; char *d = dst - 1;
bool saw_empty = false;
do do
{ {
char *s = strccpy (srcbuf, &src, src_delim); char *s = strccpy (srcbuf, &src, src_delim);
@ -1343,7 +1345,11 @@ conv_path_list (const char *src, char *dst, int to_posix)
else if (!to_posix) else if (!to_posix)
err = conv_fn (".", ++d); err = conv_fn (".", ++d);
else else
continue; {
if (to_posix == ENV_CVT)
saw_empty = true;
continue;
}
if (err) if (err)
break; break;
d = strchr (d, '\0'); d = strchr (d, '\0');
@ -1351,6 +1357,9 @@ conv_path_list (const char *src, char *dst, int to_posix)
} }
while (*src++); while (*src++);
if (saw_empty)
err = EIDRM;
if (d < dst) if (d < dst)
d++; d++;
*d = '\0'; *d = '\0';
@ -3885,6 +3894,12 @@ cygwin_posix_to_win32_path_list_buf_size (const char *path_list)
return conv_path_list_buf_size (path_list, false); return conv_path_list_buf_size (path_list, false);
} }
extern "C" int
env_win32_to_posix_path_list (const char *win32, char *posix)
{
return_with_errno (conv_path_list (win32, posix, ENV_CVT));
}
extern "C" int extern "C" int
cygwin_win32_to_posix_path_list (const char *win32, char *posix) cygwin_win32_to_posix_path_list (const char *win32, char *posix)
{ {