Home | History | Annotate | Download | only in pending
      1 /* dumpleases.c - Dump the leases granted by udhcpd.
      2  *
      3  * Copyright 2013 Sandeep Sharma <sandeep.jack2756 (at) gmail.com>
      4  * Copyright 2013 Kyungwan Han <asura321 (at) gmail.com>
      5  *
      6 
      7 USE_DUMPLEASES(NEWTOY(dumpleases, ">0arf:[!ar]", TOYFLAG_USR|TOYFLAG_BIN))
      8 
      9 config DUMPLEASES
     10   bool "dumpleases"
     11   default n
     12   help
     13     usage: dumpleases [-r|-a] [-f LEASEFILE]
     14 
     15     Display DHCP leases granted by udhcpd
     16     -f FILE,  Lease file
     17     -r        Show remaining time
     18     -a        Show expiration time
     19 */
     20 
     21 #define FOR_dumpleases
     22 #include "toys.h"
     23 
     24 GLOBALS(
     25     char *file;
     26 )
     27 
     28 //lease structure
     29 struct lease {
     30   uint32_t expires;
     31   uint32_t lease_nip;
     32   uint8_t lease_mac[6];
     33   char hostname[20];
     34   uint8_t pad[2]; //Padding
     35 };
     36 
     37 void dumpleases_main(void)
     38 {
     39   struct in_addr addr;
     40   struct lease lease_struct;
     41   int64_t written_time , current_time, exp;
     42   int i, fd;
     43 
     44   if(!(toys.optflags & FLAG_f)) TT.file = "/var/lib/misc/dhcpd.leases"; //DEF_LEASE_FILE
     45   fd = xopenro(TT.file);
     46   xprintf("Mac Address       IP Address      Host Name           Expires %s\n", (toys.optflags & FLAG_a) ? "at" : "in");
     47   xread(fd, &written_time, sizeof(written_time));
     48   current_time = time(NULL);
     49   written_time = SWAP_BE64(written_time);
     50   if(current_time < written_time) written_time = current_time;
     51 
     52   while(sizeof(lease_struct) ==
     53       (readall(fd, &lease_struct, sizeof(lease_struct)))) {
     54     for (i = 0; i < 6; i++) printf(":%02x"+ !i, lease_struct.lease_mac[i]);
     55 
     56     addr.s_addr = lease_struct.lease_nip;
     57     lease_struct.hostname[19] = '\0';
     58     xprintf(" %-16s%-20s", inet_ntoa(addr), lease_struct.hostname );
     59     exp = ntohl(lease_struct.expires) + written_time;
     60     if (exp <= current_time) {
     61       xputs("expired");
     62       continue;
     63     }
     64     if (!(toys.optflags & FLAG_a)) {
     65       unsigned dt, hr, m;
     66       unsigned expires = exp - current_time;
     67       dt = expires / (24*60*60); expires %= (24*60*60);
     68       hr = expires / (60*60); expires %= (60*60);
     69       m = expires / 60; expires %= 60;
     70       if (dt) xprintf("%u days ", dt);
     71       xprintf("%02u:%02u:%02u\n", hr, m, (unsigned)expires);
     72     } else {
     73       fputs(ctime((const time_t*)&exp), stdout);
     74     }
     75   }
     76   xclose(fd);
     77 }
     78