source: MondoRescue/branches/3.3/mindi-busybox/networking/udhcp/dumpleases.c@ 3803

Last change on this file since 3803 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

File size: 3.3 KB
Line 
1/* vi: set sw=4 ts=4: */
2/*
3 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
4 */
5
6//usage:#define dumpleases_trivial_usage
7//usage: "[-r|-a] [-d] [-f LEASEFILE]"
8//usage:#define dumpleases_full_usage "\n\n"
9//usage: "Display DHCP leases granted by udhcpd\n"
10//usage: IF_LONG_OPTS(
11//usage: "\n -f,--file=FILE Lease file"
12//usage: "\n -r,--remaining Show remaining time"
13//usage: "\n -a,--absolute Show expiration time"
14//usage: "\n -d,--decimal Show time in seconds"
15//usage: )
16//usage: IF_NOT_LONG_OPTS(
17//usage: "\n -f FILE Lease file"
18//usage: "\n -r Show remaining time"
19//usage: "\n -a Show expiration time"
20//usage: "\n -d Show time in seconds"
21//usage: )
22
23#include "common.h"
24#include "dhcpd.h"
25#include "unicode.h"
26
27int dumpleases_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
28int dumpleases_main(int argc UNUSED_PARAM, char **argv)
29{
30 int fd;
31 int i;
32 unsigned opt;
33 int64_t written_at, curr;
34 const char *file = LEASES_FILE;
35 struct dyn_lease lease;
36
37 enum {
38 OPT_a = 0x1, // -a
39 OPT_r = 0x2, // -r
40 OPT_f = 0x4, // -f
41 OPT_d = 0x8, // -d
42 };
43#if ENABLE_LONG_OPTS
44 static const char dumpleases_longopts[] ALIGN1 =
45 "absolute\0" No_argument "a"
46 "remaining\0" No_argument "r"
47 "file\0" Required_argument "f"
48 "decimal\0" No_argument "d"
49 ;
50
51 applet_long_options = dumpleases_longopts;
52#endif
53 init_unicode();
54
55 opt_complementary = "=0:a--r:r--a";
56 opt = getopt32(argv, "arf:d", &file);
57
58 fd = xopen(file, O_RDONLY);
59
60 /* "123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 */
61 /* "00:00:00:00:00:00 255.255.255.255 ABCDEFGHIJKLMNOPQRS Wed Jun 30 21:49:08 1993" */
62 printf("Mac %-14s" "IP %-13s" "Host %-15s" "Expires %s\n",
63 "Address", "Address", "Name",
64 (opt & OPT_a) ? "at" : "in"
65 );
66
67 xread(fd, &written_at, sizeof(written_at));
68 written_at = SWAP_BE64(written_at);
69 curr = time(NULL);
70 if (curr < written_at)
71 written_at = curr; /* lease file from future! :) */
72
73 while (full_read(fd, &lease, sizeof(lease)) == sizeof(lease)) {
74 struct in_addr addr;
75 int64_t expires_abs;
76
77 const char *fmt = ":%02x" + 1;
78 for (i = 0; i < 6; i++) {
79 printf(fmt, lease.lease_mac[i]);
80 fmt = ":%02x";
81 }
82 addr.s_addr = lease.lease_nip;
83#if ENABLE_UNICODE_SUPPORT
84 {
85 char *uni_name = unicode_conv_to_printable_fixedwidth(/*NULL,*/ lease.hostname, 19);
86 printf(" %-16s%s ", inet_ntoa(addr), uni_name);
87 free(uni_name);
88 }
89#else
90 /* actually, 15+1 and 19+1, +1 is a space between columns */
91 /* lease.hostname is char[20] and is always NUL terminated */
92 printf(" %-16s%-20s", inet_ntoa(addr), lease.hostname);
93#endif
94 expires_abs = ntohl(lease.expires) + written_at;
95 if (expires_abs <= curr) {
96 puts("expired");
97 continue;
98 }
99 if (opt & OPT_d) {
100 /* -d: decimal time */
101 if (!(opt & OPT_a))
102 expires_abs -= curr;
103 printf("%llu\n", (unsigned long long) expires_abs);
104 continue;
105 }
106 if (!(opt & OPT_a)) { /* no -a */
107 unsigned d, h, m;
108 unsigned expires = expires_abs - curr;
109 d = expires / (24*60*60); expires %= (24*60*60);
110 h = expires / (60*60); expires %= (60*60);
111 m = expires / 60; expires %= 60;
112 if (d)
113 printf("%u days ", d);
114 printf("%02u:%02u:%02u\n", h, m, (unsigned)expires);
115 } else { /* -a */
116 time_t t = expires_abs;
117 fputs(ctime(&t), stdout);
118 }
119 }
120 /* close(fd); */
121
122 return 0;
123}
Note: See TracBrowser for help on using the repository browser.