$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 #include #include +#ifdef __NetBSD__ +# include /* malloc() */ +#endif #include #include #include @@ -24,6 +27,7 @@ #include #include #include +#include #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)){