summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog22
-rw-r--r--winsup/cygwin/dlfcn.cc6
-rw-r--r--winsup/cygwin/exec.cc8
-rw-r--r--winsup/cygwin/path.h5
-rw-r--r--winsup/cygwin/spawn.cc114
-rw-r--r--winsup/cygwin/winf.cc15
-rw-r--r--winsup/cygwin/winf.h4
7 files changed, 72 insertions, 102 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 36685dd46..c87aee3ce 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -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>
* syscalls.cc (fhandler_base::stat_fixup): Generate unique inode number
diff --git a/winsup/cygwin/dlfcn.cc b/winsup/cygwin/dlfcn.cc
index 658551b70..914411cdb 100644
--- a/winsup/cygwin/dlfcn.cc
+++ b/winsup/cygwin/dlfcn.cc
@@ -1,7 +1,7 @@
/* dlfcn.cc
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.
@@ -37,7 +37,7 @@ set_dl_error (const char *str)
inline const char *
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
@@ -47,7 +47,7 @@ gfpod_helper (const char *name, path_conv &real_filename)
{
if (strchr (name, '/'))
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);
if (!real_filename.exists ())
real_filename.error = ENOENT;
diff --git a/winsup/cygwin/exec.cc b/winsup/cygwin/exec.cc
index b7342d7c2..a9c4bf388 100644
--- a/winsup/cygwin/exec.cc
+++ b/winsup/cygwin/exec.cc
@@ -1,7 +1,7 @@
/* exec.cc: exec system call support.
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.
@@ -76,7 +76,7 @@ execlp (const char *file, const char *arg0, ...)
va_end (args);
MALLOC_CHECK;
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 ());
}
@@ -102,7 +102,7 @@ execvp (const char *file, char * const *argv)
MALLOC_CHECK;
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 ());
}
@@ -113,7 +113,7 @@ execvpe (const char *file, char * const *argv, char *const *envp)
MALLOC_CHECK;
return spawnve (_P_OVERLAY | _P_PATH_TYPE_EXEC,
- find_exec (file, buf, "PATH=", FE_NNF) ?: "",
+ find_exec (file, buf, "PATH", FE_NNF) ?: "",
argv, envp);
}
diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h
index 8d4525890..aab480acc 100644
--- a/winsup/cygwin/path.h
+++ b/winsup/cygwin/path.h
@@ -1,7 +1,7 @@
/* path.h: path data structures
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.
@@ -414,12 +414,11 @@ enum fe_types
{
FE_NADA = 0, /* Nothing special */
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_DLL = 8 /* Search for DLLs, not executables. */
};
const char *__reg3 find_exec (const char *name, path_conv& buf,
- const char *winenv = "PATH=",
+ const char *search = "PATH",
unsigned opt = FE_NADA,
const char **known_suffix = NULL);
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc
index a0686c5d8..f8fb1bbe5 100644
--- a/winsup/cygwin/spawn.cc
+++ b/winsup/cygwin/spawn.cc
@@ -1,7 +1,7 @@
/* spawn.cc
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.
@@ -53,7 +53,7 @@ perhaps_suffix (const char *prog, path_conv& buf, int& err, unsigned opt)
err = 0;
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);
if (buf.isdir ())
@@ -75,124 +75,86 @@ perhaps_suffix (const char *prog, path_conv& buf, int& err, unsigned opt)
return ext;
}
-/* Find an executable name, possibly by appending known executable
- suffixes to it. The win32-translated name is placed in 'buf'.
- 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. */
+/* Find an executable name, possibly by appending known executable suffixes
+ to it. The path_conv struct 'buf' is filled and contains both, win32 and
+ posix path of the file.. Any found suffix is returned in known_suffix.
+ 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
-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)
{
const char *suffix = "";
- debug_printf ("find_exec (%s)", name);
- const char *retval;
+ const char *retval = NULL;
tmp_pathbuf tp;
+ char *tmp_path;
char *tmp = tp.c_get ();
- const char *posix = (opt & FE_NATIVE) ? NULL : name;
bool has_slash = !!strpbrk (name, "/\\");
int err = 0;
- /* Check to see if file can be opened as is first.
- Win32 systems always check . first, but PATH may not be set up to
- do this. */
+ debug_printf ("find_exec (%s)", name);
+
+ /* Check to see if file can be opened as is first. */
if ((has_slash || opt & FE_CWD)
&& (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 ();
goto out;
}
- win_env *winpath;
const char *path;
- const char *posix_path;
-
- posix = (opt & FE_NATIVE) ? NULL : tmp;
-
- if (strchr (mywinenv, '/'))
- {
- /* 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. */
+ /* If it starts with a slash, it's a PATH-like pathlist. Otherwise it's
+ the name of an environment variable. */
+ if (strchr (search, '/'))
+ *stpncpy (tmp, search, NT_MAX_PATH - 1) = '\0';
+ else if (has_slash || isdrive (name) || !(path = getenv (search)) || !*path)
goto errout;
else
- posix_path = winpath->get_posix () - 1;
+ *stpncpy (tmp, path, NT_MAX_PATH - 1) = '\0';
- debug_printf ("%s%s", mywinenv, path);
- /* Iterate over the specified path, looking for the file with and without
- executable extensions. */
+ path = tmp;
+ debug_printf ("searchpath %s", path);
+
+ tmp_path = tp.c_get ();
do
{
- posix_path++;
- char *eotmp = strccpy (tmp, &path, ';');
+ char *eotmp = strccpy (tmp_path, &path, ':');
/* An empty path or '.' means the current directory, but we've
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;
- *eotmp++ = '\\';
+ *eotmp++ = '/';
strcpy (eotmp, name);
- debug_printf ("trying %s", tmp);
+ debug_printf ("trying %s", tmp_path);
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))
continue;
-
- if (posix == tmp)
- {
- eotmp = strccpy (tmp, &posix_path, ':');
- if (eotmp == tmp)
- *eotmp++ = '.';
- *eotmp++ = '/';
- strcpy (eotmp, name);
- }
retval = buf.get_win32 ();
goto out;
}
+
}
- while (*path && *++path && (posix_path = strchr (posix_path, ':')));
+ while (*path && *++path);
errout:
- posix = NULL;
/* Couldn't find anything in the given path.
- Take the appropriate action based on null_if_not_found. */
- if (opt & FE_NNF)
- retval = NULL;
- else if (!(opt & FE_NATIVE))
- retval = name;
- else
+ Take the appropriate action based on FE_NNF. */
+ if (!(opt & FE_NNF))
{
- buf.check (name);
+ buf.check (name, PC_SYM_FOLLOW | PC_POSIX);
retval = buf.get_win32 ();
}
out:
- if (posix)
- retval = buf.set_path (posix);
debug_printf ("%s = find_exec (%s)", (char *) buf.get_win32 (), name);
if (known_suffix)
*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)
unshift (arg1);
- /* FIXME: This should not be using FE_NATIVE. It should be putting
- the posix path on the argv list. */
- find_exec (pgm, real_path, "PATH=", FE_NATIVE, &ext);
- unshift (real_path.get_win32 (), 1);
+ find_exec (pgm, real_path, "PATH", FE_NADA, &ext);
+ unshift (real_path.normalized_path);
}
if (real_path.iscygexec ())
dup_all ();
diff --git a/winsup/cygwin/winf.cc b/winsup/cygwin/winf.cc
index 7935103a0..4a1d97be5 100644
--- a/winsup/cygwin/winf.cc
+++ b/winsup/cygwin/winf.cc
@@ -1,6 +1,6 @@
/* 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
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
-av::unshift (const char *what, int conv)
+av::unshift (const char *what)
{
char **av;
av = (char **) crealloc (argv, (argc + 2) * sizeof (char *));
@@ -135,17 +135,6 @@ av::unshift (const char *what, int conv)
argv = av;
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);
calloced++;
argc++;
diff --git a/winsup/cygwin/winf.h b/winsup/cygwin/winf.h
index ca7d2bdd9..1d4fdc02d 100644
--- a/winsup/cygwin/winf.h
+++ b/winsup/cygwin/winf.h
@@ -1,6 +1,6 @@
/* 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
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
@@ -41,7 +41,7 @@ class av
cfree (argv);
}
}
- int unshift (const char *what, int conv = 0) __reg2;
+ int unshift (const char *what) __reg2;
operator char **() {return argv;}
void all_calloced () {calloced = argc;}
void replace0_maybe (const char *arg0)