#include "network-internal.h"
#include "conf-parser.h"
-#include "network-util.h"
#include "dhcp-lease-internal.h"
static int link_new(Manager *manager, sd_rtnl_message *message, Link **ret) {
log_debug_link(link, "offering DHCPv4 leases");
- r = sd_dhcp_server_set_address(link->dhcp_server, &address->in_addr.in);
+ r = sd_dhcp_server_set_address(link->dhcp_server, &address->in_addr.in, address->prefixlen);
if (r < 0)
return r;
return r;
}
- prefixlen = net_netmask_to_prefixlen(&netmask);
+ prefixlen = in_addr_netmask_to_prefixlen(&netmask);
r = address_new_dynamic(&address);
if (r < 0) {
sd_dhcp_lease_get_address(link->dhcp_lease, &addr);
sd_dhcp_lease_get_netmask(link->dhcp_lease, &netmask);
- prefixlen = net_netmask_to_prefixlen(&netmask);
+ prefixlen = in_addr_netmask_to_prefixlen(&netmask);
address->family = AF_INET;
address->in_addr.in = addr;
return r;
}
- prefixlen = net_netmask_to_prefixlen(&netmask);
+ prefixlen = in_addr_netmask_to_prefixlen(&netmask);
r = sd_dhcp_lease_get_router(lease, &gateway);
if (r < 0 && r != -ENOENT) {
r = fopen_temporary(link->state_file, &f, &temp_path);
if (r < 0)
- goto finish;
+ return r;
fchmod(fileno(f), 0644);
(address + 1 ? " " : ""));
fputs("\n", f);
+
+ fprintf(f, "LLMNR=%s\n", llmnr_support_to_string(link->network->llmnr));
}
if (link->dhcp_lease) {
r = dhcp_lease_save(link->dhcp_lease, link->lease_file);
if (r < 0)
- goto finish;
+ goto fail;
fprintf(f,
"DHCP_LEASE=%s\n",
} else
unlink(link->lease_file);
- fflush(f);
+ r = fflush_and_check(f);
+ if (r < 0)
+ goto fail;
- if (ferror(f) || rename(temp_path, link->state_file) < 0) {
+ if (rename(temp_path, link->state_file) < 0) {
r = -errno;
- unlink(link->state_file);
- unlink(temp_path);
+ goto fail;
}
-finish:
- if (r < 0)
- log_error_link(link, "Failed to save link data to %s: %s", link->state_file, strerror(-r));
+ return 0;
+fail:
+ log_error_link(link, "Failed to save link data to %s: %s", link->state_file, strerror(-r));
+ unlink(link->state_file);
+ unlink(temp_path);
return r;
}
};
DEFINE_STRING_TABLE_LOOKUP(link_operstate, LinkOperationalState);
-
-static const char* const dhcp_support_table[_DHCP_SUPPORT_MAX] = {
- [DHCP_SUPPORT_NONE] = "none",
- [DHCP_SUPPORT_BOTH] = "both",
- [DHCP_SUPPORT_V4] = "v4",
- [DHCP_SUPPORT_V6] = "v6",
-};
-
-DEFINE_STRING_TABLE_LOOKUP(dhcp_support, DHCPSupport);
-
-int config_parse_dhcp(
- 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) {
-
- DHCPSupport *dhcp = data;
- int k;
-
- assert(filename);
- assert(lvalue);
- assert(rvalue);
- assert(data);
-
- /* Our enum shall be a superset of booleans, hence first try
- * to parse as boolean, and then as enum */
-
- k = parse_boolean(rvalue);
- if (k > 0)
- *dhcp = DHCP_SUPPORT_BOTH;
- else if (k == 0)
- *dhcp = DHCP_SUPPORT_NONE;
- else {
- DHCPSupport s;
-
- s = dhcp_support_from_string(rvalue);
- if (s < 0){
- log_syntax(unit, LOG_ERR, filename, line, -s, "Failed to parse DHCP option, ignoring: %s", rvalue);
- return 0;
- }
-
- *dhcp = s;
- }
-
- return 0;
-}