summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/snp/snp.c11
-rw-r--r--sys/kern/tty_pts.c25
-rw-r--r--sys/kern/tty_ttydisc.c16
-rw-r--r--sys/sys/ttydisc.h1
4 files changed, 26 insertions, 27 deletions
diff --git a/sys/dev/snp/snp.c b/sys/dev/snp/snp.c
index fcc70a5..37d9965 100644
--- a/sys/dev/snp/snp.c
+++ b/sys/dev/snp/snp.c
@@ -192,7 +192,7 @@ snp_write(struct cdev *dev, struct uio *uio, int flag)
{
struct snp_softc *ss;
struct tty *tp;
- int error, len, i;
+ int error, len;
char in[SNP_INPUT_BUFSIZE];
error = devfs_get_cdevpriv((void **)&ss);
@@ -223,14 +223,9 @@ snp_write(struct cdev *dev, struct uio *uio, int flag)
* because we shouldn't bail out when we're running
* close to the watermarks.
*/
- if (ttydisc_can_bypass(tp)) {
- ttydisc_rint_bypass(tp, in, len);
- } else {
- for (i = 0; i < len; i++)
- ttydisc_rint(tp, in[i], 0);
- }
-
+ ttydisc_rint_simple(tp, in, len);
ttydisc_rint_done(tp);
+
tty_unlock(tp);
}
diff --git a/sys/kern/tty_pts.c b/sys/kern/tty_pts.c
index d5045c1..c77cf2a 100644
--- a/sys/kern/tty_pts.c
+++ b/sys/kern/tty_pts.c
@@ -215,25 +215,12 @@ ptsdev_write(struct file *fp, struct uio *uio, struct ucred *active_cred,
*/
MPASS(iblen > 0);
do {
- if (ttydisc_can_bypass(tp)) {
- /* Store data at once. */
- rintlen = ttydisc_rint_bypass(tp,
- ibstart, iblen);
- ibstart += rintlen;
- iblen -= rintlen;
-
- if (iblen == 0) {
- /* All data written. */
- break;
- }
- } else {
- error = ttydisc_rint(tp, *ibstart, 0);
- if (error == 0) {
- /* Character stored successfully. */
- ibstart++;
- iblen--;
- continue;
- }
+ rintlen = ttydisc_rint_simple(tp, ibstart, iblen);
+ ibstart += rintlen;
+ iblen -= rintlen;
+ if (iblen == 0) {
+ /* All data written. */
+ break;
}
/* Maybe the device isn't used anyway. */
diff --git a/sys/kern/tty_ttydisc.c b/sys/kern/tty_ttydisc.c
index debaa1c..d79a2b7 100644
--- a/sys/kern/tty_ttydisc.c
+++ b/sys/kern/tty_ttydisc.c
@@ -1045,6 +1045,22 @@ print:
}
size_t
+ttydisc_rint_simple(struct tty *tp, const void *buf, size_t len)
+{
+ const char *cbuf;
+
+ if (ttydisc_can_bypass(tp))
+ return (ttydisc_rint_bypass(tp, buf, len));
+
+ for (cbuf = buf; len-- > 0; cbuf++) {
+ if (ttydisc_rint(tp, *cbuf, 0) != 0)
+ break;
+ }
+
+ return (cbuf - (const char *)buf);
+}
+
+size_t
ttydisc_rint_bypass(struct tty *tp, const void *buf, size_t len)
{
size_t ret;
diff --git a/sys/sys/ttydisc.h b/sys/sys/ttydisc.h
index 2ea5466..74a1a0e 100644
--- a/sys/sys/ttydisc.h
+++ b/sys/sys/ttydisc.h
@@ -52,6 +52,7 @@ void ttydisc_optimize(struct tty *tp);
void ttydisc_modem(struct tty *tp, int open);
#define ttydisc_can_bypass(tp) ((tp)->t_flags & TF_BYPASS)
int ttydisc_rint(struct tty *tp, char c, int flags);
+size_t ttydisc_rint_simple(struct tty *tp, const void *buf, size_t len);
size_t ttydisc_rint_bypass(struct tty *tp, const void *buf, size_t len);
void ttydisc_rint_done(struct tty *tp);
size_t ttydisc_rint_poll(struct tty *tp);
OpenPOWER on IntegriCloud