| 522 | } |
| 523 | |
| 524 | static int |
| 525 | ttydev_write(struct cdev *dev, struct uio *uio, int ioflag) |
| 526 | { |
| 527 | struct tty *tp = dev->si_drv1; |
| 528 | int error; |
| 529 | |
| 530 | error = ttydev_enter(tp); |
| 531 | if (error) |
| 532 | return (error); |
| 533 | |
| 534 | if (tp->t_termios.c_lflag & TOSTOP) { |
| 535 | error = tty_wait_background(tp, curthread, SIGTTOU); |
| 536 | if (error) |
| 537 | goto done; |
| 538 | } |
| 539 | |
| 540 | if (ioflag & IO_NDELAY && tp->t_flags & TF_BUSY_OUT) { |
| 541 | /* Allow non-blocking writes to bypass serialization. */ |
| 542 | error = ttydisc_write(tp, uio, ioflag); |
| 543 | } else { |
| 544 | /* Serialize write() calls. */ |
| 545 | while (tp->t_flags & TF_BUSY_OUT) { |
| 546 | error = tty_wait(tp, &tp->t_outserwait); |
| 547 | if (error) |
| 548 | goto done; |
| 549 | } |
| 550 | |
| 551 | tp->t_flags |= TF_BUSY_OUT; |
| 552 | error = ttydisc_write(tp, uio, ioflag); |
| 553 | tp->t_flags &= ~TF_BUSY_OUT; |
| 554 | cv_signal(&tp->t_outserwait); |
| 555 | } |
| 556 | |
| 557 | done: tty_unlock(tp); |
| 558 | return (error); |
| 559 | } |
| 560 | |
| 561 | static int |
| 562 | ttydev_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, |
no test coverage detected