1#include <fcntl.h> 2#include <string.h> 3#include <stdlib.h> 4#include <stdio.h> 5#include <sys/wait.h> 6#include <sys/stat.h> 7#include <arpa/inet.h> 8#include <netdb.h> 9#include <netinet/in.h> 10#include <stdio.h> 11#include <sys/types.h> 12#include <sys/socket.h> 13#include <unistd.h> 14#include <syslog.h> 15#include <signal.h> 16#include <errno.h> 17#include <getopt.h> 18#include <time.h> 19 20#include "libbb_udhcp.h" 21 22#define REMAINING 0 23#define ABSOLUTE 1 24 25struct lease_t { 26 unsigned char chaddr[16]; 27 u_int32_t yiaddr; 28 u_int32_t expires; 29 char hostname[64]; 30}; 31 32#ifdef BB_VER 33int dumpleases_main(int argc, char *argv[]) 34#else 35int main(int argc, char *argv[]) 36#endif 37{ 38 FILE *fp; 39 int i, c, mode = REMAINING; 40 long expires; 41 char file[255] = "/var/lib/misc/udhcpd.leases"; 42 struct lease_t lease; 43 struct in_addr addr; 44 45 static struct option options[] = { 46 {"absolute", 0, 0, 'a'}, 47 {"remaining", 0, 0, 'r'}, 48 {"file", 1, 0, 'f'}, 49 {"help", 0, 0, 'h'}, 50 {0, 0, 0, 0} 51 }; 52 53 while (1) { 54 int option_index = 0; 55 c = getopt_long(argc, argv, "arf:h", options, &option_index); 56 if (c == -1) break; 57 58 switch (c) { 59 case 'a': mode = ABSOLUTE; break; 60 case 'r': mode = REMAINING; break; 61 case 'f': 62 strncpy(file, optarg, 255); 63 file[254] = '\0'; 64 break; 65 case 'h': 66 printf("Usage: dumpleases -f <file> -[r|a]\n\n"); 67 printf(" -f, --file=FILENAME Leases file to load\n"); 68 printf(" -r, --remaining Interepret lease times as time remaing\n"); 69 printf(" -a, --absolute Interepret lease times as expire time\n"); 70 break; 71 } 72 } 73 74 if (!(fp = fopen(file, "r"))) { 75 perror("could not open input file"); 76 return 0; 77 } 78 79 printf("Hostname Mac Address IP-Address Expires %s\n", mode == REMAINING ? "in" : "at"); 80 /* "0123456789abcdef 00:00:00:00:00:00 255.255.255.255 Wed Jun 30 21:49:08 1993" */ 81 while (fread(&lease, sizeof(lease), 1, fp)) { 82 83 printf("%-16s ", lease.hostname); 84 for (i = 0; i < 6; i++) { 85 printf("%02x", lease.chaddr[i]); 86 if (i != 5) printf(":"); 87 } 88 addr.s_addr = lease.yiaddr; 89 printf(" %-15s", inet_ntoa(addr)); 90 expires = ntohl(lease.expires); 91 printf(" "); 92 if (mode == REMAINING) { 93 if (!expires) printf("expired\n"); 94 else { 95 if (expires > 60*60*24) { 96 printf("%ld days, ", expires / (60*60*24)); 97 expires %= 60*60*24; 98 } 99 if (expires > 60*60) { 100 printf("%ld hours, ", expires / (60*60)); 101 expires %= 60*60; 102 } 103 if (expires > 60) { 104 printf("%ld minutes, ", expires / 60); 105 expires %= 60; 106 } 107 printf("%ld seconds\n", expires); 108 } 109 } else printf("%s", ctime(&expires)); 110 } 111 fclose(fp); 112 113 return 0; 114} 115