You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
2.1 KiB

/* dumpleases.c - Dump the leases granted by udhcpd.
*
* Copyright 2013 Sandeep Sharma <sandeep.jack2756@gmail.com>
* Copyright 2013 Kyungwan Han <asura321@gmail.com>
*
USE_DUMPLEASES(NEWTOY(dumpleases, ">0arf:[!ar]", TOYFLAG_USR|TOYFLAG_BIN))
config DUMPLEASES
bool "dumpleases"
default n
help
usage: dumpleases [-r|-a] [-f LEASEFILE]
Display DHCP leases granted by udhcpd
-f FILE, Lease file
-r Show remaining time
-a Show expiration time
*/
#define FOR_dumpleases
#include "toys.h"
GLOBALS(
char *file;
)
//lease structure
struct lease {
uint32_t expires;
uint32_t lease_nip;
uint8_t lease_mac[6];
char hostname[20];
uint8_t pad[2]; //Padding
};
void dumpleases_main(void)
{
struct in_addr addr;
struct lease lease_struct;
int64_t written_time , current_time, exp;
int i, fd;
if(!(toys.optflags & FLAG_f)) TT.file = "/var/lib/misc/dhcpd.leases"; //DEF_LEASE_FILE
fd = xopenro(TT.file);
xprintf("Mac Address IP Address Host Name Expires %s\n", (toys.optflags & FLAG_a) ? "at" : "in");
xread(fd, &written_time, sizeof(written_time));
current_time = time(NULL);
written_time = SWAP_BE64(written_time);
if(current_time < written_time) written_time = current_time;
while(sizeof(lease_struct) ==
(readall(fd, &lease_struct, sizeof(lease_struct)))) {
for (i = 0; i < 6; i++) printf(":%02x"+ !i, lease_struct.lease_mac[i]);
addr.s_addr = lease_struct.lease_nip;
lease_struct.hostname[19] = '\0';
xprintf(" %-16s%-20s", inet_ntoa(addr), lease_struct.hostname );
exp = ntohl(lease_struct.expires) + written_time;
if (exp <= current_time) {
xputs("expired");
continue;
}
if (!(toys.optflags & FLAG_a)) {
unsigned dt, hr, m;
unsigned expires = exp - current_time;
dt = expires / (24*60*60); expires %= (24*60*60);
hr = expires / (60*60); expires %= (60*60);
m = expires / 60; expires %= 60;
if (dt) xprintf("%u days ", dt);
xprintf("%02u:%02u:%02u\n", hr, m, (unsigned)expires);
} else {
fputs(ctime((const time_t*)&exp), stdout);
}
}
xclose(fd);
}