Skip to content

Commit

Permalink
Cygwin: pinfo: Align CTTY behavior to the statement of POSIX.
Browse files Browse the repository at this point in the history
POSIX states "A terminal may be the controlling terminal for at most
one session."
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap11.html

However, in cygwin, multiple sessions could be associated with the
same TTY. This patch aligns CTTY behavior to the statement of POSIX.

Reviewed-by: Corinna Vinschen <corinna@vinschen.de>
Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
  • Loading branch information
tyan0 committed Dec 22, 2022
1 parent 5841b2f commit 25c4ad6
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 17 deletions.
6 changes: 5 additions & 1 deletion winsup/cygwin/fhandler/termios.cc
Original file line number Diff line number Diff line change
Expand Up @@ -737,7 +737,11 @@ fhandler_termios::ioctl (int cmd, void *varg)
}

myself->ctty = -1;
myself->set_ctty (this, 0);
if (!myself->set_ctty (this, 0))
{
set_errno (EPERM);
return -1;
}
return 0;
}

Expand Down
2 changes: 2 additions & 0 deletions winsup/cygwin/mm/cygheap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,8 @@ void
init_cygheap::close_ctty ()
{
debug_printf ("closing cygheap->ctty %p", cygheap->ctty);
if (cygheap->ctty->tc ()->getsid () == pid)
cygheap->ctty->tc ()->setsid (0); /* Release CTTY ownership */
cygheap->ctty->close_with_arch ();
cygheap->ctty = NULL;
}
Expand Down
38 changes: 22 additions & 16 deletions winsup/cygwin/pinfo.cc
Original file line number Diff line number Diff line change
Expand Up @@ -530,24 +530,30 @@ _pinfo::set_ctty (fhandler_termios *fh, int flags)
debug_printf ("old %s, ctty device number %y, tc.ntty device number %y flags & O_NOCTTY %y", __ctty (), ctty, tc.ntty, flags & O_NOCTTY);
if (fh && (ctty <= 0 || ctty == tc.ntty) && !(flags & O_NOCTTY))
{
ctty = tc.ntty;
if (cygheap->ctty != fh->archetype)
if (tc.getsid () && tc.getsid () != sid)
; /* Do nothing if another session is associated with the TTY. */
else
{
debug_printf ("cygheap->ctty %p, archetype %p", cygheap->ctty, fh->archetype);
if (!cygheap->ctty)
syscall_printf ("ctty was NULL");
else
{
syscall_printf ("ctty %p, usecount %d", cygheap->ctty,
cygheap->ctty->archetype_usecount (0));
cygheap->ctty->close ();
}
cygheap->ctty = (fhandler_termios *) fh->archetype;
if (cygheap->ctty)
ctty = tc.ntty;
if (cygheap->ctty != fh->archetype)
{
fh->archetype_usecount (1);
/* guard ctty fh */
report_tty_counts (cygheap->ctty, "ctty", "");
debug_printf ("cygheap->ctty %p, archetype %p",
cygheap->ctty, fh->archetype);
if (!cygheap->ctty)
syscall_printf ("ctty was NULL");
else
{
syscall_printf ("ctty %p, usecount %d", cygheap->ctty,
cygheap->ctty->archetype_usecount (0));
cygheap->ctty->close ();
}
cygheap->ctty = (fhandler_termios *) fh->archetype;
if (cygheap->ctty)
{
fh->archetype_usecount (1);
/* guard ctty fh */
report_tty_counts (cygheap->ctty, "ctty", "");
}
}
}

Expand Down

0 comments on commit 25c4ad6

Please sign in to comment.