Date: Tue, 10 Apr 2012 15:58:23 +0000 (UTC) From: Marcel Moolenaar <marcel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r234102 - user/marcel/vtc.sys/dev/vtc Message-ID: <201204101558.q3AFwN04030495@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: marcel Date: Tue Apr 10 15:58:22 2012 New Revision: 234102 URL: http://svn.freebsd.org/changeset/base/234102 Log: In vtc_tty_outwakeup: get 80 characters at a time and loop until we drained the outq. In vtc_tty_ioctl: return ENOIOCTL by default to have the generic TTY code handle the request. In vtc_tty_param: set CLOCAL so that the TTY isn't trying to wait for DCD. Modified: user/marcel/vtc.sys/dev/vtc/vtc_core.c Modified: user/marcel/vtc.sys/dev/vtc/vtc_core.c ============================================================================== --- user/marcel/vtc.sys/dev/vtc/vtc_core.c Tue Apr 10 15:29:28 2012 (r234101) +++ user/marcel/vtc.sys/dev/vtc/vtc_core.c Tue Apr 10 15:58:22 2012 (r234102) @@ -84,7 +84,7 @@ vtc_tty_close(struct tty *tp) static void vtc_tty_outwakeup(struct tty *tp) { - char txbuf[4]; + char txbuf[80]; struct vtc_te_softc *te; __wchar_t utf32; size_t nchars, bufidx; @@ -94,47 +94,51 @@ vtc_tty_outwakeup(struct tty *tp) if (te == NULL) return; - bufidx = 0; - nchars = ttydisc_getc(tp, txbuf, sizeof(txbuf)); utf32 = te->te_utf32; utfbytes = te->te_utfbytes; - while (bufidx < nchars) { - c = txbuf[bufidx++]; - /* - * Conditionalize on the two major character types: - * initial and followup characters. - */ - if ((c & 0xc0) != 0x80) { - /* Initial characters. */ - if (utfbytes != 0) - VTC_TE_WRITE(te, -1); - if ((c & 0xf8) == 0xf0) { - utf32 = c & 0x07; - utfbytes = 3; - } else if ((c & 0xf0) == 0xe0) { - utf32 = c & 0x0f; - utfbytes = 2; - } else if ((c & 0xe0) == 0xc0) { - utf32 = c & 0x1f; - utfbytes = 1; + + nchars = ttydisc_getc(tp, txbuf, sizeof(txbuf)); + while (nchars > 0) { + bufidx = 0; + while (bufidx < nchars) { + c = txbuf[bufidx++]; + /* + * Conditionalize on the two major character types: + * initial and followup characters. + */ + if ((c & 0xc0) != 0x80) { + /* Initial characters. */ + if (utfbytes != 0) + VTC_TE_WRITE(te, -1); + if ((c & 0xf8) == 0xf0) { + utf32 = c & 0x07; + utfbytes = 3; + } else if ((c & 0xf0) == 0xe0) { + utf32 = c & 0x0f; + utfbytes = 2; + } else if ((c & 0xe0) == 0xc0) { + utf32 = c & 0x1f; + utfbytes = 1; + } else { + KASSERT((c & 0x80) == 0x00, ("oops")); + utf32 = c & 0x7f; + utfbytes = 0; + } } else { - KASSERT((c & 0x80) == 0x00, ("oops")); - utf32 = c & 0x7f; - utfbytes = 0; + /* Followup characters. */ + KASSERT((c & 0xc0) == 0x80, ("oops")); + if (utfbytes > 0) { + utf32 = (utf32 << 6) + (c & 0x3f); + utfbytes--; + } else if (utfbytes == 0) + utfbytes = -1; } - } else { - /* Followup characters. */ - KASSERT((c & 0xc0) == 0x80, ("oops")); - if (utfbytes > 0) { - utf32 = (utf32 << 6) + (c & 0x3f); - utfbytes--; - } - else if (utfbytes == 0) - utfbytes = -1; + if (utfbytes == 0) + VTC_TE_WRITE(te, utf32); } - if (utfbytes == 0) - VTC_TE_WRITE(te, utf32); + nchars = ttydisc_getc(tp, txbuf, sizeof(txbuf)); } + te->te_utf32 = utf32; te->te_utfbytes = utfbytes; } @@ -158,7 +162,7 @@ vtc_tty_ioctl(struct tty *tp, u_long cmd if (te == NULL) return (ENXIO); - return (ENOTTY); + return (ENOIOCTL); } static int @@ -170,6 +174,7 @@ vtc_tty_param(struct tty *tp, struct ter if (te == NULL) return (ENODEV); + t->c_cflag |= CLOCAL; return (0); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201204101558.q3AFwN04030495>