summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog12
-rw-r--r--winsup/cygwin/hookapi.cc2
-rw-r--r--winsup/cygwin/path.h7
-rw-r--r--winsup/cygwin/spawn.cc20
4 files changed, 28 insertions, 13 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 1a68b5c8e..40014eebb 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,15 @@
+2005-09-07 Christopher Faylor <cgf@timesys.com>
+
+ * hookapi.cc (rvadelta): Change argument to DWORD to eliminate a
+ compiler warning.
+
+ * path.h (path_conv::set_cygexec): New function.
+ * spawn.cc (av::iscygwin): Eliminate.
+ (av::av): Don't initialize iscygwin.
+ (spawn_guts): Just use real_path.iscygexec for all tests.
+ (av::fixup): Short circuit test if .exe extension and known cygexec.
+ Set cygexec flag appropriately if we find that program uses cygwin1.dll.
+
2005-09-06 Christopher Faylor <cgf@timesys.com>
* dcrt0.cc (initial_env): Don't attempt stracing if dynamically loaded.
diff --git a/winsup/cygwin/hookapi.cc b/winsup/cygwin/hookapi.cc
index 8857b3f0e..08e257ba1 100644
--- a/winsup/cygwin/hookapi.cc
+++ b/winsup/cygwin/hookapi.cc
@@ -39,7 +39,7 @@ PEHeaderFromHModule (HMODULE hModule)
}
long
-rvadelta (PIMAGE_NT_HEADERS pnt, long import_rva)
+rvadelta (PIMAGE_NT_HEADERS pnt, DWORD import_rva)
{
PIMAGE_SECTION_HEADER section = (PIMAGE_SECTION_HEADER) (pnt + 1);
for (int i = 0; i < pnt->FileHeader.NumberOfSections; i++)
diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h
index a502e8629..14c23ebe5 100644
--- a/winsup/cygwin/path.h
+++ b/winsup/cygwin/path.h
@@ -151,6 +151,13 @@ class path_conv
int is_lnk_special () const {return is_fs_device () || isfifo () || is_lnk_symlink ();}
int issocket () const {return dev.devn == FH_UNIX;}
int iscygexec () const {return path_flags & PATH_CYGWIN_EXEC;}
+ void set_cygexec (bool isset)
+ {
+ if (isset)
+ path_flags |= PATH_CYGWIN_EXEC;
+ else
+ path_flags &= ~PATH_CYGWIN_EXEC;
+ }
bool isro () const {return !!(path_flags & PATH_RO);}
bool exists () const {return fileattr != INVALID_FILE_ATTRIBUTES;}
bool has_attribute (DWORD x) const {return exists () && (fileattr & x);}
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc
index 87b2b6dcb..39d2948df 100644
--- a/winsup/cygwin/spawn.cc
+++ b/winsup/cygwin/spawn.cc
@@ -277,9 +277,8 @@ class av
int error;
int argc;
bool win16_exe;
- bool iscygwin;
av (): argv (NULL) {}
- av (int ac_in, const char * const *av_in) : calloced (0), error (false), argc (ac_in), win16_exe (false), iscygwin (false)
+ av (int ac_in, const char * const *av_in) : calloced (0), error (false), argc (ac_in), win16_exe (false)
{
argv = (char **) cmalloc (HEAP_1_ARGV, (argc + 5) * sizeof (char *));
memcpy (argv, av_in, (argc + 1) * sizeof (char *));
@@ -459,7 +458,6 @@ spawn_guts (const char * prog_arg, const char *const *argv,
one_line.add (argv[2]);
strcpy (real_path, argv[0]);
null_app_name = true;
- newargv.iscygwin = false;
goto skip_arg_parsing;
}
@@ -477,7 +475,7 @@ spawn_guts (const char * prog_arg, const char *const *argv,
if (res)
goto out;
- if (real_path.iscygexec () || newargv.iscygwin)
+ if (real_path.iscygexec ())
newargv.dup_all ();
else
{
@@ -624,7 +622,7 @@ spawn_guts (const char * prog_arg, const char *const *argv,
cygheap->user.deimpersonate ();
moreinfo->envp = build_env (envp, envblock, moreinfo->envc, real_path.iscygexec ());
- ciresrv.set (chtype, newargv.iscygwin);
+ ciresrv.set (chtype, real_path.iscygexec ());
ciresrv.moreinfo = moreinfo;
si.lpReserved2 = (LPBYTE) &ciresrv;
@@ -1019,8 +1017,9 @@ spawnvpe (int mode, const char *file, const char * const *argv,
int
av::fixup (child_info_types chtype, const char *prog_arg, path_conv& real_path, const char *ext)
{
- /* If the file name ends in either .exe, .com, .bat, or .cmd we assume
- that it is NOT a script file */
+ bool exeext = strcasematch (ext, ".exe");
+ if (exeext && real_path.iscygexec ())
+ return 0;
while (1)
{
HANDLE h = CreateFile (real_path, GENERIC_READ,
@@ -1044,7 +1043,7 @@ av::fixup (child_info_types chtype, const char *prog_arg, path_conv& real_path,
unsigned off = (unsigned char) buf[0x18] | (((unsigned char) buf[0x19]) << 8);
win16_exe = off < sizeof (IMAGE_DOS_HEADER);
if (!win16_exe)
- iscygwin = hook_or_detect_cygwin (buf, NULL);
+ real_path.set_cygexec (!!hook_or_detect_cygwin (buf, NULL));
UnmapViewOfFile (buf);
break;
}
@@ -1092,10 +1091,7 @@ av::fixup (child_info_types chtype, const char *prog_arg, path_conv& real_path,
if (!pgm)
{
if (strcasematch (ext, ".com"))
- {
- iscygwin = false;
- break;
- }
+ break;
pgm = (char *) "/bin/sh";
arg1 = NULL;
}