]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Suck it hard and use gettimeofday for Linux. Lets just hope that the clock works...
authorRoy Marples <roy@marples.name>
Tue, 21 Aug 2007 09:50:01 +0000 (09:50 +0000)
committerRoy Marples <roy@marples.name>
Tue, 21 Aug 2007 09:50:01 +0000 (09:50 +0000)
ChangeLog
arp.c
common.c
common.h

index 6deeab2f92ab073f47d5ea4eef0f923e92eb9a35..29d009cbded675891ed43c8006223bc10945f5d1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,6 @@
 dhcpcd-3.1.5
 Fix the flushing of addresses on BSD systems.
-Rework the arp code again so that we don't link to librt on Linux.
+Rework get_time so that we don't link to librt on Linux.
 Thanks to regenrecht for reporting the below three overflows:-
  Fix a potential buffer overflow in hwaddr_ntoa if length > 42.
  Fix a potential heap overflow in decode_CSR when CIDR > 32.
diff --git a/arp.c b/arp.c
index 56c04e153ea799b8ff17d4983c11ed2f827fe251..405895efef47520a286acc0aeeb12ace1766b3ff 100644 (file)
--- a/arp.c
+++ b/arp.c
@@ -104,11 +104,6 @@ int arp_claim (interface_t *iface, struct in_addr address)
        int nclaims = 0;
        struct in_addr null_address;
 
-#ifdef HAVE_GET_TIME
-       struct timeval stopat;
-       struct timeval now;
-#endif
-
        if (! iface)
                return (-1);
 
@@ -135,6 +130,8 @@ int arp_claim (interface_t *iface, struct in_addr address)
                fd_set rset;
                int bytes;
                int s = 0;
+               struct timeval stopat;
+               struct timeval now;
 
                /* Only select if we have a timeout */
                if (timeout > 0) {
@@ -170,32 +167,21 @@ int arp_claim (interface_t *iface, struct in_addr address)
                                break;
                        }
 
-
-#ifdef HAVE_GET_TIME
                        /* Setup our stop time */
                        if (get_time (&stopat) != 0)
                                break;
                        stopat.tv_usec += timeout;
-#endif
 
                        continue;
                }
 
-               /* Check for ARP floods */
-#ifdef __linux__
-               /* Linux does modify the tv struct, otherwise we would have to link
-                * into librt to use get get_time function */
-               timeout = tv.tv_usec;
-               if (timeout <= 0)
-                       continue;
-#else
+               /* We maybe ARP flooded, so check our time */
                if (get_time (&now) != 0)
                        break;
                if (timercmp (&now, &stopat, >)) {
                        timeout = 0;
                        continue;
                }
-#endif
 
                if (! FD_ISSET (iface->fd, &rset))
                        continue;
index b0cdb4e789406887a5fec4f3ef848ad73f6ddae8..1c3951b29c650d04805c78feb7d45614ef2d5950 100644 (file)
--- a/common.c
+++ b/common.c
@@ -79,6 +79,8 @@ size_t strlcpy (char *dst, const char *src, size_t size)
 /* This requires us to link to rt on glibc, so we use sysinfo instead */
 #ifdef __linux__
 #include <sys/sysinfo.h>
+/* Avoid clock_gettime as it requires librt on Linux */
+#undef CLOCK_MONOTONIC
 long uptime (void)
 {
        struct sysinfo info;
@@ -86,7 +88,19 @@ long uptime (void)
        sysinfo (&info);
        return info.uptime;
 }
-#elif __APPLE__
+#elif CLOCK_MONOTONIC
+long uptime (void)
+{
+       struct timespec tp;
+
+       if (clock_gettime (CLOCK_MONOTONIC, &tp) == -1) {
+               logger (LOG_ERR, "clock_gettime: %s", strerror (errno));
+               return -1;
+       }
+
+       return tp.tv_sec;
+}
+#else
 /* Darwin doesn't appear to have an uptime, so try and make one ourselves */
 long uptime (void)
 {
@@ -103,27 +117,14 @@ long uptime (void)
 
        return tv.tv_sec - start;
 }
-#else
-long uptime (void)
-{
-       struct timespec tp;
-
-       if (clock_gettime (CLOCK_MONOTONIC, &tp) == -1) {
-               logger (LOG_ERR, "clock_gettime: %s", strerror (errno));
-               return -1;
-       }
-
-       return tp.tv_sec;
-}
 #endif
 
 /* Handy function to get the time.
  * We only care about time advancements, not the actual time itself
  * Which is why we use CLOCK_MONOTONIC, but it is not available on all
- * platforms
+ * platforms.
  */
-#ifdef HAVE_GET_TIME 
-# ifdef CLOCK_MONOTONIC
+#ifdef CLOCK_MONOTONIC 
 int get_time (struct timeval *tp)
 {
        struct timespec ts;
@@ -137,16 +138,15 @@ int get_time (struct timeval *tp)
        tp->tv_usec = ts.tv_nsec / 1000;
        return (0);
 }
-# else
+#else
 int get_time (struct timeval *tp)
 {
-       if (gettimeofday (&tp, NULL) == -1) {
+       if (gettimeofday (tp, NULL) == -1) {
                logger (LOG_ERR, "gettimeofday: %s", strerror (errno));
                return (-1);
        }
        return (0);
 }
-# endif
 #endif
 
 void *xmalloc (size_t s)
index b0a308df65b6d5c6173fc4bf5cfe744558cc49e1..79940997db0ad2166c9283eed377d30297b00b77 100644 (file)
--- a/common.h
+++ b/common.h
@@ -35,11 +35,9 @@ size_t strlcpy (char *dst, const char *src, size_t size);
 
 #ifdef __linux__
 void srandomdev (void);
-#else
-#define HAVE_GET_TIME
-int get_time (struct timeval *tp);
 #endif
 
+int get_time (struct timeval *tp);
 long uptime (void);
 void *xmalloc (size_t size);
 char *xstrdup (const char *str);