Subject: kern/8455: It is impossible to get SIGIOs for non-controlling ttys
To: None <gnats-bugs@gnats.netbsd.org>
From: Michael Eriksson <eramore@era-t.ericsson.se>
List: netbsd-bugs
Date: 09/20/1999 15:55:17
>Number:         8455
>Category:       kern
>Synopsis:       It is impossible to get SIGIOs for non-controlling ttys
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    kern-bug-people (Kernel Bug People)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Mon Sep 20 15:05:00 1999
>Last-Modified:
>Originator:     Michael Eriksson
>Organization:
Ericsson Radio Systems AB
>Release:        NetBSD-release as of early September 1999 or so
>Environment:
System: NetBSD burken 1.4.1 NetBSD 1.4.1 (EMT) #0: Mon Sep 13 09:41:04 CEST 1999 eramore@burken:/var/home/eramore/wrk/maestro2/sys/arch/i386/compile/EMT i386


>Description:

It is currently impossible to get SIGIOs from ttys other than the
current controlling one. This obviously sucks when trying to talk to
modems or other serially connected equipment.

>How-To-Repeat:

Try to use fcntl(F_SETOWN) to get SIGIOs from a non-controlling tty
and watch it return ENOTTY.

>Fix:

Index: tty.c
===================================================================
RCS file: /cvsroot/syssrc/sys/kern/tty.c,v
retrieving revision 1.112
diff -u -r1.112 tty.c
--- tty.c	1998/09/11 12:50:11	1.112
+++ tty.c	1999/09/20 21:35:00
@@ -844,7 +844,7 @@
 		*(struct winsize *)data = tp->t_winsize;
 		break;
 	case TIOCGPGRP:			/* get pgrp of tty */
-		if (!isctty(p, tp))
+		if (tp->t_session && !isctty(p, tp))
 			return (ENOTTY);
 		*(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID;
 		break;
@@ -990,7 +990,7 @@
 	case TIOCSPGRP: {		/* set pgrp of tty */
 		register struct pgrp *pgrp = pgfind(*(int *)data);
 
-		if (!isctty(p, tp))
+		if (tp->t_session && !isctty(p, tp))
 			return (ENOTTY);
 		else if (pgrp == NULL)
 			return (EINVAL);
>Audit-Trail:
>Unformatted: