$NetBSD: patch-ac,v 1.3 1999/09/12 20:12:19 dbj Exp $

--- choparp.c.orig	Tue Oct  7 05:29:46 1997
+++ choparp.c	Sun Sep 12 15:58:41 1999
@@ -24,6 +24,7 @@
 #include <netinet/if_ether.h>
 #include <sys/param.h>
 #include <errno.h>
+#include <assert.h>
 
 #define	BPFFILENAME	"/dev/bpf%d"	/* bpf file template */
 #ifndef	NBPFILTER			/* number of available bpf */
@@ -217,20 +218,35 @@
 
 void
 loop(int fd, char *buf, size_t buflen){
-    size_t  rlen;
+    ssize_t  rlen;
     char    *p, *nextp;
     size_t  nextlen;
     char    *rframe;
     size_t  rframe_len;
     char    *sframe;
     size_t  sframe_len;
+    fd_set fdset;
+
+    FD_ZERO(&fdset);
+    FD_SET(fd,&fdset);
 
     for(;;){
-	if ((rlen = read(fd, buf, buflen)) <= 0){
-	    fprintf(stderr,"loop: read: %s\n", strerror(errno));
-	    /* XXX: restart itself if daemon mode */
-	    return;
-	}
+      int r;
+      r = select(fd+1,&fdset, 0, 0, 0);
+      if ((r < 0) && (errno == EINTR)) continue;
+      if (r < 0) {
+	perror("select");
+	return;
+      }
+      assert(r == 1);
+
+      rlen = read(fd, buf, buflen);
+      if ((rlen < 0) && (errno = EINTR)) continue;
+      if (rlen < 0) {
+	perror("loop: read");
+	return;
+      }
+
 	p = buf;
 	while((rframe = getarp(p, rlen, &nextp, &nextlen)) != NULL){
 	    if (checkarp(rframe)){
