@@ -44,6 +44,7 @@ struct DHCPLease {
4444 struct in_addr * dns ;
4545 size_t dns_size ;
4646 uint16_t mtu ;
47+ char * domainname ;
4748 char * hostname ;
4849};
4950
@@ -237,6 +238,32 @@ int sd_dhcp_client_get_dns(sd_dhcp_client *client, struct in_addr **addr, size_t
237238 return 0 ;
238239}
239240
241+ int sd_dhcp_client_get_domainname (sd_dhcp_client * client , const char * * domainname ) {
242+ assert_return (client , - EINVAL );
243+ assert_return (domainname , - EINVAL );
244+
245+ switch (client -> state ) {
246+ case DHCP_STATE_INIT :
247+ case DHCP_STATE_SELECTING :
248+ case DHCP_STATE_INIT_REBOOT :
249+ case DHCP_STATE_REBOOTING :
250+ case DHCP_STATE_REQUESTING :
251+ return - EADDRNOTAVAIL ;
252+
253+ case DHCP_STATE_BOUND :
254+ case DHCP_STATE_RENEWING :
255+ case DHCP_STATE_REBINDING :
256+ if (client -> lease -> domainname )
257+ * domainname = client -> lease -> domainname ;
258+ else
259+ return - ENOENT ;
260+
261+ break ;
262+ }
263+
264+ return 0 ;
265+ }
266+
240267int sd_dhcp_client_get_hostname (sd_dhcp_client * client , const char * * hostname ) {
241268 assert_return (client , - EINVAL );
242269 assert_return (hostname , - EINVAL );
@@ -336,6 +363,7 @@ static void lease_free(DHCPLease *lease) {
336363 return ;
337364
338365 free (lease -> hostname );
366+ free (lease -> domainname );
339367 free (lease -> dns );
340368 free (lease );
341369}
@@ -832,6 +860,14 @@ static int client_parse_offer(uint8_t code, uint8_t len, const uint8_t *option,
832860
833861 break ;
834862
863+ case DHCP_OPTION_DOMAIN_NAME :
864+ if (len >= 1 ) {
865+ free (lease -> domainname );
866+ lease -> domainname = strndup ((const char * )option , len );
867+ }
868+
869+ break ;
870+
835871 case DHCP_OPTION_HOST_NAME :
836872 if (len >= 1 ) {
837873 free (lease -> hostname );
0 commit comments