#include <errno.h>
#include <string.h>
#include <stdio.h>
-#include <net/ethernet.h>
#include <arpa/inet.h>
-#include <sys/param.h>
-#include "util.h"
-#include "list.h"
-#include "mkdir.h"
#include "fileio.h"
#include "unaligned.h"
#include "in-addr-util.h"
#include "dhcp-protocol.h"
-#include "dhcp-internal.h"
#include "dhcp-lease-internal.h"
#include "sd-dhcp-lease.h"
-#include "sd-dhcp-client.h"
#include "network-internal.h"
int sd_dhcp_lease_get_address(sd_dhcp_lease *lease, struct in_addr *addr) {
}
sd_dhcp_lease *sd_dhcp_lease_unref(sd_dhcp_lease *lease) {
- if (lease && REFCNT_DEC(lease->n_ref) <= 0) {
+ if (lease && REFCNT_DEC(lease->n_ref) == 0) {
free(lease->hostname);
free(lease->domainname);
free(lease->dns);
case DHCP_OPTION_DOMAIN_NAME:
{
_cleanup_free_ char *domainname = NULL;
+ char *e;
r = lease_parse_string(option, len, &domainname);
if (r < 0)
return r;
+ /* Chop off trailing dot of domain name that some DHCP
+ * servers send us back. Internally we want to store
+ * host names without trailing dots and
+ * host_name_is_valid() doesn't accept them. */
+ e = endswith(domainname, ".");
+ if (e)
+ *e = 0;
+
if (!hostname_is_valid(domainname) || is_localhost(domainname))
break;
case DHCP_OPTION_HOST_NAME:
{
_cleanup_free_ char *hostname = NULL;
+ char *e;
r = lease_parse_string(option, len, &hostname);
if (r < 0)
return r;
+ e = endswith(hostname, ".");
+ if (e)
+ *e = 0;
+
if (!hostname_is_valid(hostname) || is_localhost(hostname))
break;
if (r == -ENOENT)
return 0;
- log_error_errno(r, "Failed to read %s: %m", lease_file);
- return r;
+ return log_error_errno(r, "Failed to read %s: %m", lease_file);
}
r = inet_pton(AF_INET, address, &addr);