+2005-11-14 Christopher Faylor <cgf@timesys.com>
+
+ * 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 <cgf@timesys.com>
* cygheap.h (init_cygheap::manage_console_count): Declare new function.
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);
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)
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)
{
}
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 ())
cygheap->fdtab.release (i);
}
- if (cygheap->ctty)
+ if (!hExeced && cygheap->ctty)
cygheap->close_ctty ();
cygheap->fdtab.unlock ();
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;
}