/* dumpleases.c - Dump the leases granted by udhcpd.
 *
 * Copyright 2013 Sandeep Sharma <sandeep.jack2756@gmail.com>
 * Copyright 2013 Kyungwan Han <asura321@gmail.com>
 *

USE_DUMPLEASES(NEWTOY(dumpleases, ">0arf:[!ar]", TOYFLAG_USR|TOYFLAG_BIN))

config DUMPLEASES
  bool "dumpleases"
  default n
  help
    usage: dumpleases [-r|-a] [-f LEASEFILE]

    Display DHCP leases granted by udhcpd
    -f FILE,  Lease file
    -r        Show remaining time
    -a        Show expiration time
*/

#define FOR_dumpleases
#include "toys.h"

GLOBALS(
    char *file;
)

//lease structure
struct lease { 
  uint32_t expires;
  uint32_t lease_nip;
  uint8_t lease_mac[6];
  char hostname[20];
  uint8_t pad[2]; //Padding
};

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
  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 (!(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);
    }
  }
  xclose(fd);
}
