Index: arp.c =================================================================== --- arp.c (revision 255) +++ arp.c (working copy) @@ -105,6 +105,8 @@ int nprobes = 0; int nclaims = 0; struct in_addr null_address; + struct timeval stopat; + struct timeval now; if (! iface->arpable) { logger (LOG_DEBUG, "interface `%s' is not ARPable", iface->name); @@ -159,8 +161,21 @@ retval = 0; break; } + + /* Setup our stop time */ + if (get_time (&stopat) != 0) + break; + stopat.tv_usec += timeout; } - + + /* We maybe ARP flooded, so check our time */ + if (get_time (&now) != 0) + break; + if (timercmp (&now, &stopat, >)) { + timeout = 0; + continue; + } + if (! FD_ISSET (iface->fd, &rset)) continue; Index: Makefile =================================================================== --- Makefile (revision 264) +++ Makefile (working copy) @@ -1,4 +1,4 @@ -VERSION = 3.1.3 +VERSION = 3.1.4_pre1 CFLAGS ?= -O2 -pipe # Should work for both GNU make and BSD make @@ -49,12 +49,16 @@ dhcpcd_OBJS = arp.o client.o common.o configure.o dhcp.o dhcpcd.o duid.o \ info.o interface.o ipv4ll.o logger.o signals.o socket.o -# By default we don't need to link to anything -# Except on Darwin where we need -lresolv, so they need to uncomment this -#dhcpcd_LIBS = -lresolv +# These are nasty hacks to work out what libs we need to link to +# We require librt for glibc bases systems +_LIBRT != ldd /bin/date 2>/dev/null | grep -q /librt.so && echo "-lrt" || exit 0 +LIBRT ?= $(_LIBRT) $(shell ldd /bin/date 2>/dev/null | grep -q /librt.so && echo "-lrt") +# Darwin needs this, but we have no way of detecting this atm +#LIRESOLV = -lresolv + dhcpcd: $(dhcpcd_H) $(dhcpcd_OBJS) - $(CC) $(LDFLAGS) $(dhcpcd_OBJS) $(dhcpcd_LIBS) -o dhcpcd + $(CC) $(LDFLAGS) $(dhcpcd_OBJS) $(LIBRT) $(LIBRESOLV) -o dhcpcd version.h: echo '#define VERSION "$(VERSION)"' > version.h Index: common.c =================================================================== --- common.c (revision 254) +++ common.c (working copy) @@ -76,17 +76,22 @@ # endif #endif -/* This requires us to link to rt on glibc, so we use sysinfo instead */ -#ifdef __linux__ -#include -long uptime (void) +/* Handy function to get the time. */ +int get_time(struct timeval *tp) { - struct sysinfo info; + struct timespec ts; - sysinfo (&info); - return info.uptime; + if (clock_gettime (CLOCK_MONOTONIC, &ts) == -1) { + logger (LOG_ERR, "clock_gettime: %s", strerror (errno)); + return (-1); + } + + tp->tv_sec = ts.tv_sec; + tp->tv_usec = ts.tv_nsec / 1000; + return (0); } -#elif __APPLE__ + +#ifdef __APPLE__ /* Darwin doesn't appear to have an uptime, so try and make one ourselves */ long uptime (void) { Index: common.h =================================================================== --- common.h (revision 244) +++ common.h (working copy) @@ -23,6 +23,7 @@ #define COMMON_H /* string.h pulls in features.h so the below define checks work */ +#include #include /* Only GLIBC doesn't support strlcpy */ @@ -36,6 +37,7 @@ void srandomdev (void); #endif +int get_time(struct timeval *tp); long uptime (void); void *xmalloc (size_t size); char *xstrdup (const char *str);