xref: /aosp_15_r20/external/toybox/toys/pending/dumpleases.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
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