From 352997c7b0a88f371787a2103a302e8778ea5a0c Mon Sep 17 00:00:00 2001 From: cgf Date: Tue, 24 Oct 2000 02:25:26 +0000 Subject: [PATCH] * exceptions.cc (signal_exit): Kill any executing child process if we're dying. * path.h: Remove unneeded extern. * spawn.cc (std_suffixes): Make static. Don't set dwProcessId here since it makes the process unsignalable. Set strace flag that this is an execed process stub. * strace.cc (strace::vsprntf): Use strace flag to indicate when to visually flag that this is an exec stub. * include/sys/strace.h (strace): Add 'execing' flag. --- winsup/cygwin/ChangeLog | 12 ++++++++++++ winsup/cygwin/exceptions.cc | 5 +++++ winsup/cygwin/include/sys/strace.h | 1 + winsup/cygwin/path.h | 2 -- winsup/cygwin/spawn.cc | 7 +++++-- winsup/cygwin/strace.cc | 8 ++++---- 6 files changed, 27 insertions(+), 8 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 3073042fb0..5568069a53 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +Mon Oct 23 21:47:55 2000 Christopher Faylor + + * exceptions.cc (signal_exit): Kill any executing child process if + we're dying. + * path.h: Remove unneeded extern. + * spawn.cc (std_suffixes): Make static. Don't set dwProcessId here + since it makes the process unsignalable. Set strace flag that this is + an execed process stub. + * strace.cc (strace::vsprntf): Use strace flag to indicate when to + visually flag that this is an exec stub. + * include/sys/strace.h (strace): Add 'execing' flag. + Mon Oct 23 16:43:33 2000 Christopher Faylor * sigproc.cc (proc_subproc): Don't send a false positive if WNOHANG and diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 0054b1a2c0..38879ee6ec 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -1017,6 +1017,8 @@ exit_sig: static void signal_exit (int rc) { + extern HANDLE hExeced; + rc = EXIT_SIGNAL | (rc << 8); if (exit_already++) myself->exit (rc); @@ -1035,6 +1037,9 @@ signal_exit (int rc) user_data->resourcelocks->Delete (); user_data->resourcelocks->Init (); + if (hExeced) + TerminateProcess (hExeced, rc); + do_exit (rc); } diff --git a/winsup/cygwin/include/sys/strace.h b/winsup/cygwin/include/sys/strace.h index d40e3ad7dc..37e9758dd7 100644 --- a/winsup/cygwin/include/sys/strace.h +++ b/winsup/cygwin/include/sys/strace.h @@ -30,6 +30,7 @@ public: int version; int active; int lmicrosec; + int execing; strace() : version(1) {} void prntf (unsigned, const char *func, const char *, ...); void wm (int message, int word, int lon); diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h index bef28fee95..14367c7f41 100644 --- a/winsup/cygwin/path.h +++ b/winsup/cygwin/path.h @@ -103,8 +103,6 @@ class path_conv /* Maximum depth of symlinks (after which ELOOP is issued). */ #define MAX_LINK_DEPTH 10 -extern suffix_info std_suffixes[]; - int __stdcall get_device_number (const char *name, int &unit, BOOL from_conv = FALSE); int __stdcall slash_unc_prefix_p (const char *path); int __stdcall check_null_empty_path (const char *name); diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index b4d65ba2d9..3afb45d38e 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -37,7 +37,7 @@ details. */ #define LINE_BUF_CHUNK (MAX_PATH * 2) -suffix_info std_suffixes[] = +static suffix_info std_suffixes[] = { suffix_info (".exe", 1), suffix_info ("", 1), suffix_info (".com"), suffix_info (".cmd"), @@ -45,6 +45,8 @@ suffix_info std_suffixes[] = suffix_info (NULL) }; +HANDLE hExeced; + /* Add .exe to PROG if not already present and see if that exists. If not, return PROG (converted from posix to win32 rules if necessary). The result is always BUF. @@ -671,7 +673,8 @@ skip_arg_parsing: /* These are both duplicated in the child code. We do this here, primarily for strace. */ strcpy (myself->progname, real_path); - myself->dwProcessId = pi.dwProcessId; + strace.execing = 1; + hExeced = pi.hProcess; } else { diff --git a/winsup/cygwin/strace.cc b/winsup/cygwin/strace.cc index 41c436e05a..d13596ea43 100644 --- a/winsup/cygwin/strace.cc +++ b/winsup/cygwin/strace.cc @@ -133,10 +133,8 @@ strace::vsprntf (char *buf, const char *func, const char *infmt, va_list ap) if ((p = strrchr (progname, '.')) != NULL && strcasematch (p, ".exe")) *p = '\000'; p = progname; - count = __small_sprintf (buf, fmt, p && *p ? p : "?", - myself->pid, - myself->dwProcessId != GetCurrentProcessId () - ? "!" : ""); + count = __small_sprintf (buf, fmt, p && *p ? p : "?", myself->pid, + execing ? "!" : ""); if (func) count += getfunc (buf + count, func); } @@ -177,6 +175,8 @@ strace::write (unsigned category, const char *buf, int count) __small_sprintf (outbuf, "cYg%08x", strlen (outstuff) + 1); outstuff[-1] = ' '; OutputDebugString (outbuf); +#undef outstuff +#undef PREFIX } /* Printf function used when tracing system calls. -- 2.11.0