1 /* dumpleases.c - Dump the leases granted by udhcpd.
2  *
3  * Copyright 2013 Sandeep Sharma <sandeep.jack2756@gmail.com>
4  * Copyright 2013 Kyungwan Han <asura321@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 
dumpleases_main(void)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 = xopen(TT.file, O_RDONLY);
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