From b363d19a164c0741623182e327367d3f323c6cf8 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 15 Apr 2009 21:08:02 +0100 Subject: [PATCH] [dhcp] Accept filename via DHCP option 67 as well as BOOTP filename field Allow options with dedicated BOOTP fields to fall back to using the equivalent DHCP option if the relevant field is empty. --- src/net/dhcppkt.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/net/dhcppkt.c b/src/net/dhcppkt.c index 1f2d373c..2f3e6802 100644 --- a/src/net/dhcppkt.c +++ b/src/net/dhcppkt.c @@ -155,6 +155,8 @@ int dhcppkt_store ( struct dhcp_packet *dhcppkt, unsigned int tag, memset ( field_data, 0, field->len ); memcpy ( dhcp_packet_field ( dhcppkt->dhcphdr, field ), data, len ); + /* Erase any equivalent option from the options block */ + dhcpopt_store ( &dhcppkt->options, tag, NULL, 0 ); return 0; } @@ -181,14 +183,16 @@ int dhcppkt_fetch ( struct dhcp_packet *dhcppkt, unsigned int tag, void *data, size_t len ) { struct dhcp_packet_field *field; void *field_data; - size_t field_len; + size_t field_len = 0; - /* If this is a special field, return it */ + /* Identify special field, if any */ if ( ( field = find_dhcp_packet_field ( tag ) ) != NULL ) { field_data = dhcp_packet_field ( dhcppkt->dhcphdr, field ); field_len = field->used_len ( field_data, field->len ); - if ( ! field_len ) - return -ENOENT; + } + + /* Return special field, if it exists and is populated */ + if ( field_len ) { if ( len > field_len ) len = field_len; memcpy ( data, field_data, len );