kern/152254: [patch] Support ioctl() on TTY control devices
Peter Jeremy
peter.jeremy at alcatel-lucent.com
Mon Nov 15 04:30:09 UTC 2010
>Number: 152254
>Category: kern
>Synopsis: [patch] Support ioctl() on TTY control devices
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Mon Nov 15 04:30:09 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator: Peter Jeremy
>Release: FreeBSD-8.1
>Organization:
Alcatel-Lucent Australia
>Environment:
FreeBSD pjdesk.au.alcatel-lucent.com 8.1-PRERELEASE FreeBSD 8.1-PRERELEASE #19: Wed Jul 14 07:24:18 EST 2010 root at pjdesk.au.alcatel-lucent.com:/var/obj/usr/src/sys/pjdesk amd64
>Description:
The TTY MPSAFE adaption removed support for issuing driver-specific ioctl(2) calls on the TTY control device. This patch re-adds it since this support is required for digi(4).
>How-To-Repeat:
Code inspection
>Fix:
Patch attached with submission follows:
Index: sys/ttydevsw.h
===================================================================
RCS file: /usr/ncvs/src/sys/sys/ttydevsw.h,v
retrieving revision 1.4.2.1
diff -u -r1.4.2.1 ttydevsw.h
--- sys/ttydevsw.h 3 Aug 2009 08:13:06 -0000 1.4.2.1
+++ sys/ttydevsw.h 15 Nov 2010 03:11:44 -0000
@@ -52,6 +52,8 @@
vm_paddr_t * paddr, int nprot);
typedef void tsw_pktnotify_t(struct tty *tp, char event);
typedef void tsw_free_t(void *softc);
+typedef int tsw_cioctl_t(struct tty *tp, u_long cmd, caddr_t data,
+ struct thread *td);
struct ttydevsw {
unsigned int tsw_flags; /* Default TTY flags. */
@@ -70,6 +72,8 @@
tsw_pktnotify_t *tsw_pktnotify; /* TIOCPKT events. */
tsw_free_t *tsw_free; /* Destructor. */
+
+ tsw_cioctl_t *tsw_cioctl; /* Ioctl on control devices */
};
static __inline int
@@ -166,4 +170,13 @@
tp->t_devsw->tsw_free(tty_softc(tp));
}
+static __inline int
+ttydevsw_cioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
+{
+ tty_lock_assert(tp, MA_OWNED);
+ MPASS(!tty_gone(tp));
+
+ return tp->t_devsw->tsw_cioctl(tp, cmd, data, td);
+}
+
#endif /* !_SYS_TTYDEVSW_H_ */
Index: kern/tty.c
===================================================================
RCS file: /usr/ncvs/src/sys/kern/tty.c,v
retrieving revision 1.328.2.4
diff -u -r1.328.2.4 tty.c
--- kern/tty.c 18 Jan 2010 09:04:53 -0000 1.328.2.4
+++ kern/tty.c 15 Nov 2010 03:21:46 -0000
@@ -781,7 +781,7 @@
bzero(data, sizeof(struct winsize));
break;
default:
- error = ENOTTY;
+ error = ttydevsw_ioctl(tp, cmd, data, td);
}
done: tty_unlock(tp);
@@ -905,6 +905,13 @@
panic("Terminal device freed without a free-handler");
}
+static int
+ttydevsw_defcioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
+{
+
+ return (ENOTTY);
+}
+
/*
* TTY allocation and deallocation. TTY devices can be deallocated when
* the driver doesn't use it anymore, when the TTY isn't a session's
@@ -938,6 +945,7 @@
PATCH_FUNC(mmap);
PATCH_FUNC(pktnotify);
PATCH_FUNC(free);
+ PATCH_FUNC(cioctl);
#undef PATCH_FUNC
tp = malloc(sizeof(struct tty), M_TTY, M_WAITOK|M_ZERO);
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list