kernel - Make pt's throw EOF on disconnect.
authorSamuel J. Greear <sjg@thesjg.com>
Sun, 1 Aug 2010 08:54:29 +0000 (08:54 +0000)
committerSamuel J. Greear <sjg@thesjg.com>
Sun, 1 Aug 2010 08:54:29 +0000 (08:54 +0000)
* Set TS_ZOMBIE when pts is closed (already set for ptc).

* Add TS_ZOMBIE filter checks which throw EOF.

* This fixes a problem with screen introduced with screen commit 33b7c9ca

Reported-by: YONETANI Tomokazu
sys/kern/tty_pty.c

index 0f2544f..5d03dc0 100644 (file)
@@ -320,7 +320,8 @@ ptsclose(struct dev_close_args *ap)
        tp = dev->si_tty;
        err = (*linesw[tp->t_line].l_close)(tp, ap->a_fflag);
        ptsstop(tp, FREAD|FWRITE);
-       (void) ttyclose(tp);
+       (void) ttyclose(tp); /* clears t_state */
+       tp->t_state |= TS_ZOMBIE;
 
 #ifdef UNIX98_PTYS
        /*
@@ -691,6 +692,11 @@ filt_ptcread (struct knote *kn, long hint)
        struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
        struct pt_ioctl *pti = ((cdev_t)kn->kn_hook)->si_drv1;
 
+       if (tp->t_state & TS_ZOMBIE) {
+               kn->kn_flags |= EV_EOF;
+               return (1);
+       }
+
        if ((tp->t_state & TS_ISOPEN) &&
            ((tp->t_outq.c_cc && (tp->t_state & TS_TTSTOP) == 0) ||
             ((pti->pt_flags & PF_PKT) && pti->pt_send) ||
@@ -708,6 +714,11 @@ filt_ptcwrite (struct knote *kn, long hint)
        struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
        struct pt_ioctl *pti = ((cdev_t)kn->kn_hook)->si_drv1;
 
+       if (tp->t_state & TS_ZOMBIE) {
+               kn->kn_flags |= EV_EOF;
+               return (1);
+       }
+
        if (tp->t_state & TS_ISOPEN &&
            ((pti->pt_flags & PF_REMOTE) ?
             (tp->t_canq.c_cc == 0) :