PERFORCE change 150152 for review
Ed Schouten
ed at FreeBSD.org
Sat Sep 20 08:28:38 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=150152
Change 150152 by ed at ed_dull on 2008/09/20 08:27:37
Add additional TTY hooks, so we can get all the line disciplines
working again.
Requested by: thompsa
Affected files ...
.. //depot/projects/mpsafetty/sys/kern/tty_ttydisc.c#22 edit
.. //depot/projects/mpsafetty/sys/sys/ttydisc.h#8 edit
.. //depot/projects/mpsafetty/sys/sys/ttyhook.h#6 edit
Differences ...
==== //depot/projects/mpsafetty/sys/kern/tty_ttydisc.c#22 (text+ko) ====
@@ -102,6 +102,9 @@
ttydevsw_inwakeup(tp);
ttydevsw_outwakeup(tp);
}
+
+ if (ttyhook_hashook(tp, close))
+ ttyhook_close(tp);
}
static int
@@ -820,6 +823,9 @@
tty_lock_assert(tp, MA_OWNED);
atomic_add_long(&tty_nin, 1);
+
+ if (ttyhook_hashook(tp, rint))
+ return ttyhook_rint(tp, c, flags);
if (tp->t_flags & TF_BYPASS)
goto processed;
@@ -1037,7 +1043,7 @@
}
size_t
-ttydisc_rint_bypass(struct tty *tp, char *buf, size_t len)
+ttydisc_rint_bypass(struct tty *tp, const void *buf, size_t len)
{
size_t ret;
@@ -1047,6 +1053,9 @@
atomic_add_long(&tty_nin, len);
+ if (ttyhook_hashook(tp, rint_bypass))
+ return ttyhook_rint_bypass(tp, buf, len);
+
ret = ttyinq_write(&tp->t_inq, buf, len, 0);
ttyinq_canonicalize(&tp->t_inq);
@@ -1065,6 +1074,29 @@
ttydevsw_outwakeup(tp);
}
+size_t
+ttydisc_rint_poll(struct tty *tp)
+{
+ size_t l;
+
+ tty_lock_assert(tp, MA_OWNED);
+
+ if (ttyhook_hashook(tp, rint_poll))
+ return ttyhook_rint_poll(tp);
+
+ /*
+ * XXX: Still allow character input when there's no space in the
+ * buffers, but we haven't entered the high watermark. This is
+ * to allow backspace characters to be inserted when in
+ * canonical mode.
+ */
+ l = ttyinq_bytesleft(&tp->t_inq);
+ if (l == 0 && (tp->t_flags & TF_HIWAT_IN) == 0)
+ return (1);
+
+ return (l);
+}
+
static void
ttydisc_wakeup_watermark(struct tty *tp)
{
@@ -1095,6 +1127,9 @@
if (tp->t_flags & TF_STOPPED)
return (0);
+ if (ttyhook_hashook(tp, getc_inject))
+ return ttyhook_getc_inject(tp, buf, len);
+
len = ttyoutq_read(&tp->t_outq, buf, len);
if (ttyhook_hashook(tp, getc_capture))
@@ -1124,7 +1159,8 @@
* copying to userspace. Just call ttydisc_getc() and
* temporarily store data in a shadow buffer.
*/
- if (ttyhook_hashook(tp, getc_capture)) {
+ if (ttyhook_hashook(tp, getc_capture) ||
+ ttyhook_hashook(tp, getc_inject)) {
while (uio->uio_resid > 0) {
/* Read to shadow buffer. */
len = ttydisc_getc(tp, buf,
@@ -1150,6 +1186,21 @@
return (error);
}
+size_t
+ttydisc_getc_poll(struct tty *tp)
+{
+
+ tty_lock_assert(tp, MA_OWNED);
+
+ if (tp->t_flags & TF_STOPPED)
+ return (0);
+
+ if (ttyhook_hashook(tp, getc_poll))
+ return ttyhook_getc_poll(tp);
+
+ return ttyoutq_bytesused(&tp->t_outq);
+}
+
/*
* XXX: not really related to the TTYDISC, but we'd better put
* tty_putchar() here, because we need to perform proper output
==== //depot/projects/mpsafetty/sys/sys/ttydisc.h#8 (text+ko) ====
@@ -52,10 +52,12 @@
void ttydisc_modem(struct tty *, int);
#define ttydisc_can_bypass(tp) ((tp)->t_flags & TF_BYPASS)
int ttydisc_rint(struct tty *, char, int);
-size_t ttydisc_rint_bypass(struct tty *, char *, size_t);
+size_t ttydisc_rint_bypass(struct tty *, const void *, size_t);
void ttydisc_rint_done(struct tty *);
+size_t ttydisc_rint_poll(struct tty *);
size_t ttydisc_getc(struct tty *, void *, size_t);
int ttydisc_getc_uio(struct tty *, struct uio *);
+size_t ttydisc_getc_poll(struct tty *);
/* Error codes for ttydisc_rint(). */
#define TRE_FRAMING 0x01
@@ -81,36 +83,4 @@
return ttyoutq_bytesleft(&tp->t_outq);
}
-static __inline size_t
-ttydisc_rint_poll(struct tty *tp)
-{
- size_t l;
-
- tty_lock_assert(tp, MA_OWNED);
-
- /*
- * XXX: Still allow character input when there's no space in the
- * buffers, but we haven't entered the high watermark. This is
- * to allow backspace characters to be inserted when in
- * canonical mode.
- */
- l = ttyinq_bytesleft(&tp->t_inq);
- if (l == 0 && (tp->t_flags & TF_HIWAT_IN) == 0)
- return (1);
-
- return (l);
-}
-
-static __inline size_t
-ttydisc_getc_poll(struct tty *tp)
-{
-
- tty_lock_assert(tp, MA_OWNED);
-
- if (tp->t_flags & TF_STOPPED)
- return (0);
-
- return ttyoutq_bytesused(&tp->t_outq);
-}
-
#endif /* !_SYS_TTYDISC_H_ */
==== //depot/projects/mpsafetty/sys/sys/ttyhook.h#6 (text+ko) ====
@@ -39,10 +39,29 @@
* Hooks interface, which allows to capture and inject traffic into the
* input and output paths of a TTY.
*/
+
+typedef int th_rint_t(struct tty *, char, int);
+typedef size_t th_rint_bypass_t(struct tty *, const void *, size_t);
+typedef size_t th_rint_poll_t(struct tty *);
+
+typedef size_t th_getc_inject_t(struct tty *, void *, size_t);
typedef void th_getc_capture_t(struct tty *, const void *, size_t);
+typedef size_t th_getc_poll_t(struct tty *);
+
+typedef void th_close_t(struct tty *);
struct ttyhook {
+ /* Character input. */
+ th_rint_t *th_rint;
+ th_rint_bypass_t *th_rint_bypass;
+ th_rint_poll_t *th_rint_poll;
+
+ /* Character output. */
+ th_getc_inject_t *th_getc_inject;
th_getc_capture_t *th_getc_capture;
+ th_getc_poll_t *th_getc_poll;
+
+ th_close_t *th_close;
};
int ttyhook_register(struct tty **, struct thread *, int,
@@ -52,6 +71,42 @@
#define ttyhook_hashook(tp,hook) ((tp)->t_hook != NULL && \
(tp)->t_hook->th_ ## hook != NULL)
+static __inline int
+ttyhook_rint(struct tty *tp, char c, int flags)
+{
+ tty_lock_assert(tp, MA_OWNED);
+ MPASS(!tty_gone(tp));
+
+ return tp->t_hook->th_rint(tp, c, flags);
+}
+
+static __inline size_t
+ttyhook_rint_bypass(struct tty *tp, const void *buf, size_t len)
+{
+ tty_lock_assert(tp, MA_OWNED);
+ MPASS(!tty_gone(tp));
+
+ return tp->t_hook->th_rint_bypass(tp, buf, len);
+}
+
+static __inline size_t
+ttyhook_rint_poll(struct tty *tp)
+{
+ tty_lock_assert(tp, MA_OWNED);
+ MPASS(!tty_gone(tp));
+
+ return tp->t_hook->th_rint_poll(tp);
+}
+
+static __inline size_t
+ttyhook_getc_inject(struct tty *tp, void *buf, size_t len)
+{
+ tty_lock_assert(tp, MA_OWNED);
+ MPASS(!tty_gone(tp));
+
+ return tp->t_hook->th_getc_inject(tp, buf, len);
+}
+
static __inline void
ttyhook_getc_capture(struct tty *tp, const void *buf, size_t len)
{
@@ -61,4 +116,21 @@
tp->t_hook->th_getc_capture(tp, buf, len);
}
+static __inline size_t
+ttyhook_getc_poll(struct tty *tp)
+{
+ tty_lock_assert(tp, MA_OWNED);
+ MPASS(!tty_gone(tp));
+
+ return tp->t_hook->th_getc_poll(tp);
+}
+
+static __inline void
+ttyhook_close(struct tty *tp)
+{
+ tty_lock_assert(tp, MA_OWNED);
+
+ tp->t_hook->th_close(tp);
+}
+
#endif /* !_SYS_TTYHOOK_H_ */
More information about the p4-projects
mailing list