--- a/toys/pending/dumpleases.c	2015-10-08 13:09:23.000000000 +0530
+++ b/toys/pending/dumpleases.c	2015-10-08 15:46:45.000000000 +0530
@@ -2,75 +2,109 @@
  *
  * Copyright 2013 Sandeep Sharma <sandeep.jack2756@gmail.com>
  * Copyright 2013 Kyungwan Han <asura321@gmail.com>
+ * Copyright 2014 Rajni Kant <rajnikant12345@gmail.com>
  *
 
-USE_DUMPLEASES(NEWTOY(dumpleases, ">0arf:[!ar]", TOYFLAG_USR|TOYFLAG_BIN))
+USE_DUMPLEASES(NEWTOY(dumpleases, ">0a(absolute)r(remaining)46f(file):[!ar][!46]", TOYFLAG_USR|TOYFLAG_BIN))
 
 config DUMPLEASES
   bool "dumpleases"
-  default n
+  default y
   help
-    usage: dumpleases [-r|-a] [-f LEASEFILE]
+    usage: dumpleases [-r|-a|-6|-4] [-f LEASEFILE]
 
     Display DHCP leases granted by udhcpd
-    -f FILE,  Lease file
-    -r        Show remaining time
-    -a        Show expiration time
+    -f FILE,  Lease file (--file)
+    -r        Show remaining time (--remaining)
+    -a        Show expiration time (--absolute)
+    -6        ipv6 lease
+    -4        ipv4 lease
 */
-
 #define FOR_dumpleases
 #include "toys.h"
 
 GLOBALS(
-    char *file;
+  char *file;
 )
 
-//lease structure
-struct lease { 
-  uint32_t expires;
-  uint32_t lease_nip;
+struct lease {
+  uint32_t expires, lease_nip;
   uint8_t lease_mac[6];
   char hostname[20];
   uint8_t pad[2]; //Padding
 };
+struct lease6 {
+  uint16_t duid_len, ia_type;
+  uint32_t expires, iaid, lease_nip6[4];
+  uint8_t duid[20];
+} ;
+
+int64_t written_time;
+uint32_t  current_time, expi;
+
+static void print_time()
+{
+  if (expi <= current_time) xputs("expired");
+  else if (!(toys.optflags & FLAG_a)) {
+    unsigned dt, hr, m;
+    unsigned expires = expi - current_time;
+
+    expires %= (24*60*60);
+    hr = expires / (60*60); expires %= (60*60);
+    m = expires / 60; expires %= 60;
+    if ((dt = expires / (24*60*60))) xprintf("%u days ", dt);
+    xprintf("%02u:%02u:%02u\n", hr, m, (unsigned)expires);
+  } else  fputs(ctime((const time_t*)&expi), stdout);
+}
+
 
 void dumpleases_main(void)
 {
   struct in_addr addr;
   struct lease lease_struct;
-  int64_t written_time , current_time, exp;
-  int i, fd; 
-  
-  if(!(toys.optflags & FLAG_f)) TT.file = "/var/lib/misc/dhcpd.leases"; //DEF_LEASE_FILE
+  int i=0, fd;
+
+  if (!(toys.optflags & FLAG_f)) {
+    if (toys.optflags & FLAG_6) TT.file = "/var/lib/misc/dhcpd6.leases"; //DEF_LEASE_FILE
+    else TT.file = "/var/lib/misc/udhcpd.leases"; //DEF_LEASE_FILE
+  }
   fd = xopen(TT.file, O_RDONLY);
-  xprintf("Mac Address       IP Address      Host Name           Expires %s\n", (toys.optflags & FLAG_a) ? "at" : "in");
   xread(fd, &written_time, sizeof(written_time));
   current_time = time(NULL);
   written_time = SWAP_BE64(written_time);
-  if(current_time < written_time) written_time = current_time;
 
-  while(sizeof(lease_struct) == 
-      (readall(fd, &lease_struct, sizeof(lease_struct)))) {
-    for (i = 0; i < 6; i++) printf(":%02x"+ !i, lease_struct.lease_mac[i]);
-    
-    addr.s_addr = lease_struct.lease_nip;
-    lease_struct.hostname[19] = '\0';
-    xprintf(" %-16s%-20s", inet_ntoa(addr), lease_struct.hostname );
-    exp = ntohl(lease_struct.expires) + written_time;
-    if (exp <= current_time) {
-      xputs("expired");
-      continue;
+  if (current_time < written_time) written_time = current_time;
+
+  if (toys.optflags & FLAG_6) {
+    struct lease6 dls6;
+
+    while (readall(fd, &dls6, sizeof(dls6)) == sizeof(dls6)) {
+      if(dls6.duid_len > sizeof(dls6.duid)) error_exit("Invalid lease file");
+      i = 0;
+      xprintf("DUID: ");
+      while (i++ < dls6.duid_len)
+        xprintf("%x", dls6.duid[i]);
+      xprintf("\nIATYPE: %d\nIAID: %x\n", dls6.ia_type, dls6.iaid);
+      xprintf("Address: %s\n",
+            inet_ntop(AF_INET6,(void*)dls6.lease_nip6,toybuf,INET6_ADDRSTRLEN));
+      xprintf("Expires %s: ", (toys.optflags & FLAG_a) ? "at" : "in");
+      expi = dls6.expires + written_time;
+      print_time();
+      xprintf("----------------------------------------------------------\n");
     }
-    if (!(toys.optflags & FLAG_a)) { 
-      unsigned dt, hr, m;
-      unsigned expires = exp - current_time;
-      dt = expires / (24*60*60); expires %= (24*60*60);
-      hr = expires / (60*60); expires %= (60*60);
-      m = expires / 60; expires %= 60;
-      if (dt) xprintf("%u days ", dt);
-      xprintf("%02u:%02u:%02u\n", hr, m, (unsigned)expires);
-    } else {
-      fputs(ctime((const time_t*)&exp), stdout);
+  } else {
+    xprintf("Mac Address       IP Address      Host Name           Expires %s\n",
+        (toys.optflags & FLAG_a) ? "at" : "in");
+
+    while (sizeof(lease_struct) ==
+      (readall(fd, &lease_struct, sizeof(lease_struct)))) {
+      for (i = 0; i < 6; i++) printf(":%02x"+ !i, lease_struct.lease_mac[i]);
+
+      addr.s_addr = lease_struct.lease_nip;
+      lease_struct.hostname[19] = '\0';
+      xprintf(" %-16s%-20s", inet_ntoa(addr), lease_struct.hostname );
+      expi = ntohl(lease_struct.expires) + written_time;
+      print_time();
     }
   }
   xclose(fd);
