diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 136508f22..52d169477 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +2005-11-14 Christopher Faylor + + * fhandler.h (fhandler_console::fixup_after_fork_exec): Declare new function. + (fhandler_console::fixup_after_fork): Use fixup_after_fork_exec. + (fhandler_console::fixup_after_exec): Ditto. + * fhandler_console.cc (fhandler_console::fixup_after_fork): Delete definition. + (fhandler_console::fixup_after_fork_exec): Rename from fixup_after_exec. + * pinfo.cc (_pinfo::set_ctty): Don't play with console count here. + * syscalls.cc (close_all_files): Don't close cygheap ctty if hExeced + since the child will be copying information from us. + (setsid): Use myctty() rather than raw ctty #. + 2005-11-13 Christopher Faylor * cygheap.h (init_cygheap::manage_console_count): Declare new function. diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 66ccf1e83..3e61f8297 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -909,9 +909,10 @@ class fhandler_console: public fhandler_termios select_record *select_read (select_record *s); select_record *select_write (select_record *s); select_record *select_except (select_record *s); - void fixup_after_exec (); + void fixup_after_fork_exec (); + void fixup_after_exec () {fixup_after_fork_exec ();} + void fixup_after_fork (HANDLE) {fixup_after_fork_exec ();} void set_close_on_exec (bool val); - void fixup_after_fork (HANDLE parent); void set_input_state (); void send_winch_maybe (); static tty_min *get_tty_stuff (int); diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc index a8c73d618..3c812ce33 100644 --- a/winsup/cygwin/fhandler_console.cc +++ b/winsup/cygwin/fhandler_console.cc @@ -695,10 +695,7 @@ fhandler_console::close () return 0; } -/* - * Special console dup to duplicate input and output - * handles. - */ +/* Special console dup to duplicate input and output handles. */ int fhandler_console::dup (fhandler_base *child) @@ -1757,29 +1754,6 @@ fhandler_console::set_close_on_exec (bool val) set_no_inheritance (output_handle, val); } -void -fhandler_console::fixup_after_fork (HANDLE) -{ - HANDLE h = get_handle (); - HANDLE oh = get_output_handle (); - - /* Windows does not allow duplication of console handles between processes - so open the console explicitly. */ - - if (!open (O_NOCTTY | get_flags (), 0)) - system_printf ("error opening console after fork, %E"); - - /* Need to decrement console_count since this open is basically a no-op to reopen - the console and we've already recorded that fact. */ - cygheap->manage_console_count ("fhandler_console::fixup_after_fork", -1); - - if (!close_on_exec ()) - { - CloseHandle (h); - CloseHandle (oh); - } -} - void __stdcall set_console_title (char *title) { @@ -1795,29 +1769,29 @@ set_console_title (char *title) } void -fhandler_console::fixup_after_exec () +fhandler_console::fixup_after_fork_exec () { HANDLE h = get_handle (); HANDLE oh = get_output_handle (); if (close_on_exec () || open (O_NOCTTY | get_flags (), 0)) - cygheap->manage_console_count ("fhandler_console::fixup_after_exec", -1); + cygheap->manage_console_count ("fhandler_console::fixup_after_fork_exec", -1); else { bool sawerr = false; if (!get_io_handle ()) { - system_printf ("error opening input console handle after exec, errno %d, %E", get_errno ()); + system_printf ("error opening input console handle after fork/exec, errno %d, %E", get_errno ()); sawerr = true; } if (!get_output_handle ()) { - system_printf ("error opening output console handle after exec, errno %d, %E", get_errno ()); + system_printf ("error opening output console handle after fork/exec, errno %d, %E", get_errno ()); sawerr = true; } if (!sawerr) - system_printf ("error opening console after exec, errno %d, %E", get_errno ()); + system_printf ("error opening console after fork/exec, errno %d, %E", get_errno ()); } if (!close_on_exec ()) diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc index 0afc1a0c4..3bf524e11 100644 --- a/winsup/cygwin/fhandler_tty.cc +++ b/winsup/cygwin/fhandler_tty.cc @@ -450,8 +450,7 @@ fhandler_tty_slave::open (int flags, mode_t) { if (get_device () == FH_TTY) pc.dev.tty_to_real_device (); - fhandler_tty_slave *arch = (fhandler_tty_slave *) - cygheap->fdtab.find_archetype (pc.dev); + fhandler_tty_slave *arch = (fhandler_tty_slave *) cygheap->fdtab.find_archetype (pc.dev); if (arch) { *this = *(fhandler_tty_slave *) arch; diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index 7350a00a1..661091954 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -365,7 +365,6 @@ _pinfo::set_ctty (tty_min *tc, int flags, fhandler_tty_slave *arch) if (arch) { arch->usecount++; - cygheap->manage_console_count ("pinfo::set_ctty", 1); report_tty_counts (cygheap->ctty, "ctty", ""); } } diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index 2a425ed0c..7f941df11 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -114,7 +114,7 @@ close_all_files (bool norelease) cygheap->fdtab.release (i); } - if (cygheap->ctty) + if (!hExeced && cygheap->ctty) cygheap->close_ctty (); cygheap->fdtab.unlock (); @@ -347,8 +347,7 @@ setsid (void) myself->pgid = getpid (); if (cygheap->ctty) cygheap->close_ctty (); - syscall_printf ("sid %d, pgid %d, ctty %d", myself->sid, myself->pgid, - myself->ctty); + syscall_printf ("sid %d, pgid %d, %s", myself->sid, myself->pgid, myctty ()); return myself->sid; }