49e04e9eb7
(it's interresting to see what's all accepted on some other archs...)
64 lines
1.5 KiB
Text
64 lines
1.5 KiB
Text
$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)){
|