dumpleases.c 2.1 KB

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