* 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.
This commit is contained in:
Christopher Faylor 2000-10-24 02:25:27 +00:00
parent 00ee2b44e7
commit 4c45a89744
6 changed files with 27 additions and 8 deletions

View File

@ -1,3 +1,15 @@
Mon Oct 23 21:47:55 2000 Christopher Faylor <cgf@cygnus.com>
* 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 <cgf@cygnus.com> Mon Oct 23 16:43:33 2000 Christopher Faylor <cgf@cygnus.com>
* sigproc.cc (proc_subproc): Don't send a false positive if WNOHANG and * sigproc.cc (proc_subproc): Don't send a false positive if WNOHANG and

View File

@ -1017,6 +1017,8 @@ exit_sig:
static void static void
signal_exit (int rc) signal_exit (int rc)
{ {
extern HANDLE hExeced;
rc = EXIT_SIGNAL | (rc << 8); rc = EXIT_SIGNAL | (rc << 8);
if (exit_already++) if (exit_already++)
myself->exit (rc); myself->exit (rc);
@ -1035,6 +1037,9 @@ signal_exit (int rc)
user_data->resourcelocks->Delete (); user_data->resourcelocks->Delete ();
user_data->resourcelocks->Init (); user_data->resourcelocks->Init ();
if (hExeced)
TerminateProcess (hExeced, rc);
do_exit (rc); do_exit (rc);
} }

View File

@ -30,6 +30,7 @@ public:
int version; int version;
int active; int active;
int lmicrosec; int lmicrosec;
int execing;
strace() : version(1) {} strace() : version(1) {}
void prntf (unsigned, const char *func, const char *, ...); void prntf (unsigned, const char *func, const char *, ...);
void wm (int message, int word, int lon); void wm (int message, int word, int lon);

View File

@ -103,8 +103,6 @@ class path_conv
/* Maximum depth of symlinks (after which ELOOP is issued). */ /* Maximum depth of symlinks (after which ELOOP is issued). */
#define MAX_LINK_DEPTH 10 #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 get_device_number (const char *name, int &unit, BOOL from_conv = FALSE);
int __stdcall slash_unc_prefix_p (const char *path); int __stdcall slash_unc_prefix_p (const char *path);
int __stdcall check_null_empty_path (const char *name); int __stdcall check_null_empty_path (const char *name);

View File

@ -37,7 +37,7 @@ details. */
#define LINE_BUF_CHUNK (MAX_PATH * 2) #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 (".exe", 1), suffix_info ("", 1),
suffix_info (".com"), suffix_info (".cmd"), suffix_info (".com"), suffix_info (".cmd"),
@ -45,6 +45,8 @@ suffix_info std_suffixes[] =
suffix_info (NULL) suffix_info (NULL)
}; };
HANDLE hExeced;
/* Add .exe to PROG if not already present and see if that exists. /* 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). If not, return PROG (converted from posix to win32 rules if necessary).
The result is always BUF. The result is always BUF.
@ -671,7 +673,8 @@ skip_arg_parsing:
/* These are both duplicated in the child code. We do this here, /* These are both duplicated in the child code. We do this here,
primarily for strace. */ primarily for strace. */
strcpy (myself->progname, real_path); strcpy (myself->progname, real_path);
myself->dwProcessId = pi.dwProcessId; strace.execing = 1;
hExeced = pi.hProcess;
} }
else else
{ {

View File

@ -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")) if ((p = strrchr (progname, '.')) != NULL && strcasematch (p, ".exe"))
*p = '\000'; *p = '\000';
p = progname; p = progname;
count = __small_sprintf (buf, fmt, p && *p ? p : "?", count = __small_sprintf (buf, fmt, p && *p ? p : "?", myself->pid,
myself->pid, execing ? "!" : "");
myself->dwProcessId != GetCurrentProcessId ()
? "!" : "");
if (func) if (func)
count += getfunc (buf + count, 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); __small_sprintf (outbuf, "cYg%08x", strlen (outstuff) + 1);
outstuff[-1] = ' '; outstuff[-1] = ' ';
OutputDebugString (outbuf); OutputDebugString (outbuf);
#undef outstuff
#undef PREFIX
} }
/* Printf function used when tracing system calls. /* Printf function used when tracing system calls.