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
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);
|
|
}
|