From owner-p4-projects@FreeBSD.ORG Thu Aug 21 19:08:29 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id B3D9F106567B; Thu, 21 Aug 2008 19:08:29 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7718D1065671 for ; Thu, 21 Aug 2008 19:08:29 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 6385D8FC1B for ; Thu, 21 Aug 2008 19:08:29 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.2/8.14.2) with ESMTP id m7LJ8TNA090340 for ; Thu, 21 Aug 2008 19:08:29 GMT (envelope-from ed@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.2/8.14.1/Submit) id m7LJ8TKr090338 for perforce@freebsd.org; Thu, 21 Aug 2008 19:08:29 GMT (envelope-from ed@FreeBSD.org) Date: Thu, 21 Aug 2008 19:08:29 GMT Message-Id: <200808211908.m7LJ8TKr090338@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to ed@FreeBSD.org using -f From: Ed Schouten To: Perforce Change Reviews Cc: Subject: PERFORCE change 148027 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 21 Aug 2008 19:08:30 -0000 http://perforce.freebsd.org/chv.cgi?CH=148027 Change 148027 by ed@ed_flippo on 2008/08/21 19:08:00 Already make snp(4) somewhat work. It still needs polishing to make things like select()/FIONREAD work. When that's done, snp(4) should almost be ready for usage. Affected files ... .. //depot/projects/mpsafetty/sys/dev/snp/snp.c#7 edit Differences ... ==== //depot/projects/mpsafetty/sys/dev/snp/snp.c#7 (text+ko) ==== @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -78,6 +79,7 @@ struct snp_softc { struct tty *snp_tty; /* (r) TTY we're snooping. */ struct ttyoutq snp_outq; /* (t) Output queue. */ + struct cv snp_outwait; /* (t) Output wait queue. */ }; static void @@ -98,6 +100,7 @@ ttyhook_unregister(tp); } + cv_destroy(&ss->snp_outwait); free(ss, M_SNP); } @@ -113,6 +116,7 @@ /* Allocate per-snoop data. */ ss = malloc(sizeof(struct snp_softc), M_SNP, M_WAITOK|M_ZERO); ttyoutq_init(&ss->snp_outq); + cv_init(&ss->snp_outwait, "snp out"); devfs_set_cdevpriv(ss, snp_dtor); @@ -122,8 +126,43 @@ static int snp_read(struct cdev *dev, struct uio *uio, int flag) { + int error, oresid = uio->uio_resid; + struct snp_softc *ss; + struct tty *tp; + + while (uio->uio_resid == 0) + return (0); - return (EIO); + error = devfs_get_cdevpriv((void **)&ss); + if (error != 0) + return (error); + + tp = ss->snp_tty; + if (tp == NULL || tty_gone(tp)) + return (EIO); + + tty_lock(tp); + for (;;) { + error = ttyoutq_read_uio(&ss->snp_outq, tp, uio); + if (error != 0 || uio->uio_resid != oresid) + break; + + /* Wait for more data. */ + if (flag & O_NONBLOCK) { + error = EWOULDBLOCK; + break; + } + error = cv_wait_sig(&ss->snp_outwait, tp->t_mtx); + if (error != 0) + break; + if (tty_gone(tp)) { + error = EIO; + break; + } + } + tty_unlock(tp); + + return (error); } static int @@ -139,7 +178,7 @@ return (error); tp = ss->snp_tty; - if (tp == NULL) + if (tp == NULL || tty_gone(tp)) return (EIO); while (uio->uio_resid > 0) { @@ -246,8 +285,8 @@ { struct snp_softc *ss = ttyhook_softc(tp); - printf("Added %zu bytes\n", len); ttyoutq_write(&ss->snp_outq, buf, len); + cv_broadcast(&ss->snp_outwait); } static moduledata_t snp_mod = {