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