/* dumpleases.c - Dump the leases granted by udhcpd. * * Copyright 2013 Sandeep Sharma * Copyright 2013 Kyungwan Han * 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); }