From 039ebe6aebaebcaa18375b33caf1db5fe2551621 Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Sat, 18 Jan 2014 15:47:57 +0100 Subject: [PATCH] sd-dhcp-client/networkd: add domainname support --- src/libsystemd/sd-dhcp-client.c | 36 ++++++++++++++++++++++++++++++++ src/network/networkd-gperf.gperf | 1 + src/network/networkd-manager.c | 19 ++++++++++++----- src/network/networkd-network.c | 1 + src/network/networkd.h | 1 + src/systemd/sd-dhcp-client.h | 1 + 6 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/libsystemd/sd-dhcp-client.c b/src/libsystemd/sd-dhcp-client.c index 26ed35e5f..908f84467 100644 --- a/src/libsystemd/sd-dhcp-client.c +++ b/src/libsystemd/sd-dhcp-client.c @@ -44,6 +44,7 @@ struct DHCPLease { struct in_addr *dns; size_t dns_size; uint16_t mtu; + char *domainname; char *hostname; }; @@ -237,6 +238,32 @@ int sd_dhcp_client_get_dns(sd_dhcp_client *client, struct in_addr **addr, size_t return 0; } +int sd_dhcp_client_get_domainname(sd_dhcp_client *client, const char **domainname) { + assert_return(client, -EINVAL); + assert_return(domainname, -EINVAL); + + switch (client->state) { + case DHCP_STATE_INIT: + case DHCP_STATE_SELECTING: + case DHCP_STATE_INIT_REBOOT: + case DHCP_STATE_REBOOTING: + case DHCP_STATE_REQUESTING: + return -EADDRNOTAVAIL; + + case DHCP_STATE_BOUND: + case DHCP_STATE_RENEWING: + case DHCP_STATE_REBINDING: + if (client->lease->domainname) + *domainname = client->lease->domainname; + else + return -ENOENT; + + break; + } + + return 0; +} + int sd_dhcp_client_get_hostname(sd_dhcp_client *client, const char **hostname) { assert_return(client, -EINVAL); assert_return(hostname, -EINVAL); @@ -336,6 +363,7 @@ static void lease_free(DHCPLease *lease) { return; free(lease->hostname); + free(lease->domainname); free(lease->dns); free(lease); } @@ -832,6 +860,14 @@ static int client_parse_offer(uint8_t code, uint8_t len, const uint8_t *option, break; + case DHCP_OPTION_DOMAIN_NAME: + if (len >= 1) { + free(lease->domainname); + lease->domainname = strndup((const char *)option, len); + } + + break; + case DHCP_OPTION_HOST_NAME: if (len >= 1) { free(lease->hostname); diff --git a/src/network/networkd-gperf.gperf b/src/network/networkd-gperf.gperf index 7686cdf33..abf6a3097 100644 --- a/src/network/networkd-gperf.gperf +++ b/src/network/networkd-gperf.gperf @@ -33,5 +33,6 @@ Route.Destination, config_parse_destination, 0, 0 DHCPv4.UseDNS, config_parse_bool, 0, offsetof(Network, dhcp_dns) DHCPv4.UseMTU, config_parse_bool, 0, offsetof(Network, dhcp_mtu) DHCPv4.UseHostname, config_parse_bool, 0, offsetof(Network, dhcp_hostname) +DHCPv4.UseDomainName, config_parse_bool, 0, offsetof(Network, dhcp_domainname) Bridge.Description, config_parse_string, 0, offsetof(Bridge, description) Bridge.Name, config_parse_ifname, 0, offsetof(Bridge, name) diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index c630ed7ed..5ab9ba0ba 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -325,6 +325,7 @@ int manager_update_resolv_conf(Manager *m) { Link *link; Iterator i; unsigned count = 0; + const char *domainname = NULL; int r; assert(m); @@ -350,12 +351,20 @@ int manager_update_resolv_conf(Manager *m) { struct in_addr *nameservers; size_t nameservers_size; - r = sd_dhcp_client_get_dns(link->dhcp, &nameservers, &nameservers_size); - if (r >= 0) { - unsigned j; + if (link->network->dhcp_dns) { + r = sd_dhcp_client_get_dns(link->dhcp, &nameservers, &nameservers_size); + if (r >= 0) { + unsigned j; - for (j = 0; j < nameservers_size; j++) - append_dns(f, &nameservers[j], AF_INET, &count); + for (j = 0; j < nameservers_size; j++) + append_dns(f, &nameservers[j], AF_INET, &count); + } + } + + if (link->network->dhcp_domainname && !domainname) { + r = sd_dhcp_client_get_domainname(link->dhcp, &domainname); + if (r >= 0) + fprintf(f, "domain %s\n", domainname); } } } diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index ff5442322..b6b0c796d 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -68,6 +68,7 @@ static int network_load_one(Manager *manager, const char *filename) { network->dhcp_dns = true; network->dhcp_mtu = true; network->dhcp_hostname = true; + network->dhcp_domainname = true; r = config_parse(NULL, filename, file, "Match\0Network\0Address\0Route\0DHCPv4\0", config_item_perf_lookup, (void*) network_gperf_lookup, false, false, network); diff --git a/src/network/networkd.h b/src/network/networkd.h index 89f4cf24e..c684eb8a8 100644 --- a/src/network/networkd.h +++ b/src/network/networkd.h @@ -89,6 +89,7 @@ struct Network { bool dhcp_dns; bool dhcp_mtu; bool dhcp_hostname; + bool dhcp_domainname; LIST_HEAD(Address, static_addresses); LIST_HEAD(Route, static_routes); diff --git a/src/systemd/sd-dhcp-client.h b/src/systemd/sd-dhcp-client.h index beb8642a8..937ed86e8 100644 --- a/src/systemd/sd-dhcp-client.h +++ b/src/systemd/sd-dhcp-client.h @@ -56,6 +56,7 @@ int sd_dhcp_client_prefixlen(const struct in_addr *addr); int sd_dhcp_client_get_router(sd_dhcp_client *client, struct in_addr *addr); int sd_dhcp_client_get_dns(sd_dhcp_client *client, struct in_addr **addr, size_t *addr_size); int sd_dhcp_client_get_mtu(sd_dhcp_client *client, uint16_t *mtu); +int sd_dhcp_client_get_domainname(sd_dhcp_client *client, const char **domainname); int sd_dhcp_client_get_hostname(sd_dhcp_client *client, const char **hostname); int sd_dhcp_client_stop(sd_dhcp_client *client); -- 2.30.2