pkgsrc/net/choparp/patches/patch-ac
hubertf 49e04e9eb7 Make this go on alpha, by pulling in the right headers
(it's interresting to see what's all accepted on some other archs...)
2000-10-03 01:29:19 +00:00

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)){