$NetBSD: patch-ac,v 1.4 2000/10/03 01:29:19 hubertf Exp $

--- choparp.c.orig	Tue Oct  7 05:29:46 1997
+++ choparp.c
@@ -12,6 +12,9 @@
 #include <stdio.h>
 #include <unistd.h>
 #include <string.h>
+#ifdef __NetBSD__
+#  include <stdlib.h> /* malloc() */
+#endif
 #include <sys/types.h>
 #include <fcntl.h>
 #include <sys/time.h>
@@ -24,6 +27,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 +221,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)){