From 164a681ca55419ec2cc7c9ad45f720f4a79cada1 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Mon, 9 Oct 2000 02:53:44 +0000 Subject: * dtable.cc (set_std_handle): Use std_consts array to control SetStdHandle settings. (dtable::fixup_after_fork): Ditto. * exceptions.cc (set_sig_errno): Remove some debugging output. * path.cc (path_conv::check): Don't OR need_directory with flags sent to symlink_info::check. (symlink_info::check): Use PATH_ALL_EXEC to determine when a file is executable. * path.h (path_types): Add PATH_ALL_EXEC. (isexec): Use PATH_ALL_EXEC so that cygexec types will be considered executable. * pinfo.h (_pinfo): Add a process handle that is kept open throughout the life of a cygwin pid. * sigproc.cc (proc_exists): Remove hopefully obsolete stuff. (proc_subproc): Set up process handle that is kept open throughout the life of a cygwin pid. Reorganize PROC_WAIT stuff to use common code. (proc_terminate): Close pid lifetime process handle. (checkstate): Cleanup. (stopped_or_terminated): Move zombie cleanup. (remove_zombie): To here. * spawn.cc (spawn_guts): Reorganize reparenting code for 1247th time. --- winsup/cygwin/spawn.cc | 60 +++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 32 deletions(-) (limited to 'winsup/cygwin/spawn.cc') diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 01a9cecd3..8542ecb1e 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -687,14 +687,11 @@ skip_arg_parsing: /* We print the original program name here so the user can see that too. */ syscall_printf ("%d = spawn_guts (%s, %.132s)", - rc ? cygpid : (unsigned int) -1, - prog_arg, one_line.buf); + rc ? cygpid : (unsigned int) -1, prog_arg, one_line.buf); - MALLOC_CHECK; /* Name the handle similarly to proc_subproc. */ ProtectHandle1 (pi.hProcess, childhProc); ProtectHandle (pi.hThread); - MALLOC_CHECK; if (mode == _P_OVERLAY) { @@ -785,20 +782,16 @@ skip_arg_parsing: { case WAIT_OBJECT_0: sigproc_printf ("subprocess exited"); - if (!GetExitCodeProcess (pi.hProcess, &res)) - res = 1; + DWORD exitcode; + if (!GetExitCodeProcess (pi.hProcess, &exitcode)) + exitcode = 1; + res |= exitcode; exited = TRUE; - if (nwait <= 2 || mode != _P_OVERLAY) + if (nwait <= 2 || (res & EXIT_REPARENTING) || (mode != _P_OVERLAY && mode != _P_VFORK)) /* nothing to do */; else if (WaitForSingleObject (spr, 1) == WAIT_OBJECT_0) goto reparent; - else if (!(res & EXIT_REPARENTING)) - { - MALLOC_CHECK; - close_all_files (); - MALLOC_CHECK; - } break; case WAIT_OBJECT_0 + 1: sigproc_printf ("signal arrived"); @@ -809,7 +802,6 @@ skip_arg_parsing: { reparent: res |= EXIT_REPARENTING; - close_all_files (); if (!parent_alive) { nwait = 1; @@ -848,33 +840,37 @@ skip_arg_parsing: /* nothing */; else { - int rc; - HANDLE hP = OpenProcess (PROCESS_ALL_ACCESS, FALSE, - parent->dwProcessId); - sigproc_printf ("parent handle %p, pid %d", hP, parent->dwProcessId); - if (hP == NULL && GetLastError () == ERROR_INVALID_PARAMETER) + int rc = 0; + HANDLE oldh = myself->hProcess; + HANDLE h = OpenProcess (PROCESS_ALL_ACCESS, FALSE, + parent->dwProcessId); + sigproc_printf ("parent handle %p, pid %d", h, parent->dwProcessId); + if (h == NULL && GetLastError () == ERROR_INVALID_PARAMETER) rc = 1; - else if (hP) + else if (h) { - ProtectHandle (hP); - rc = DuplicateHandle (hMainProc, pi.hProcess, hP, - &myself->hProcess, 0, FALSE, + ProtectHandle (h); + rc = DuplicateHandle (hMainProc, pi.hProcess, + h, &myself->hProcess, 0, FALSE, DUPLICATE_SAME_ACCESS); - sigproc_printf ("Dup hP %d", rc); - ForceCloseHandle (hP); + sigproc_printf ("%d = DuplicateHandle, oldh %p, newh %p", + rc, oldh, myself->hProcess); + ForceCloseHandle (h); } - if (!res) + if (!rc) { - system_printf ("Reparent failed, parent handle %p, %E", hP); + system_printf ("Reparent failed, parent handle %p, %E", h); system_printf ("my dwProcessId %d, myself->dwProcessId %d", GetCurrentProcessId(), myself->dwProcessId); - system_printf ("myself->process_state %x", - myself->process_state); - system_printf ("myself->hProcess %x", myself->hProcess); + system_printf ("old hProcess %p, hProcess %p", oldh, myself->hProcess); } } - ForceCloseHandle1 (hExeced, childhProc); - hExeced = INVALID_HANDLE_VALUE; + if (hExeced) + { + ForceCloseHandle1 (hExeced, childhProc); + hExeced = INVALID_HANDLE_VALUE; + close_all_files (); + } } else if (exited) { -- cgit v1.2.3