ftpd: fix command fetching to not do it in 1-byte reads;
[oweals/busybox.git] / networking / udhcp / dumpleases.c
index 3e193903d081baf0356b9d65f31d90dce42c490c..c0d515d283d7cff0259cf6533fd36cac4a002ff5 100644 (file)
@@ -6,13 +6,24 @@
 #include "common.h"
 #include "dhcpd.h"
 
+#if BB_LITTLE_ENDIAN
+static inline uint64_t hton64(uint64_t v)
+{
+        return (((uint64_t)htonl(v)) << 32) | htonl(v >> 32);
+}
+#else
+#define hton64(v) (v)
+#endif
+#define ntoh64(v) hton64(v)
+
+
 int dumpleases_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int dumpleases_main(int argc UNUSED_PARAM, char **argv)
 {
        int fd;
        int i;
        unsigned opt;
-       time_t expires;
+       int64_t written_at, curr, expires_abs;
        const char *file = LEASES_FILE;
        struct dhcpOfferedAddr lease;
        struct in_addr addr;
@@ -38,27 +49,40 @@ int dumpleases_main(int argc UNUSED_PARAM, char **argv)
 
        printf("Mac Address       IP-Address      Expires %s\n", (opt & OPT_a) ? "at" : "in");
        /*     "00:00:00:00:00:00 255.255.255.255 Wed Jun 30 21:49:08 1993" */
+
+       if (full_read(fd, &written_at, sizeof(written_at)) != sizeof(written_at))
+               return 0;
+       written_at = ntoh64(written_at);
+       curr = time(NULL);
+       if (curr < written_at)
+               written_at = curr; /* lease file from future! :) */
+
        while (full_read(fd, &lease, sizeof(lease)) == sizeof(lease)) {
-               printf(":%02x"+1, lease.chaddr[0]);
-               for (i = 1; i < 6; i++) {
-                       printf(":%02x", lease.chaddr[i]);
+               const char *fmt = ":%02x" + 1;
+               for (i = 0; i < 6; i++) {
+                       printf(fmt, lease.chaddr[i]);
+                       fmt = ":%02x";
                }
                addr.s_addr = lease.yiaddr;
                printf(" %-15s ", inet_ntoa(addr));
-               expires = ntohl(lease.expires);
+               expires_abs = ntohl(lease.expires) + written_at;
+               if (expires_abs <= curr) {
+                       puts("expired");
+                       continue;
+               }
                if (!(opt & OPT_a)) { /* no -a */
-                       if (!expires)
-                               puts("expired");
-                       else {
-                               unsigned d, h, m;
-                               d = expires / (24*60*60); expires %= (24*60*60);
-                               h = expires / (60*60); expires %= (60*60);
-                               m = expires / 60; expires %= 60;
-                               if (d) printf("%u days ", d);
-                               printf("%02u:%02u:%02u\n", h, m, (unsigned)expires);
-                       }
-               } else /* -a */
-                       fputs(ctime(&expires), stdout);
+                       unsigned d, h, m;
+                       unsigned expires = expires_abs - curr;
+                       d = expires / (24*60*60); expires %= (24*60*60);
+                       h = expires / (60*60); expires %= (60*60);
+                       m = expires / 60; expires %= 60;
+                       if (d)
+                               printf("%u days ", d);
+                       printf("%02u:%02u:%02u\n", h, m, (unsigned)expires);
+               } else { /* -a */
+                       time_t t = expires_abs;
+                       fputs(ctime(&t), stdout);
+               }
        }
        /* close(fd); */