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