- for (size_t i = 0; i < addrlen; ++i) {
- if (!valid_addr(&addrs[i], now) ||
- (!INFINITE_VALID(c->valid_until) && c->valid_until <= now))
- continue;
-
- addr = addrs[i].addr;
- if (c->length == 128) {
- if (!ADDR_ENTRY_VALID_IA_ADDR(iface, i, m, addrs))
- continue;
-
- addr.s6_addr32[3] = htonl(c->assigned);
- } else {
- if (!valid_prefix_length(c, addrs[i].prefix))
- continue;
-
- addr.s6_addr32[1] |= htonl(c->assigned);
- addr.s6_addr32[2] = addr.s6_addr32[3] = 0;
- }
-
- inet_ntop(AF_INET6, &addr, ipbuf, sizeof(ipbuf) - 1);
-
- if (c->length == 128 && c->hostname) {
- fputs(ipbuf, fp);
-
- char b[256];
- if (dn_expand(iface->search, iface->search + iface->search_len,
- iface->search, b, sizeof(b)) > 0)
- fprintf(fp, "\t%s.%s", c->hostname, b);
-
- fprintf(fp, "\t%s\n", c->hostname);
- md5_hash(ipbuf, strlen(ipbuf), &md5);
- md5_hash(c->hostname, strlen(c->hostname), &md5);
- }
-
- l += snprintf(leasebuf + l, sizeof(leasebuf) - l, "%s/%d ", ipbuf,
- (c->managed_size) ? addrs[i].prefix : c->length);
- }
- leasebuf[l - 1] = '\n';
- fwrite(leasebuf, 1, l, fp);
+ /* iface DUID iaid hostname lifetime assigned length [addrs...] */
+ ctxt.buf_idx = snprintf(ctxt.buf, ctxt.buf_len, "# %s %s %x %s %ld %x %u ",
+ ctxt.iface->ifname, duidbuf, ntohl(ctxt.c->iaid),
+ (ctxt.c->hostname ? ctxt.c->hostname : "-"),
+ (ctxt.c->valid_until > now ?
+ (ctxt.c->valid_until - now + wall_time) :
+ (INFINITE_VALID(ctxt.c->valid_until) ? -1 : 0)),
+ ctxt.c->assigned, (unsigned)ctxt.c->length);
+
+ if (INFINITE_VALID(ctxt.c->valid_until) || ctxt.c->valid_until > now)
+ dhcpv6_enum_ia_addrs(ctxt.iface, ctxt.c, now,
+ dhcpv6_write_ia_addr, &ctxt);
+
+ ctxt.buf[ctxt.buf_idx - 1] = '\n';
+ fwrite(ctxt.buf, 1, ctxt.buf_idx, ctxt.fp);