blob: 5540bff852e8d7bd649fad606449b58c4a4303c1 [file] [log] [blame]
diff --git a/src/dnsmasq.h b/src/dnsmasq.h
index e74b15a..fbf41f6 100644
--- a/src/dnsmasq.h
+++ b/src/dnsmasq.h
@@ -660,6 +660,7 @@ struct dhcp_lease {
} *slaac_address;
int vendorclass_count;
#endif
+ u8 req_options[256]; /* cover all possible options (0-254 + OPTION_END) */
struct dhcp_lease *next;
};
diff --git a/src/lease.c b/src/lease.c
index 5d56b1b..a63851e 100644
--- a/src/lease.c
+++ b/src/lease.c
@@ -81,7 +81,7 @@ void lease_init(time_t now)
ei = atol(daemon->dhcp_buff3);
- if (fscanf(leasestream, " %64s %255s %764s",
+ if (fscanf(leasestream, " %64s %255s %764s %*s",
daemon->namebuff, daemon->dhcp_buff, daemon->packet) != 3)
break;
@@ -254,10 +254,25 @@ void lease_update_file(time_t now)
{
for (i = 0; i < lease->clid_len - 1; i++)
ourprintf(&err, "%.2x:", lease->clid[i]);
- ourprintf(&err, "%.2x\n", lease->clid[i]);
+ ourprintf(&err, "%.2x ", lease->clid[i]);
}
else
- ourprintf(&err, "*\n");
+ ourprintf(&err, "* ");
+
+ {
+ unsigned char *p;
+ if (lease->req_options[0] == OPTION_END)
+ ourprintf(&err, "*");
+ else
+ {
+ for (p = lease->req_options; *p != OPTION_END; p++)
+ {
+ if (p != lease->req_options) ourprintf(&err, ",");
+ ourprintf(&err, "%u", *p);
+ }
+ }
+ ourprintf(&err, "\n");
+ }
}
#ifdef HAVE_DHCP6
@@ -729,6 +744,7 @@ static struct dhcp_lease *lease_allocate(void)
lease->length = 0xffffffff; /* illegal value */
#endif
lease->hwaddr_len = 256; /* illegal value */
+ lease->req_options[0] = OPTION_END;
lease->next = leases;
leases = lease;
diff --git a/src/rfc2131.c b/src/rfc2131.c
index 5c90408..c8b7d14 100644
--- a/src/rfc2131.c
+++ b/src/rfc2131.c
@@ -1253,6 +1253,16 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
/* pick up INIT-REBOOT events. */
lease->flags |= LEASE_CHANGED;
+ if ((opt = option_find(mess, sz, OPTION_REQUESTED_OPTIONS, 0)))
+ {
+ int len = sizeof(lease->req_options) - 1;
+ if (option_len(opt) < len) {
+ len = option_len(opt);
+ }
+ memcpy(lease->req_options, option_ptr(opt, 0), len);
+ lease->req_options[len] = OPTION_END;
+ }
+
#ifdef HAVE_SCRIPT
if (daemon->lease_change_command)
{