From a345dc55f9d6ea302ec7bfbb0bda96cf20da80dd Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Sun, 8 Jan 2012 06:24:17 +0000 Subject: [PATCH] * dtable.cc (dtable::stdio_init): Always initialize console when we have one. * fhandler_termios.cc (fhandler_termios::tcsetpgrp): Use a better method to print tty name for debugging. (fhandler_termios::bg_check): Ditto. * pinfo.cc (_pinfo::set_ctty): Remove leftover debugging stuff. Simplify behavior when setting tty's sid and pgid to avoid overwriting previously set values. * spawn.cc (ch_spawn): Cosmetic change. --- winsup/cygwin/ChangeLog | 13 +++++++++++ winsup/cygwin/dtable.cc | 6 +---- winsup/cygwin/fhandler_termios.cc | 6 ++--- winsup/cygwin/pinfo.cc | 38 ++++++++++++------------------- winsup/cygwin/spawn.cc | 2 +- 5 files changed, 32 insertions(+), 33 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 8744cc8c9..9948fec09 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,16 @@ +2012-01-08 Christopher Faylor + + * dtable.cc (dtable::stdio_init): Always initialize console when we + have one. + * fhandler_termios.cc (fhandler_termios::tcsetpgrp): Use a better + method to print tty name for debugging. + (fhandler_termios::bg_check): Ditto. + * pinfo.cc (_pinfo::set_ctty): Remove leftover debugging stuff. + Simplify behavior when setting tty's sid and pgid to avoid overwriting + previously set values. + + * spawn.cc (ch_spawn): Cosmetic change. + 2012-01-06 Yaakov Selkowitz * cygwin.din (pthread_sigqueue): Export. diff --git a/winsup/cygwin/dtable.cc b/winsup/cygwin/dtable.cc index 05becaaa5..361010e11 100644 --- a/winsup/cygwin/dtable.cc +++ b/winsup/cygwin/dtable.cc @@ -149,14 +149,10 @@ dtable::get_debugger_info () void dtable::stdio_init () { - /* Set these before trying to output anything from strace. - Also, always set them even if we're to pick up our parent's fds - in case they're missed. */ - if (myself->cygstarted || ISSTATE (myself, PID_CYGPARENT)) { tty_min *t = cygwin_shared->tty.get_cttyp (); - if (t && t->getpgid () == myself->pid && t->is_console) + if (t && t->is_console) init_console_handler (true); return; } diff --git a/winsup/cygwin/fhandler_termios.cc b/winsup/cygwin/fhandler_termios.cc index fca180d99..c218fdeda 100644 --- a/winsup/cygwin/fhandler_termios.cc +++ b/winsup/cygwin/fhandler_termios.cc @@ -62,7 +62,7 @@ fhandler_termios::tcinit (bool is_pty_master) int fhandler_termios::tcsetpgrp (const pid_t pgid) { - termios_printf ("tty %d pgid %d, sid %d, tsid %d", tc ()->ntty, pgid, + termios_printf ("%s, pgid %d, sid %d, tsid %d", tc ()->ttyname (), pgid, myself->sid, tc ()->getsid ()); if (myself->sid != tc ()->getsid ()) { @@ -168,8 +168,8 @@ fhandler_termios::bg_check (int sig) if (sig < 0) sig = -sig; - termios_printf ("bg I/O pgid %d, tpgid %d, %s, ntty %s", myself->pgid, tc ()->getpgid (), - myctty (), tc ()->ttyname ()); + termios_printf ("%s, bg I/O pgid %d, tpgid %d, myctty %s", tc ()->ttyname (), + myself->pgid, tc ()->getpgid (), myctty ()); if (tc ()->getsid () == 0) { diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index 7affe4150..65640b2c9 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -433,9 +433,6 @@ _pinfo::_ctty (char *buf) bool _pinfo::set_ctty (fhandler_termios *fh, int flags) { -debug_printf ("fh %p", fh); -debug_printf ("tc %p", fh->tc ()); -if (!this || !fh->tc ()) try_to_debug (); tty_min& tc = *fh->tc (); debug_printf ("old %s, ctty device number %p, tc.ntty device number %p flags & O_NOCTTY %p", __ctty (), ctty, tc.ntty, flags & O_NOCTTY); if (fh && &tc && (ctty <= 0 || ctty == tc.ntty) && !(flags & O_NOCTTY)) @@ -466,30 +463,23 @@ if (!this || !fh->tc ()) try_to_debug (); syscall_printf ("attaching %s sid %d, pid %d, pgid %d, tty->pgid %d, tty->sid %d", __ctty (), sid, pid, pgid, tc.getpgid (), tc.getsid ()); if (!cygwin_finished_initializing && !myself->cygstarted - && myself->pgid == myself->pid && tc.getpgid () && tc.getsid ()) + && pgid == pid && tc.getpgid () && tc.getsid ()) { - myself->pgid = tc.getpgid (); - myself->sid = tc.getsid (); + pgid = tc.getpgid (); } - pinfo p (tc.getsid ()); - if (sid == pid && (!p || p->pid == pid || !p->exists ())) - { -#ifdef DEBUGGING - debug_printf ("resetting %s sid. Was %d, now %d. pgid was %d, now %d.", - __ctty (), tc.getsid (), sid, tc.getpgid (), pgid); -#else - paranoid_printf ("resetting %s sid. Was %d, now %d. pgid was %d, now %d.", - __ctty (), tc.getsid (), sid, tc.getpgid (), pgid); -#endif - /* We are the session leader */ - tc.setsid (sid); - tc.setpgid (pgid); - } - else - sid = tc.getsid (); - if (tc.getpgid () == 0) - tc.setpgid (pgid); + /* May actually need to do this: + + if (sid == pid && !tc.getsid () || !procinfo (tc.getsid ())->exists) + + but testing for process existence is expensive so we avoid it until + an obvious bug surfaces. */ + if (sid == pid && !tc.getsid ()) + tc.setsid (sid); + sid = tc.getsid (); + /* See above */ + if (!tc.getpgid () && pgid == pid) + tc.setpgid (pgid); } debug_printf ("cygheap->ctty now %p, archetype %p", cygheap->ctty, fh->archetype); return ctty > 0; diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 8a5a93935..1bf2d1dd0 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -269,7 +269,7 @@ do_cleanup (void *args) # undef cleanup } -NO_COPY child_info_spawn ch_spawn; +child_info_spawn NO_COPY ch_spawn; int child_info_spawn::worker (const char *prog_arg, const char *const *argv,