1 /* vi: set sw=4 ts=4: */
3 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
6 //usage:#define dumpleases_trivial_usage
7 //usage: "[-r|-a] [-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"
15 //usage: IF_NOT_LONG_OPTS(
16 //usage: "\n -f FILE Lease file"
17 //usage: "\n -r Show remaining time"
18 //usage: "\n -a Show expiration time"
25 int dumpleases_main(int argc
, char **argv
) MAIN_EXTERNALLY_VISIBLE
;
26 int dumpleases_main(int argc UNUSED_PARAM
, char **argv
)
31 int64_t written_at
, curr
, expires_abs
;
32 const char *file
= LEASES_FILE
;
33 struct dyn_lease lease
;
42 static const char dumpleases_longopts
[] ALIGN1
=
43 "absolute\0" No_argument
"a"
44 "remaining\0" No_argument
"r"
45 "file\0" Required_argument
"f"
48 applet_long_options
= dumpleases_longopts
;
52 opt_complementary
= "=0:a--r:r--a";
53 opt
= getopt32(argv
, "arf:", &file
);
55 fd
= xopen(file
, O_RDONLY
);
57 printf("Mac Address IP Address Host Name Expires %s\n", (opt
& OPT_a
) ? "at" : "in");
58 /* "00:00:00:00:00:00 255.255.255.255 ABCDEFGHIJKLMNOPQRS Wed Jun 30 21:49:08 1993" */
59 /* "123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 */
61 xread(fd
, &written_at
, sizeof(written_at
));
62 written_at
= SWAP_BE64(written_at
);
64 if (curr
< written_at
)
65 written_at
= curr
; /* lease file from future! :) */
67 while (full_read(fd
, &lease
, sizeof(lease
)) == sizeof(lease
)) {
68 const char *fmt
= ":%02x" + 1;
69 for (i
= 0; i
< 6; i
++) {
70 printf(fmt
, lease
.lease_mac
[i
]);
73 addr
.s_addr
= lease
.lease_nip
;
74 #if ENABLE_UNICODE_SUPPORT
76 char *uni_name
= unicode_conv_to_printable_fixedwidth(/*NULL,*/ lease
.hostname
, 19);
77 printf(" %-16s%s ", inet_ntoa(addr
), uni_name
);
81 /* actually, 15+1 and 19+1, +1 is a space between columns */
82 /* lease.hostname is char[20] and is always NUL terminated */
83 printf(" %-16s%-20s", inet_ntoa(addr
), lease
.hostname
);
85 expires_abs
= ntohl(lease
.expires
) + written_at
;
86 if (expires_abs
<= curr
) {
90 if (!(opt
& OPT_a
)) { /* no -a */
92 unsigned expires
= expires_abs
- curr
;
93 d
= expires
/ (24*60*60); expires
%= (24*60*60);
94 h
= expires
/ (60*60); expires
%= (60*60);
95 m
= expires
/ 60; expires
%= 60;
97 printf("%u days ", d
);
98 printf("%02u:%02u:%02u\n", h
, m
, (unsigned)expires
);
100 time_t t
= expires_abs
;
101 fputs(ctime(&t
), stdout
);