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))
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;