(cygheap_fdmanip::isopen): New method.
* syscalls.cc (_read): Avoid accessing closed fd.
* path.h (fe_types): New enum.
(path_conv::set_path): New method.
(find_exec): Change null_if_not_found argument to something more generic.
* spawn.cc (find_exec): Default to returning the POSIX path rather than the
windows path, unless instructed otherwise.
(spawn_guts): Force call to find_exec to use native paths.
* dlfcn.cc (check_path_access): Accommodate new find_exec arguments.
* environ.h (win_env::get_posix): New method.
+2001-10-30 Christopher Faylor <cgf@redhat.com>
+
+ * cygheap.h (cygheap_fdmanip::cygheap_fdmanip): Clear fh.
+ (cygheap_fdmanip::isopen): New method.
+ * syscalls.cc (_read): Avoid accessing closed fd.
+
+ * path.h (fe_types): New enum.
+ (path_conv::set_path): New method.
+ (find_exec): Change null_if_not_found argument to something more
+ generic.
+ * spawn.cc (find_exec): Default to returning the POSIX path rather than
+ the windows path, unless instructed otherwise.
+ (spawn_guts): Force call to find_exec to use native paths.
+ * dlfcn.cc (check_path_access): Accommodate new find_exec arguments.
+ * environ.h (win_env::get_posix): New method.
+
2001-10-30 Corinna Vinschen <corinna@vinschen.de>
* fhandler_socket.cc (fhandler_socket::close): Add error handling.
fhandler_base **fh;
bool locked;
public:
- cygheap_fdmanip () {}
+ cygheap_fdmanip (): fh (NULL) {}
virtual ~cygheap_fdmanip ()
{
if (locked)
operator fhandler_base* &() {return *fh;}
void operator = (fhandler_base *fh) {*this->fh = fh;}
fhandler_base *operator -> () const {return *fh;}
+ bool isopen () const {return *fh;}
};
class cygheap_fdnew : public cygheap_fdmanip
inline const char * __stdcall
check_path_access (const char *mywinenv, const char *name, path_conv& buf)
{
- return find_exec (name, buf, mywinenv, TRUE);
+ return find_exec (name, buf, mywinenv, FE_NNF | FE_NATIVE | FE_CWD);
}
/* Search LD_LIBRARY_PATH for dll, if it exists.
int (*posix_len) (const char *);
int (*win32_len) (const char *);
void add_cache (const char *in_posix, const char *in_native = NULL);
- const char * get_native () {return native ? native + namelen : NULL;}
+ const char * get_native () const {return native ? native + namelen : NULL;}
+ const char * get_posix () const {return posix ? posix : NULL;}
};
win_env * __stdcall getwinenv (const char *name, const char *posix = NULL);
DWORD file_attributes () {return fileattr;}
DWORD get_drive_type () {return drive_type;}
BOOL fs_fast_ea () {return sym_opt & PC_CHECK_EA;}
+ void set_path (const char *p) {strcpy (path, p);}
};
/* Symlink marker */
#define MAX_LINK_DEPTH 10
int __stdcall slash_unc_prefix_p (const char *path) __attribute__ ((regparm(1)));
-const char * __stdcall find_exec (const char *name, path_conv& buf, const char *winenv = "PATH=",
- int null_if_notfound = 0, const char **known_suffix = NULL) __attribute__ ((regparm(3)));
+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 */
+};
+const char * __stdcall find_exec (const char *name, path_conv& buf,
+ const char *winenv = "PATH=",
+ unsigned opt = FE_NADA,
+ const char **known_suffix = NULL)
+ __attribute__ ((regparm(3)));
/* Common macros for checking for invalid path names */
#define isdrive(s) (isalpha (*(s)) && (s)[1] == ':')
const char * __stdcall
find_exec (const char *name, path_conv& buf, const char *mywinenv,
- int null_if_notfound, const char **known_suffix)
+ unsigned opt, const char **known_suffix)
{
const char *suffix = "";
debug_printf ("find_exec (%s)", name);
char *retval = buf;
+ char tmp[MAX_PATH];
+ const char *posix = (opt & FE_NATIVE) ? NULL : name;
+ bool has_slash = strchr (name, '/');
/* 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. */
- if ((suffix = perhaps_suffix (name, buf)) != NULL)
- goto out;
+ if ((has_slash || opt & FE_CWD)
+ && (suffix = perhaps_suffix (name, buf)) != NULL)
+ {
+ if (posix && !has_slash)
+ {
+ tmp[0] = '.';
+ tmp[1] = '/';
+ strcpy (tmp + 2, name);
+ posix = tmp;
+ }
+ goto out;
+ }
win_env *winpath;
const char *path;
- char tmp[MAX_PATH];
+ const char *posix_path;
/* Return the error condition if this is an absolute path or if there
is no PATH to search. */
debug_printf ("%s%s", mywinenv, path);
+ posix = (opt & FE_NATIVE) ? NULL : tmp;
+ posix_path = winpath->get_posix () - 1;
/* Iterate over the specified path, looking for the file with and
without executable extensions. */
do
{
+ posix_path++;
char *eotmp = strccpy (tmp, &path, ';');
/* An empty path or '.' means the current directory, but we've
already tried that. */
- if (tmp[0] == '\0' || (tmp[0] == '.' && tmp[1] == '\0'))
+ if (opt & FE_CWD && (tmp[0] == '\0' || (tmp[0] == '.' && tmp[1] == '\0')))
continue;
*eotmp++ = '\\';
debug_printf ("trying %s", tmp);
if ((suffix = perhaps_suffix (tmp, buf)) != NULL)
- goto out;
+ {
+ if (posix == tmp)
+ {
+ eotmp = strccpy (tmp, &posix_path, ':');
+ if (eotmp == tmp)
+ *eotmp++ = '.';
+ *eotmp++ = '/';
+ strcpy (eotmp, name);
+ }
+ goto out;
+ }
}
- while (*path && *++path);
+ while (*path && *++path && (posix_path = strchr (posix_path, ':')));
errout:
+ posix = NULL;
/* Couldn't find anything in the given path.
Take the appropriate action based on null_if_not_found. */
- if (null_if_notfound)
+ if (opt & FE_NNF)
retval = NULL;
- else
+ else if (opt & FE_NATIVE)
buf.check (name);
out:
+ if (posix)
+ buf.set_path (posix);
debug_printf ("%s = find_exec (%s)", (char *) buf, name);
if (known_suffix)
*known_suffix = suffix ?: strchr (buf, '\0');
if (arg1)
newargv.unshift (arg1);
- find_exec (pgm, real_path, "PATH=", 0, &ext);
+ /* 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);
newargv.unshift (real_path, 1);
}
goto out;
}
+ if (!cfd.isopen())
+ return -1;
+
/* Check to see if this is a background read from a "tty",
sending a SIGTTIN, if appropriate */
res = cfd->bg_check (SIGTTIN);