--- bpf.c.ORIG	Mon Aug 27 13:25:57 2001
+++ bpf.c	Fri Nov  9 10:47:22 2001
@@ -444,7 +444,8 @@
 	(d)->bd_hlen = (d)->bd_slen; \
 	(d)->bd_sbuf = (d)->bd_fbuf; \
 	(d)->bd_slen = 0; \
-	(d)->bd_fbuf = 0;
+	(d)->bd_fbuf = 0; \
+	(d)->bd_poll = 0;
 /*
  *  bpfread - read next chunk of packets from buffers
  */
@@ -472,7 +473,7 @@
 	 * have arrived to fill the store buffer.
 	 */
 	while (d->bd_hbuf == 0) {
-		if (d->bd_immediate && d->bd_slen != 0) {
+		if ((d->bd_immediate || d->bd_poll) && d->bd_slen != 0) {
 			/*
 			 * A packet(s) either arrived since the previous
 			 * read or arrived while we were asleep.
@@ -559,6 +560,7 @@
 		pgsigio(d->bd_sigio, d->bd_sig, 0);
 
 #if BSD >= 199103
+	/* revents |= events & (POLLIN | POLLRDNORM); ??? */
 	selwakeup(&d->bd_sel);
 	/* XXX */
 	d->bd_sel.si_pid = 0;
@@ -1057,10 +1059,12 @@
 
 	s = splimp();
 	if (events & (POLLIN | POLLRDNORM)) {
-		if (d->bd_hlen != 0 || (d->bd_immediate && d->bd_slen != 0))
+		if (d->bd_hlen != 0 || d->bd_poll || (d->bd_immediate && d->bd_slen != 0))
 			revents |= events & (POLLIN | POLLRDNORM);
-		else
+		else {
+			d->bd_poll = 1;
 			selrecord(p, &d->bd_sel);
+		}
 	}
 	splx(s);
 	return (revents);
@@ -1199,7 +1203,7 @@
 		bpf_wakeup(d);
 		curlen = 0;
 	}
-	else if (d->bd_immediate)
+	else if (d->bd_immediate || d->bd_poll)
 		/*
 		 * Immediate mode is set.  A packet arrived so any
 		 * reads should be woken up.
--- bpfdesc.h.ORIG	Mon Aug 27 13:26:06 2001
+++ bpfdesc.h	Fri Nov  9 10:47:25 2001
@@ -76,6 +76,7 @@
 	u_char		bd_promisc;	/* true if listening promiscuously */
 	u_char		bd_state;	/* idle, waiting, or timed out */
 	u_char		bd_immediate;	/* true to return on packet arrival */
+	u_char		bd_poll;	/* poll waiting for data */
 	int		bd_hdrcmplt;	/* false to fill in src lladdr automatically */
 	int		bd_seesent;	/* true if bpf should see sent packets */
 	int		bd_async;	/* non-zero if packet reception should generate signal */
