| 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) |
| { |