mirror of
https://github.com/systemd/systemd.git
synced 2024-11-14 15:21:37 +03:00
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
This commit is contained in:
parent
9b361114f5
commit
a7d0ef446e
@ -270,12 +270,18 @@ static int dhcp_lease_lost(Link *link) {
|
|||||||
if (link->network->dhcp_hostname) {
|
if (link->network->dhcp_hostname) {
|
||||||
const char *hostname = NULL;
|
const char *hostname = NULL;
|
||||||
|
|
||||||
r = sd_dhcp_lease_get_hostname(link->dhcp_lease, &hostname);
|
if (!link->network->hostname)
|
||||||
if (r >= 0 && hostname) {
|
r = sd_dhcp_lease_get_hostname(link->dhcp_lease, &hostname);
|
||||||
r = link_set_hostname(link, "");
|
else
|
||||||
|
hostname = link->network->hostname;
|
||||||
|
|
||||||
|
if (r >= 0 || hostname) {
|
||||||
|
r = link_set_hostname(link, hostname);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
log_link_error(link,
|
log_link_error_errno(link, r,
|
||||||
"Failed to reset transient hostname");
|
"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) {
|
if (link->network->dhcp_hostname) {
|
||||||
const char *hostname;
|
const char *hostname;
|
||||||
|
|
||||||
r = sd_dhcp_lease_get_hostname(lease, &hostname);
|
if (!link->network->hostname)
|
||||||
if (r >= 0) {
|
r = sd_dhcp_lease_get_hostname(lease, &hostname);
|
||||||
|
else
|
||||||
|
hostname = link->network->hostname;
|
||||||
|
|
||||||
|
if (r >= 0 || hostname) {
|
||||||
r = link_set_hostname(link, hostname);
|
r = link_set_hostname(link, hostname);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
log_link_error_errno(link, r, "Failed to set transient hostname to '%s': %m", hostname);
|
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) {
|
if (link->network->dhcp_sendhost) {
|
||||||
_cleanup_free_ char *hostname = NULL;
|
_cleanup_free_ char *hostname = NULL;
|
||||||
|
const char *hn = NULL;
|
||||||
|
|
||||||
hostname = gethostname_malloc();
|
if (!link->network->hostname) {
|
||||||
if (!hostname)
|
hostname = gethostname_malloc();
|
||||||
return -ENOMEM;
|
if (!hostname)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
if (!is_localhost(hostname)) {
|
hn = hostname;
|
||||||
r = sd_dhcp_client_set_hostname(link->dhcp_client,
|
} else
|
||||||
hostname);
|
hn = link->network->hostname;
|
||||||
|
|
||||||
|
if (!is_localhost(hn)) {
|
||||||
|
r = sd_dhcp_client_set_hostname(link->dhcp_client, hn);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -67,6 +67,7 @@ DHCP.UseHostname, config_parse_bool, 0
|
|||||||
DHCP.UseDomains, config_parse_bool, 0, offsetof(Network, dhcp_domains)
|
DHCP.UseDomains, config_parse_bool, 0, offsetof(Network, dhcp_domains)
|
||||||
DHCP.UseRoutes, config_parse_bool, 0, offsetof(Network, dhcp_routes)
|
DHCP.UseRoutes, config_parse_bool, 0, offsetof(Network, dhcp_routes)
|
||||||
DHCP.SendHostname, config_parse_bool, 0, offsetof(Network, dhcp_sendhost)
|
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.RequestBroadcast, config_parse_bool, 0, offsetof(Network, dhcp_broadcast)
|
||||||
DHCP.CriticalConnection, config_parse_bool, 0, offsetof(Network, dhcp_critical)
|
DHCP.CriticalConnection, config_parse_bool, 0, offsetof(Network, dhcp_critical)
|
||||||
DHCP.VendorClassIdentifier, config_parse_string, 0, offsetof(Network, dhcp_vendor_class_identifier)
|
DHCP.VendorClassIdentifier, config_parse_string, 0, offsetof(Network, dhcp_vendor_class_identifier)
|
||||||
|
@ -207,6 +207,7 @@ void network_free(Network *network) {
|
|||||||
|
|
||||||
free(network->description);
|
free(network->description);
|
||||||
free(network->dhcp_vendor_class_identifier);
|
free(network->dhcp_vendor_class_identifier);
|
||||||
|
free(network->hostname);
|
||||||
|
|
||||||
free(network->mac);
|
free(network->mac);
|
||||||
|
|
||||||
@ -809,3 +810,38 @@ int config_parse_ipv6_privacy_extensions(
|
|||||||
|
|
||||||
return 0;
|
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;
|
||||||
|
}
|
||||||
|
@ -133,6 +133,7 @@ struct Network {
|
|||||||
AddressFamilyBoolean dhcp;
|
AddressFamilyBoolean dhcp;
|
||||||
DCHPClientIdentifier dhcp_client_identifier;
|
DCHPClientIdentifier dhcp_client_identifier;
|
||||||
char *dhcp_vendor_class_identifier;
|
char *dhcp_vendor_class_identifier;
|
||||||
|
char *hostname;
|
||||||
bool dhcp_dns;
|
bool dhcp_dns;
|
||||||
bool dhcp_ntp;
|
bool dhcp_ntp;
|
||||||
bool dhcp_mtu;
|
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_;
|
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);
|
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user