* dlfcn.cc (check_path_access): Drop FE_NATIVE from find_exec call.
(gfpod_helper): Drop equality sign from environment variable name in call to check_path_access. * exec.cc (execlp): Drop equality sign from environment variable name in call to find_exec. (execvp): Ditto. (execvpe): Ditto. * path.h (enum fe_types): Drop FE_NATIVE. (find_exec): Rename third paramter in declaration from search. Drop equality sign from default value. * spawn.cc (perhaps_suffix): Add PC_POSIX to path_conv::check call. (find_exec): Simplify function. Iterate over POSIX pathlist rather than Windows pathlist. Drop handling of FE_NATIVE flag. Always fill posix path of incoming path_conv buf, unless FE_NNF flag is given. (av::setup): Drop equality sign from environment variable name in call to find_exec. Call unshift with normalized_path. * winf.cc (av::unshift): Drop conv parameter and code converting Windows to POSIX path. * winf.h (av::unshift): Accommodate prototype.
This commit is contained in:
parent
9ab96e0fde
commit
117b1b1edb
|
@ -1,3 +1,25 @@
|
||||||
|
2015-02-11 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* dlfcn.cc (check_path_access): Drop FE_NATIVE from find_exec call.
|
||||||
|
(gfpod_helper): Drop equality sign from environment variable name
|
||||||
|
in call to check_path_access.
|
||||||
|
* exec.cc (execlp): Drop equality sign from environment variable name
|
||||||
|
in call to find_exec.
|
||||||
|
(execvp): Ditto.
|
||||||
|
(execvpe): Ditto.
|
||||||
|
* path.h (enum fe_types): Drop FE_NATIVE.
|
||||||
|
(find_exec): Rename third paramter in declaration from search. Drop
|
||||||
|
equality sign from default value.
|
||||||
|
* spawn.cc (perhaps_suffix): Add PC_POSIX to path_conv::check call.
|
||||||
|
(find_exec): Simplify function. Iterate over POSIX pathlist rather
|
||||||
|
than Windows pathlist. Drop handling of FE_NATIVE flag. Always fill
|
||||||
|
posix path of incoming path_conv buf, unless FE_NNF flag is given.
|
||||||
|
(av::setup): Drop equality sign from environment variable name
|
||||||
|
in call to find_exec. Call unshift with normalized_path.
|
||||||
|
* winf.cc (av::unshift): Drop conv parameter and code converting
|
||||||
|
Windows to POSIX path.
|
||||||
|
* winf.h (av::unshift): Accommodate prototype.
|
||||||
|
|
||||||
2015-02-10 Corinna Vinschen <corinna@vinschen.de>
|
2015-02-10 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* syscalls.cc (fhandler_base::stat_fixup): Generate unique inode number
|
* syscalls.cc (fhandler_base::stat_fixup): Generate unique inode number
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* dlfcn.cc
|
/* dlfcn.cc
|
||||||
|
|
||||||
Copyright 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
|
Copyright 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
|
||||||
2010, 2011, 2013, 2014 Red Hat, Inc.
|
2010, 2011, 2013, 2014, 2015 Red Hat, Inc.
|
||||||
|
|
||||||
This file is part of Cygwin.
|
This file is part of Cygwin.
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ set_dl_error (const char *str)
|
||||||
inline const char *
|
inline const char *
|
||||||
check_path_access (const char *mywinenv, const char *name, path_conv& buf)
|
check_path_access (const char *mywinenv, const char *name, path_conv& buf)
|
||||||
{
|
{
|
||||||
return find_exec (name, buf, mywinenv, FE_NNF | FE_NATIVE | FE_DLL);
|
return find_exec (name, buf, mywinenv, FE_NNF | FE_DLL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Search LD_LIBRARY_PATH for dll, if it exists. Search /usr/bin and /usr/lib
|
/* Search LD_LIBRARY_PATH for dll, if it exists. Search /usr/bin and /usr/lib
|
||||||
|
@ -47,7 +47,7 @@ gfpod_helper (const char *name, path_conv &real_filename)
|
||||||
{
|
{
|
||||||
if (strchr (name, '/'))
|
if (strchr (name, '/'))
|
||||||
real_filename.check (name, PC_SYM_FOLLOW | PC_NULLEMPTY);
|
real_filename.check (name, PC_SYM_FOLLOW | PC_NULLEMPTY);
|
||||||
else if (!check_path_access ("LD_LIBRARY_PATH=", name, real_filename))
|
else if (!check_path_access ("LD_LIBRARY_PATH", name, real_filename))
|
||||||
check_path_access ("/usr/bin:/usr/lib", name, real_filename);
|
check_path_access ("/usr/bin:/usr/lib", name, real_filename);
|
||||||
if (!real_filename.exists ())
|
if (!real_filename.exists ())
|
||||||
real_filename.error = ENOENT;
|
real_filename.error = ENOENT;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* exec.cc: exec system call support.
|
/* exec.cc: exec system call support.
|
||||||
|
|
||||||
Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008,
|
Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008,
|
||||||
2009, 2011, 2012 Red Hat, Inc.
|
2009, 2011, 2012, 2015 Red Hat, Inc.
|
||||||
|
|
||||||
This file is part of Cygwin.
|
This file is part of Cygwin.
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ execlp (const char *file, const char *arg0, ...)
|
||||||
va_end (args);
|
va_end (args);
|
||||||
MALLOC_CHECK;
|
MALLOC_CHECK;
|
||||||
return spawnve (_P_OVERLAY | _P_PATH_TYPE_EXEC,
|
return spawnve (_P_OVERLAY | _P_PATH_TYPE_EXEC,
|
||||||
find_exec (file, buf, "PATH=", FE_NNF) ?: "",
|
find_exec (file, buf, "PATH", FE_NNF) ?: "",
|
||||||
(char * const *) argv, cur_environ ());
|
(char * const *) argv, cur_environ ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ execvp (const char *file, char * const *argv)
|
||||||
|
|
||||||
MALLOC_CHECK;
|
MALLOC_CHECK;
|
||||||
return spawnve (_P_OVERLAY | _P_PATH_TYPE_EXEC,
|
return spawnve (_P_OVERLAY | _P_PATH_TYPE_EXEC,
|
||||||
find_exec (file, buf, "PATH=", FE_NNF) ?: "",
|
find_exec (file, buf, "PATH", FE_NNF) ?: "",
|
||||||
argv, cur_environ ());
|
argv, cur_environ ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,7 +113,7 @@ execvpe (const char *file, char * const *argv, char *const *envp)
|
||||||
|
|
||||||
MALLOC_CHECK;
|
MALLOC_CHECK;
|
||||||
return spawnve (_P_OVERLAY | _P_PATH_TYPE_EXEC,
|
return spawnve (_P_OVERLAY | _P_PATH_TYPE_EXEC,
|
||||||
find_exec (file, buf, "PATH=", FE_NNF) ?: "",
|
find_exec (file, buf, "PATH", FE_NNF) ?: "",
|
||||||
argv, envp);
|
argv, envp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* path.h: path data structures
|
/* path.h: path data structures
|
||||||
|
|
||||||
Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||||
2008, 2009, 2010, 2011, 2012, 2013 Red Hat, Inc.
|
2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Red Hat, Inc.
|
||||||
|
|
||||||
This file is part of Cygwin.
|
This file is part of Cygwin.
|
||||||
|
|
||||||
|
@ -414,12 +414,11 @@ enum fe_types
|
||||||
{
|
{
|
||||||
FE_NADA = 0, /* Nothing special */
|
FE_NADA = 0, /* Nothing special */
|
||||||
FE_NNF = 1, /* Return NULL if not found */
|
FE_NNF = 1, /* Return NULL if not found */
|
||||||
FE_NATIVE = 2, /* Return native path in path_conv struct */
|
|
||||||
FE_CWD = 4, /* Search CWD for program */
|
FE_CWD = 4, /* Search CWD for program */
|
||||||
FE_DLL = 8 /* Search for DLLs, not executables. */
|
FE_DLL = 8 /* Search for DLLs, not executables. */
|
||||||
};
|
};
|
||||||
const char *__reg3 find_exec (const char *name, path_conv& buf,
|
const char *__reg3 find_exec (const char *name, path_conv& buf,
|
||||||
const char *winenv = "PATH=",
|
const char *search = "PATH",
|
||||||
unsigned opt = FE_NADA,
|
unsigned opt = FE_NADA,
|
||||||
const char **known_suffix = NULL);
|
const char **known_suffix = NULL);
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* spawn.cc
|
/* spawn.cc
|
||||||
|
|
||||||
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
|
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
|
||||||
2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Red Hat, Inc.
|
2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Red Hat, Inc.
|
||||||
|
|
||||||
This file is part of Cygwin.
|
This file is part of Cygwin.
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ perhaps_suffix (const char *prog, path_conv& buf, int& err, unsigned opt)
|
||||||
|
|
||||||
err = 0;
|
err = 0;
|
||||||
debug_printf ("prog '%s'", prog);
|
debug_printf ("prog '%s'", prog);
|
||||||
buf.check (prog, PC_SYM_FOLLOW | PC_NULLEMPTY,
|
buf.check (prog, PC_SYM_FOLLOW | PC_NULLEMPTY | PC_POSIX,
|
||||||
(opt & FE_DLL) ? stat_suffixes : exe_suffixes);
|
(opt & FE_DLL) ? stat_suffixes : exe_suffixes);
|
||||||
|
|
||||||
if (buf.isdir ())
|
if (buf.isdir ())
|
||||||
|
@ -75,124 +75,86 @@ perhaps_suffix (const char *prog, path_conv& buf, int& err, unsigned opt)
|
||||||
return ext;
|
return ext;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find an executable name, possibly by appending known executable
|
/* Find an executable name, possibly by appending known executable suffixes
|
||||||
suffixes to it. The win32-translated name is placed in 'buf'.
|
to it. The path_conv struct 'buf' is filled and contains both, win32 and
|
||||||
Any found suffix is returned in known_suffix.
|
posix path of the file.. Any found suffix is returned in known_suffix.
|
||||||
|
|
||||||
If the file is not found and !null_if_not_found then the win32 version
|
|
||||||
of name is placed in buf and returned. Otherwise the contents of buf
|
|
||||||
is undefined and NULL is returned. */
|
|
||||||
|
|
||||||
|
If the file is not found and !FE_NNF then the win32 version of name is
|
||||||
|
placed in buf and returned. Otherwise the contents of buf is undefined
|
||||||
|
and NULL is returned. */
|
||||||
const char * __reg3
|
const char * __reg3
|
||||||
find_exec (const char *name, path_conv& buf, const char *mywinenv,
|
find_exec (const char *name, path_conv& buf, const char *search,
|
||||||
unsigned opt, const char **known_suffix)
|
unsigned opt, const char **known_suffix)
|
||||||
{
|
{
|
||||||
const char *suffix = "";
|
const char *suffix = "";
|
||||||
debug_printf ("find_exec (%s)", name);
|
const char *retval = NULL;
|
||||||
const char *retval;
|
|
||||||
tmp_pathbuf tp;
|
tmp_pathbuf tp;
|
||||||
|
char *tmp_path;
|
||||||
char *tmp = tp.c_get ();
|
char *tmp = tp.c_get ();
|
||||||
const char *posix = (opt & FE_NATIVE) ? NULL : name;
|
|
||||||
bool has_slash = !!strpbrk (name, "/\\");
|
bool has_slash = !!strpbrk (name, "/\\");
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
/* Check to see if file can be opened as is first.
|
debug_printf ("find_exec (%s)", name);
|
||||||
Win32 systems always check . first, but PATH may not be set up to
|
|
||||||
do this. */
|
/* Check to see if file can be opened as is first. */
|
||||||
if ((has_slash || opt & FE_CWD)
|
if ((has_slash || opt & FE_CWD)
|
||||||
&& (suffix = perhaps_suffix (name, buf, err, opt)) != NULL)
|
&& (suffix = perhaps_suffix (name, buf, err, opt)) != NULL)
|
||||||
{
|
{
|
||||||
if (posix && !has_slash)
|
|
||||||
{
|
|
||||||
tmp[0] = '.';
|
|
||||||
tmp[1] = '/';
|
|
||||||
strcpy (tmp + 2, name);
|
|
||||||
posix = tmp;
|
|
||||||
}
|
|
||||||
retval = buf.get_win32 ();
|
retval = buf.get_win32 ();
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
win_env *winpath;
|
|
||||||
const char *path;
|
const char *path;
|
||||||
const char *posix_path;
|
/* If it starts with a slash, it's a PATH-like pathlist. Otherwise it's
|
||||||
|
the name of an environment variable. */
|
||||||
posix = (opt & FE_NATIVE) ? NULL : tmp;
|
if (strchr (search, '/'))
|
||||||
|
*stpncpy (tmp, search, NT_MAX_PATH - 1) = '\0';
|
||||||
if (strchr (mywinenv, '/'))
|
else if (has_slash || isdrive (name) || !(path = getenv (search)) || !*path)
|
||||||
{
|
|
||||||
/* it's not really an environment variable at all */
|
|
||||||
int n = cygwin_conv_path_list (CCP_POSIX_TO_WIN_A, mywinenv, NULL, 0);
|
|
||||||
char *s = (char *) alloca (n);
|
|
||||||
if (cygwin_conv_path_list (CCP_POSIX_TO_WIN_A, mywinenv, s, n))
|
|
||||||
goto errout;
|
|
||||||
path = s;
|
|
||||||
posix_path = mywinenv - 1;
|
|
||||||
}
|
|
||||||
else if (has_slash || strchr (name, '\\') || isdrive (name)
|
|
||||||
|| !(winpath = getwinenv (mywinenv))
|
|
||||||
|| !(path = winpath->get_native ()) || *path == '\0')
|
|
||||||
/* Return the error condition if this is an absolute path or if there
|
|
||||||
is no PATH to search. */
|
|
||||||
goto errout;
|
goto errout;
|
||||||
else
|
else
|
||||||
posix_path = winpath->get_posix () - 1;
|
*stpncpy (tmp, path, NT_MAX_PATH - 1) = '\0';
|
||||||
|
|
||||||
debug_printf ("%s%s", mywinenv, path);
|
path = tmp;
|
||||||
/* Iterate over the specified path, looking for the file with and without
|
debug_printf ("searchpath %s", path);
|
||||||
executable extensions. */
|
|
||||||
|
tmp_path = tp.c_get ();
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
posix_path++;
|
char *eotmp = strccpy (tmp_path, &path, ':');
|
||||||
char *eotmp = strccpy (tmp, &path, ';');
|
|
||||||
/* An empty path or '.' means the current directory, but we've
|
/* An empty path or '.' means the current directory, but we've
|
||||||
already tried that. */
|
already tried that. */
|
||||||
if (opt & FE_CWD && (tmp[0] == '\0' || (tmp[0] == '.' && tmp[1] == '\0')))
|
if ((opt & FE_CWD) && (tmp_path[0] == '\0'
|
||||||
|
|| (tmp_path[0] == '.' && tmp_path[1] == '\0')))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
*eotmp++ = '\\';
|
*eotmp++ = '/';
|
||||||
strcpy (eotmp, name);
|
strcpy (eotmp, name);
|
||||||
|
|
||||||
debug_printf ("trying %s", tmp);
|
debug_printf ("trying %s", tmp_path);
|
||||||
|
|
||||||
int err1;
|
int err1;
|
||||||
|
|
||||||
if ((suffix = perhaps_suffix (tmp, buf, err1, opt)) != NULL)
|
if ((suffix = perhaps_suffix (tmp_path, buf, err1, opt)) != NULL)
|
||||||
{
|
{
|
||||||
if (buf.has_acls () && check_file_access (buf, X_OK, true))
|
if (buf.has_acls () && check_file_access (buf, X_OK, true))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (posix == tmp)
|
|
||||||
{
|
|
||||||
eotmp = strccpy (tmp, &posix_path, ':');
|
|
||||||
if (eotmp == tmp)
|
|
||||||
*eotmp++ = '.';
|
|
||||||
*eotmp++ = '/';
|
|
||||||
strcpy (eotmp, name);
|
|
||||||
}
|
|
||||||
retval = buf.get_win32 ();
|
retval = buf.get_win32 ();
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
while (*path && *++path && (posix_path = strchr (posix_path, ':')));
|
while (*path && *++path);
|
||||||
|
|
||||||
errout:
|
errout:
|
||||||
posix = NULL;
|
|
||||||
/* Couldn't find anything in the given path.
|
/* Couldn't find anything in the given path.
|
||||||
Take the appropriate action based on null_if_not_found. */
|
Take the appropriate action based on FE_NNF. */
|
||||||
if (opt & FE_NNF)
|
if (!(opt & FE_NNF))
|
||||||
retval = NULL;
|
|
||||||
else if (!(opt & FE_NATIVE))
|
|
||||||
retval = name;
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
buf.check (name);
|
buf.check (name, PC_SYM_FOLLOW | PC_POSIX);
|
||||||
retval = buf.get_win32 ();
|
retval = buf.get_win32 ();
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (posix)
|
|
||||||
retval = buf.set_path (posix);
|
|
||||||
debug_printf ("%s = find_exec (%s)", (char *) buf.get_win32 (), name);
|
debug_printf ("%s = find_exec (%s)", (char *) buf.get_win32 (), name);
|
||||||
if (known_suffix)
|
if (known_suffix)
|
||||||
*known_suffix = suffix ?: strchr (buf.get_win32 (), '\0');
|
*known_suffix = suffix ?: strchr (buf.get_win32 (), '\0');
|
||||||
|
@ -1238,10 +1200,8 @@ av::setup (const char *prog_arg, path_conv& real_path, const char *ext,
|
||||||
if (arg1)
|
if (arg1)
|
||||||
unshift (arg1);
|
unshift (arg1);
|
||||||
|
|
||||||
/* FIXME: This should not be using FE_NATIVE. It should be putting
|
find_exec (pgm, real_path, "PATH", FE_NADA, &ext);
|
||||||
the posix path on the argv list. */
|
unshift (real_path.normalized_path);
|
||||||
find_exec (pgm, real_path, "PATH=", FE_NATIVE, &ext);
|
|
||||||
unshift (real_path.get_win32 (), 1);
|
|
||||||
}
|
}
|
||||||
if (real_path.iscygexec ())
|
if (real_path.iscygexec ())
|
||||||
dup_all ();
|
dup_all ();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* winf.cc
|
/* winf.cc
|
||||||
|
|
||||||
Copyright 2003, 2004, 2005, 2006, 2008, 2009, 2013, 2014 Red Hat, Inc.
|
Copyright 2003, 2004, 2005, 2006, 2008, 2009, 2013, 2014, 2015 Red Hat, Inc.
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of the
|
This software is a copyrighted work licensed under the terms of the
|
||||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||||
|
@ -126,7 +126,7 @@ linebuf::fromargv (av& newargv, const char *real_path, bool cmdlenoverflow_ok)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
av::unshift (const char *what, int conv)
|
av::unshift (const char *what)
|
||||||
{
|
{
|
||||||
char **av;
|
char **av;
|
||||||
av = (char **) crealloc (argv, (argc + 2) * sizeof (char *));
|
av = (char **) crealloc (argv, (argc + 2) * sizeof (char *));
|
||||||
|
@ -135,17 +135,6 @@ av::unshift (const char *what, int conv)
|
||||||
|
|
||||||
argv = av;
|
argv = av;
|
||||||
memmove (argv + 1, argv, (argc + 1) * sizeof (char *));
|
memmove (argv + 1, argv, (argc + 1) * sizeof (char *));
|
||||||
tmp_pathbuf tp;
|
|
||||||
char *buf = tp.c_get ();
|
|
||||||
if (conv)
|
|
||||||
{
|
|
||||||
cygwin_conv_path (CCP_WIN_A_TO_POSIX | CCP_RELATIVE, what, buf,
|
|
||||||
NT_MAX_PATH);
|
|
||||||
char *p = strchr (buf, '\0') - 4;
|
|
||||||
if (p > buf && ascii_strcasematch (p, ".exe"))
|
|
||||||
*p = '\0';
|
|
||||||
what = buf;
|
|
||||||
}
|
|
||||||
*argv = cstrdup1 (what);
|
*argv = cstrdup1 (what);
|
||||||
calloced++;
|
calloced++;
|
||||||
argc++;
|
argc++;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* winf.h
|
/* winf.h
|
||||||
|
|
||||||
Copyright 2006, 2007, 2009, 2011, 2013 Red Hat, Inc.
|
Copyright 2006, 2007, 2009, 2011, 2013, 2015 Red Hat, Inc.
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of the
|
This software is a copyrighted work licensed under the terms of the
|
||||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||||
|
@ -41,7 +41,7 @@ class av
|
||||||
cfree (argv);
|
cfree (argv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
int unshift (const char *what, int conv = 0) __reg2;
|
int unshift (const char *what) __reg2;
|
||||||
operator char **() {return argv;}
|
operator char **() {return argv;}
|
||||||
void all_calloced () {calloced = argc;}
|
void all_calloced () {calloced = argc;}
|
||||||
void replace0_maybe (const char *arg0)
|
void replace0_maybe (const char *arg0)
|
||||||
|
|
Loading…
Reference in New Issue