added a select call so read doesn't fail with EWOULDBLOCK

assign to result of the read to an ssize_t instead of size_t
This commit is contained in:
dbj 1999-09-12 20:12:19 +00:00
parent 742ac3df44
commit 6c1c9c79da

View file

@ -0,0 +1,54 @@
$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)){