diff options
| author | Susant Sahani <susant@redhat.com> | 2015-07-10 15:42:27 +0530 | 
|---|---|---|
| committer | Susant Sahani <susant@redhat.com> | 2015-07-10 15:42:27 +0530 | 
| commit | a7d0ef446e5f28b37688743de22052abc8136a94 (patch) | |
| tree | e91453eb0cbfd96040092a3f8337cc2b16afff04 /src | |
| parent | 9b361114f568e839784a3aeba5c1df5a95e86832 (diff) | |
networkd: DHCP override hostname
This patch enhances the DHCP client to send the hostname
reference
http://lists.freedesktop.org/archives/systemd-devel/2014-July/021550.html
Tested with
Example conf:
[Match]
Name=eth1
[Network]
DHCP=v4
[DHCP]
SendHostname=true
Hostname=test
Diffstat (limited to 'src')
| -rw-r--r-- | src/network/networkd-dhcp4.c | 41 | ||||
| -rw-r--r-- | src/network/networkd-network-gperf.gperf | 1 | ||||
| -rw-r--r-- | src/network/networkd-network.c | 36 | ||||
| -rw-r--r-- | src/network/networkd.h | 5 | 
4 files changed, 70 insertions, 13 deletions
| diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index d446bfa8b3..4aa301b112 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -270,12 +270,18 @@ static int dhcp_lease_lost(Link *link) {          if (link->network->dhcp_hostname) {                  const char *hostname = NULL; -                r = sd_dhcp_lease_get_hostname(link->dhcp_lease, &hostname); -                if (r >= 0 && hostname) { -                        r = link_set_hostname(link, ""); +                if (!link->network->hostname) +                        r = sd_dhcp_lease_get_hostname(link->dhcp_lease, &hostname); +                else +                        hostname = link->network->hostname; + +                if (r >= 0 || hostname) { +                        r = link_set_hostname(link, hostname);                          if (r < 0) -                                log_link_error(link, -                                               "Failed to reset transient hostname"); +                                log_link_error_errno(link, r, +                                                     "Failed to set transient hostname to '%s': %m", +                                                     hostname); +                  }          } @@ -464,8 +470,12 @@ static int dhcp_lease_acquired(sd_dhcp_client *client, Link *link) {          if (link->network->dhcp_hostname) {                  const char *hostname; -                r = sd_dhcp_lease_get_hostname(lease, &hostname); -                if (r >= 0) { +                if (!link->network->hostname) +                        r = sd_dhcp_lease_get_hostname(lease, &hostname); +                else +                        hostname = link->network->hostname; + +                if (r >= 0 || hostname) {                          r = link_set_hostname(link, hostname);                          if (r < 0)                                  log_link_error_errno(link, r, "Failed to set transient hostname to '%s': %m", hostname); @@ -616,14 +626,19 @@ int dhcp4_configure(Link *link) {          if (link->network->dhcp_sendhost) {                  _cleanup_free_ char *hostname = NULL; +                const char *hn = NULL; + +                if (!link->network->hostname)  { +                        hostname = gethostname_malloc(); +                        if (!hostname) +                                return -ENOMEM; -                hostname = gethostname_malloc(); -                if (!hostname) -                        return -ENOMEM; +                        hn = hostname; +                } else +                        hn = link->network->hostname; -                if (!is_localhost(hostname)) { -                        r = sd_dhcp_client_set_hostname(link->dhcp_client, -                                                        hostname); +                if (!is_localhost(hn)) { +                        r = sd_dhcp_client_set_hostname(link->dhcp_client, hn);                          if (r < 0)                                  return r;                  } diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 787fc2ff5b..3a78c3d8a8 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -67,6 +67,7 @@ DHCP.UseHostname,              config_parse_bool,                              0  DHCP.UseDomains,               config_parse_bool,                              0,                             offsetof(Network, dhcp_domains)  DHCP.UseRoutes,                config_parse_bool,                              0,                             offsetof(Network, dhcp_routes)  DHCP.SendHostname,             config_parse_bool,                              0,                             offsetof(Network, dhcp_sendhost) +DHCP.Hostname,                 config_parse_hostname,                          0,                             offsetof(Network, hostname)  DHCP.RequestBroadcast,         config_parse_bool,                              0,                             offsetof(Network, dhcp_broadcast)  DHCP.CriticalConnection,       config_parse_bool,                              0,                             offsetof(Network, dhcp_critical)  DHCP.VendorClassIdentifier,    config_parse_string,                            0,                             offsetof(Network, dhcp_vendor_class_identifier) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index a8e9ef909c..55e735e6bf 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -207,6 +207,7 @@ void network_free(Network *network) {          free(network->description);          free(network->dhcp_vendor_class_identifier); +        free(network->hostname);          free(network->mac); @@ -809,3 +810,38 @@ int config_parse_ipv6_privacy_extensions(          return 0;  } + +int config_parse_hostname(const char *unit, +                          const char *filename, +                          unsigned line, +                          const char *section, +                          unsigned section_line, +                          const char *lvalue, +                          int ltype, +                          const char *rvalue, +                          void *data, +                          void *userdata) { +        char **hostname = data; +        char *hn = NULL; +        int r; + +        assert(filename); +        assert(lvalue); +        assert(rvalue); + +        r = config_parse_string(unit, filename, line, section, section_line, +                                lvalue, ltype, rvalue, &hn, userdata); +        if (r < 0) +                return r; + +        if (!hostname_is_valid(hn)) { +                log_syntax(unit, LOG_ERR, filename, line, EINVAL, "hostname is not valid, ignoring assignment: %s", rvalue); + +                free(hn); +                return 0; +        } + +        *hostname = hn; + +        return 0; +} diff --git a/src/network/networkd.h b/src/network/networkd.h index f98c640822..ccec4cf6b2 100644 --- a/src/network/networkd.h +++ b/src/network/networkd.h @@ -133,6 +133,7 @@ struct Network {          AddressFamilyBoolean dhcp;          DCHPClientIdentifier dhcp_client_identifier;          char *dhcp_vendor_class_identifier; +        char *hostname;          bool dhcp_dns;          bool dhcp_ntp;          bool dhcp_mtu; @@ -473,3 +474,7 @@ const char* ipv6_privacy_extensions_to_string(IPv6PrivacyExtensions i) _const_;  IPv6PrivacyExtensions ipv6_privacy_extensions_from_string(const char *s) _pure_;  int config_parse_ipv6_privacy_extensions(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); + + +/* Hostname */ +int config_parse_hostname(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); | 
