[systemd-commits] 9 commits - src/libsystemd src/libsystemd-network src/network src/nss-mymachines src/resolve src/systemd src/timesync

Lennart Poettering lennart at kemper.freedesktop.org
Wed Jul 16 16:49:43 PDT 2014


 src/libsystemd-network/network-internal.c |   18 +++++--------
 src/libsystemd-network/network-internal.h |    7 ++---
 src/libsystemd-network/sd-dhcp-lease.c    |   40 ++++++++++++++----------------
 src/libsystemd/libsystemd.sym.m4          |    2 -
 src/libsystemd/sd-login/sd-login.c        |    8 +++---
 src/network/networkd-link.c               |   25 ++++++++----------
 src/network/networkd-wait-online.c        |    2 -
 src/network/sd-network.c                  |   30 ++++++++++------------
 src/network/test-network.c                |    6 ++--
 src/nss-mymachines/nss-mymachines.c       |   12 ++++-----
 src/resolve/resolved-dns-domain.c         |    3 ++
 src/resolve/resolved-dns-domain.h         |    1 
 src/resolve/resolved-dns-packet.h         |    6 +++-
 src/resolve/resolved-dns-scope.c          |   16 +++++++++++-
 src/resolve/resolved-link.c               |   32 ++++++++++++++----------
 src/resolve/resolved-link.h               |    2 -
 src/resolve/resolved-manager.c            |   22 +++++++++++++++-
 src/resolve/resolved.h                    |    1 
 src/systemd/sd-dhcp-lease.h               |    6 ++--
 src/systemd/sd-login.h                    |    4 +--
 src/systemd/sd-network.h                  |   24 +++++++++---------
 src/timesync/timesyncd.c                  |    2 -
 22 files changed, 153 insertions(+), 116 deletions(-)

New commits:
commit 634af5665fda8776d22624d947c8de830e30a874
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Jul 17 01:48:40 2014 +0200

    sd-login: always use "indices" as plural of "index"
    
    So far both "indexes" and "indices" was used. Let's clean this up, and
    stick to indices, since it appears to be used more frequently.

diff --git a/src/libsystemd/libsystemd.sym.m4 b/src/libsystemd/libsystemd.sym.m4
index 48572cc..1c24cad 100644
--- a/src/libsystemd/libsystemd.sym.m4
+++ b/src/libsystemd/libsystemd.sym.m4
@@ -150,7 +150,7 @@ global:
 
 LIBSYSTEMD_216 {
 global:
-        sd_machine_get_ifindexes;
+        sd_machine_get_ifindices;
 } LIBSYSTEMD_214;
 
 m4_ifdef(`ENABLE_KDBUS',
diff --git a/src/libsystemd/sd-login/sd-login.c b/src/libsystemd/sd-login/sd-login.c
index 83d6449..38ff944 100644
--- a/src/libsystemd/sd-login/sd-login.c
+++ b/src/libsystemd/sd-login/sd-login.c
@@ -786,7 +786,7 @@ _public_ int sd_machine_get_class(const char *machine, char **class) {
         return 0;
 }
 
-_public_ int sd_machine_get_ifindexes(const char *machine, int **ifindexes) {
+_public_ int sd_machine_get_ifindices(const char *machine, int **ifindices) {
         _cleanup_free_ char *netif = NULL;
         size_t l, allocated = 0, nr = 0;
         char *w, *state;
@@ -795,14 +795,14 @@ _public_ int sd_machine_get_ifindexes(const char *machine, int **ifindexes) {
         int r;
 
         assert_return(machine_name_is_valid(machine), -EINVAL);
-        assert_return(ifindexes, -EINVAL);
+        assert_return(ifindices, -EINVAL);
 
         p = strappenda("/run/systemd/machines/", machine);
         r = parse_env_file(p, NEWLINE, "NETIF", &netif, NULL);
         if (r < 0)
                 return r;
         if (!netif) {
-                *ifindexes = NULL;
+                *ifindices = NULL;
                 return 0;
         }
 
@@ -825,7 +825,7 @@ _public_ int sd_machine_get_ifindexes(const char *machine, int **ifindexes) {
                 ni[nr++] = ifi;
         }
 
-        *ifindexes = ni;
+        *ifindices = ni;
         return nr;
 }
 
diff --git a/src/nss-mymachines/nss-mymachines.c b/src/nss-mymachines/nss-mymachines.c
index 5327499..eb1d2b4 100644
--- a/src/nss-mymachines/nss-mymachines.c
+++ b/src/nss-mymachines/nss-mymachines.c
@@ -80,12 +80,12 @@ enum nss_status _nss_mymachines_gethostbyname4_r(
         struct gaih_addrtuple *r_tuple, *r_tuple_first = NULL;
         _cleanup_bus_message_unref_ sd_bus_message* reply = NULL;
         _cleanup_bus_unref_ sd_bus *bus = NULL;
-        _cleanup_free_ int *ifindexes = NULL;
+        _cleanup_free_ int *ifindices = NULL;
         _cleanup_free_ char *class = NULL;
         size_t l, ms, idx;
         unsigned i = 0, c = 0;
         char *r_name;
-        int n_ifindexes, r;
+        int n_ifindices, r;
 
         assert(name);
         assert(pat);
@@ -101,9 +101,9 @@ enum nss_status _nss_mymachines_gethostbyname4_r(
                 goto fail;
         }
 
-        n_ifindexes = sd_machine_get_ifindexes(name, &ifindexes);
-        if (n_ifindexes < 0) {
-                r = n_ifindexes;
+        n_ifindices = sd_machine_get_ifindices(name, &ifindices);
+        if (n_ifindices < 0) {
+                r = n_ifindices;
                 goto fail;
         }
 
@@ -182,7 +182,7 @@ enum nss_status _nss_mymachines_gethostbyname4_r(
                 r_tuple->next = i == c-1 ? NULL : (struct gaih_addrtuple*) ((char*) r_tuple + ALIGN(sizeof(struct gaih_addrtuple)));
                 r_tuple->name = r_name;
                 r_tuple->family = family;
-                r_tuple->scopeid = n_ifindexes == 1 ? ifindexes[0] : 0;
+                r_tuple->scopeid = n_ifindices == 1 ? ifindices[0] : 0;
                 memcpy(r_tuple->addr, a, sz);
 
                 idx += ALIGN(sizeof(struct gaih_addrtuple));
diff --git a/src/systemd/sd-login.h b/src/systemd/sd-login.h
index b289ad2..1eb3be3 100644
--- a/src/systemd/sd-login.h
+++ b/src/systemd/sd-login.h
@@ -181,8 +181,8 @@ int sd_seat_can_graphical(const char *seat);
 /* Return the class of machine */
 int sd_machine_get_class(const char *machine, char **clazz);
 
-/* Return the list if host-side network interface indexes of a machine */
-int sd_machine_get_ifindexes(const char *machine, int **ifindexes);
+/* Return the list if host-side network interface indices of a machine */
+int sd_machine_get_ifindices(const char *machine, int **ifindices);
 
 /* Get all seats, store in *seats. Returns the number of seats. If
  * seats is NULL, this only returns the number of seats. */

commit d12b8cad40aa78fc948362340204c3fde778082d
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Jul 17 01:46:21 2014 +0200

    sd-network: rename "index" parameter to "ifindex"
    
    makes things a bit clearer and avoids any clashes with libc's index()
    symbol.

diff --git a/src/systemd/sd-network.h b/src/systemd/sd-network.h
index 30e920d..45fd3ce 100644
--- a/src/systemd/sd-network.h
+++ b/src/systemd/sd-network.h
@@ -58,14 +58,14 @@ _SD_BEGIN_DECLARATIONS;
  *   -EUNATCH: networkd is not managing this link
  *   -EBUSY: udev is still processing the link, networkd does not yet know if it will manage it
  */
-int sd_network_get_link_state(unsigned index, char **state);
+int sd_network_get_link_state(unsigned ifindex, char **state);
 
 /* Get operatinal state from ifindex.
  * Possible states: unknown, dormant, carrier, degraded, routable
  * Possible return codes:
  *   -ENODATA: networkd is not aware of the link
  */
-int sd_network_get_link_operational_state(unsigned index, char **state);
+int sd_network_get_link_operational_state(unsigned ifindex, char **state);
 
 /* Get overall opeartional state
  * Possible states: unknown, dormant, carrier, degraded, routable
@@ -75,32 +75,32 @@ int sd_network_get_link_operational_state(unsigned index, char **state);
 int sd_network_get_operational_state(char **state);
 
 /* Returns true if link exists and is loopback, and false otherwise */
-int sd_network_link_is_loopback(unsigned index);
+int sd_network_link_is_loopback(unsigned ifindex);
 
 /* Get DHCPv4 lease from ifindex. */
-int sd_network_get_dhcp_lease(unsigned index, sd_dhcp_lease **ret);
+int sd_network_get_dhcp_lease(unsigned ifindex, sd_dhcp_lease **ret);
 
 /* Returns true if link is configured to respect DNS entries received by DHCP */
-int sd_network_dhcp_use_dns(unsigned index);
+int sd_network_dhcp_use_dns(unsigned ifindex);
 
 /* Returns true if link is configured to respect NTP entries received by DHCP */
-int sd_network_dhcp_use_ntp(unsigned index);
+int sd_network_dhcp_use_ntp(unsigned ifindex);
 
 /* Get IPv4 DNS entries statically configured for the link */
-int sd_network_get_dns(unsigned index, struct in_addr **addr);
+int sd_network_get_dns(unsigned ifindex, struct in_addr **addr);
 
 /* Get IPv4 NTP entries statically configured for the link */
-int sd_network_get_ntp(unsigned index, struct in_addr **addr);
+int sd_network_get_ntp(unsigned ifindex, struct in_addr **addr);
 
 /* Get IPv6 DNS entries statically configured for the link */
-int sd_network_get_dns6(unsigned index, struct in6_addr **addr);
+int sd_network_get_dns6(unsigned ifindex, struct in6_addr **addr);
 
 /* Get IPv6 NTP entries statically configured for the link */
-int sd_network_get_ntp6(unsigned index, struct in6_addr **addr);
+int sd_network_get_ntp6(unsigned ifindex, struct in6_addr **addr);
 
 /* Get all network interfaces' indices, and store them in *indices. Returns
  * the number of indices. If indices is NULL, only returns the number of indices. */
-int sd_network_get_ifindices(unsigned **indices);
+int sd_network_get_ifindices(unsigned **ifindices);
 
 /* Monitor object */
 typedef struct sd_network_monitor sd_network_monitor;

commit 8b9652a711ea3cebfc607435d66590b4a18aac77
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Jul 17 01:41:03 2014 +0200

    sd-network: if a boolean is mising, we should just take it as false
    
    That way, we can deprecate fields later on without problems

diff --git a/src/network/sd-network.c b/src/network/sd-network.c
index 317d087..1b7518f 100644
--- a/src/network/sd-network.c
+++ b/src/network/sd-network.c
@@ -235,7 +235,7 @@ static int network_get_boolean(const char *key, unsigned index) {
         if (r < 0)
                 return r;
         else if (!s)
-                return -EIO;
+                return false;
 
         return parse_boolean(s);
 }

commit a2ba62c719224a4b47751623ca5e8b0333f49721
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Jul 17 01:39:46 2014 +0200

    sd-network: remove redundant array size parameter from functions that return arrays
    
    As long as the number of array entries is relatively small it's nicer to
    simply return the number of entries directly, instead of using a size_t*
    return parameter for it.

diff --git a/src/libsystemd-network/network-internal.c b/src/libsystemd-network/network-internal.c
index 7a7a4ea..e209b0f 100644
--- a/src/libsystemd-network/network-internal.c
+++ b/src/libsystemd-network/network-internal.c
@@ -339,7 +339,7 @@ int net_parse_inaddr(const char *address, unsigned char *family, void *dst) {
         return 0;
 }
 
-void serialize_in_addrs(FILE *f, const char *key, struct in_addr *addresses, size_t size) {
+void serialize_in_addrs(FILE *f, const char *key, const struct in_addr *addresses, size_t size) {
         unsigned i;
 
         assert(f);
@@ -356,14 +356,13 @@ void serialize_in_addrs(FILE *f, const char *key, struct in_addr *addresses, siz
         fputs("\n", f);
 }
 
-int deserialize_in_addrs(struct in_addr **ret, size_t *ret_size, const char *string) {
+int deserialize_in_addrs(struct in_addr **ret, const char *string) {
         _cleanup_free_ struct in_addr *addresses = NULL;
-        size_t size = 0;
+        int size = 0;
         char *word, *state;
         size_t len;
 
         assert(ret);
-        assert(ret_size);
         assert(string);
 
         FOREACH_WORD(word, len, string, state) {
@@ -388,21 +387,19 @@ int deserialize_in_addrs(struct in_addr **ret, size_t *ret_size, const char *str
                 size ++;
         }
 
-        *ret_size = size;
         *ret = addresses;
         addresses = NULL;
 
-        return 0;
+        return size;
 }
 
-int deserialize_in6_addrs(struct in6_addr **ret, size_t *ret_size, const char *string) {
+int deserialize_in6_addrs(struct in6_addr **ret, const char *string) {
         _cleanup_free_ struct in6_addr *addresses = NULL;
-        size_t size = 0;
+        int size = 0;
         char *word, *state;
         size_t len;
 
         assert(ret);
-        assert(ret_size);
         assert(string);
 
         FOREACH_WORD(word, len, string, state) {
@@ -427,11 +424,10 @@ int deserialize_in6_addrs(struct in6_addr **ret, size_t *ret_size, const char *s
                 size++;
         }
 
-        *ret_size = size;
         *ret = addresses;
         addresses = NULL;
 
-        return 0;
+        return size;
 }
 
 void serialize_dhcp_routes(FILE *f, const char *key, struct sd_dhcp_route *routes, size_t size) {
diff --git a/src/libsystemd-network/network-internal.h b/src/libsystemd-network/network-internal.h
index 4bde146..53c364a 100644
--- a/src/libsystemd-network/network-internal.h
+++ b/src/libsystemd-network/network-internal.h
@@ -67,10 +67,9 @@ int net_parse_inaddr(const char *address, unsigned char *family, void *dst);
 int net_get_unique_predictable_data(struct udev_device *device, uint8_t result[8]);
 const char *net_get_name(struct udev_device *device);
 
-void serialize_in_addrs(FILE *f, const char *key, struct in_addr *addresses, size_t size);
-int deserialize_in_addrs(struct in_addr **addresses, size_t *size, const char *string);
-int deserialize_in6_addrs(struct in6_addr **addresses, size_t *size, const char *string);
-
+void serialize_in_addrs(FILE *f, const char *key, const struct in_addr *addresses, size_t size);
+int deserialize_in_addrs(struct in_addr **addresses, const char *string);
+int deserialize_in6_addrs(struct in6_addr **addresses, const char *string);
 
 /* don't include "dhcp-lease-internal.h" as it causes conflicts between netinet/ip.h and linux/ip.h */
 struct sd_dhcp_route;
diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c
index 20a95f6..4ed30f5 100644
--- a/src/libsystemd-network/sd-dhcp-lease.c
+++ b/src/libsystemd-network/sd-dhcp-lease.c
@@ -68,28 +68,26 @@ int sd_dhcp_lease_get_mtu(sd_dhcp_lease *lease, uint16_t *mtu) {
         return 0;
 }
 
-int sd_dhcp_lease_get_dns(sd_dhcp_lease *lease, struct in_addr **addr, size_t *addr_size) {
+int sd_dhcp_lease_get_dns(sd_dhcp_lease *lease, const struct in_addr **addr) {
         assert_return(lease, -EINVAL);
         assert_return(addr, -EINVAL);
-        assert_return(addr_size, -EINVAL);
 
         if (lease->dns_size) {
-                *addr_size = lease->dns_size;
                 *addr = lease->dns;
+                return lease->dns_size;
         } else
                 return -ENOENT;
 
         return 0;
 }
 
-int sd_dhcp_lease_get_ntp(sd_dhcp_lease *lease, struct in_addr **addr, size_t *addr_size) {
+int sd_dhcp_lease_get_ntp(sd_dhcp_lease *lease, const struct in_addr **addr) {
         assert_return(lease, -EINVAL);
         assert_return(addr, -EINVAL);
-        assert_return(addr_size, -EINVAL);
 
         if (lease->ntp_size) {
-                *addr_size = lease->ntp_size;
                 *addr = lease->ntp;
+                return lease->ntp_size;
         } else
                 return -ENOENT;
 
@@ -171,16 +169,14 @@ int sd_dhcp_lease_get_next_server(sd_dhcp_lease *lease, struct in_addr *addr) {
         return 0;
 }
 
-int sd_dhcp_lease_get_routes(sd_dhcp_lease *lease, struct sd_dhcp_route **routes,
-        size_t *routes_size) {
+int sd_dhcp_lease_get_routes(sd_dhcp_lease *lease, struct sd_dhcp_route **routes) {
 
         assert_return(lease, -EINVAL);
         assert_return(routes, -EINVAL);
-        assert_return(routes_size, -EINVAL);
 
         if (lease->static_route_size) {
                 *routes = lease->static_route;
-                *routes_size = lease->static_route_size;
+                return lease->static_route_size;
         } else
                 return -ENOENT;
 
@@ -587,12 +583,10 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
         _cleanup_free_ char *temp_path = NULL;
         _cleanup_fclose_ FILE *f = NULL;
         struct in_addr address;
-        struct in_addr *addresses;
-        size_t addresses_size;
+        const struct in_addr *addresses;
         const char *string;
         uint16_t mtu;
         struct sd_dhcp_route *routes;
-        size_t routes_size;
         int r;
 
         assert(lease);
@@ -635,13 +629,13 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
         if (r >= 0)
                 fprintf(f, "MTU=%" PRIu16 "\n", mtu);
 
-        r = sd_dhcp_lease_get_dns(lease, &addresses, &addresses_size);
+        r = sd_dhcp_lease_get_dns(lease, &addresses);
         if (r >= 0)
-                serialize_in_addrs(f, "DNS", addresses, addresses_size);
+                serialize_in_addrs(f, "DNS", addresses, r);
 
-        r = sd_dhcp_lease_get_ntp(lease, &addresses, &addresses_size);
+        r = sd_dhcp_lease_get_ntp(lease, &addresses);
         if (r >= 0)
-                serialize_in_addrs(f, "NTP", addresses, addresses_size);
+                serialize_in_addrs(f, "NTP", addresses, r);
 
         r = sd_dhcp_lease_get_domainname(lease, &string);
         if (r >= 0)
@@ -655,9 +649,9 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
         if (r >= 0)
                 fprintf(f, "ROOT_PATH=%s\n", string);
 
-        r = sd_dhcp_lease_get_routes(lease, &routes, &routes_size);
+        r = sd_dhcp_lease_get_routes(lease, &routes);
         if (r >= 0)
-                serialize_dhcp_routes(f, "ROUTES", routes, routes_size);
+                serialize_dhcp_routes(f, "ROUTES", routes, r);
 
         r = 0;
 
@@ -750,15 +744,19 @@ int dhcp_lease_load(const char *lease_file, sd_dhcp_lease **ret) {
         }
 
         if (dns) {
-                r = deserialize_in_addrs(&lease->dns, &lease->dns_size, dns);
+                r = deserialize_in_addrs(&lease->dns, dns);
                 if (r < 0)
                         return r;
+
+                lease->dns_size = r;
         }
 
         if (ntp) {
-                r = deserialize_in_addrs(&lease->ntp, &lease->ntp_size, dns);
+                r = deserialize_in_addrs(&lease->ntp, ntp);
                 if (r < 0)
                         return r;
+
+                lease->ntp_size = r;
         }
 
         if (mtu) {
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 0fb323b..94683a5 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -401,20 +401,18 @@ static int route_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
 
 static int link_set_dhcp_routes(Link *link) {
         struct sd_dhcp_route *static_routes;
-        size_t static_routes_size;
-        int r;
-        unsigned i;
+        int r, n, i;
 
         assert(link);
 
-        r = sd_dhcp_lease_get_routes(link->dhcp_lease, &static_routes, &static_routes_size);
-        if (r < 0) {
-                if (r != -ENOENT)
-                        log_warning_link(link, "DHCP error: could not get routes: %s", strerror(-r));
-                return r;
+        n = sd_dhcp_lease_get_routes(link->dhcp_lease, &static_routes);
+        if (n < 0) {
+                if (n != -ENOENT)
+                        log_warning_link(link, "DHCP error: could not get routes: %s", strerror(-n));
+                return n;
         }
 
-        for (i = 0; i < static_routes_size; i++) {
+        for (i = 0; i < n; i++) {
                 _cleanup_route_free_ Route *route = NULL;
 
                 r = route_new_dynamic(&route);
@@ -955,7 +953,6 @@ static int dhcp_lease_lost(Link *link) {
         struct in_addr netmask;
         struct in_addr gateway;
         unsigned prefixlen;
-        unsigned i;
         int r;
 
         assert(link);
@@ -965,11 +962,11 @@ static int dhcp_lease_lost(Link *link) {
 
         if (link->network->dhcp_routes) {
                 struct sd_dhcp_route *routes;
-                size_t routes_size;
+                int n, i;
 
-                r = sd_dhcp_lease_get_routes(link->dhcp_lease, &routes, &routes_size);
-                if (r >= 0) {
-                        for (i = 0; i < routes_size; i++) {
+                n = sd_dhcp_lease_get_routes(link->dhcp_lease, &routes);
+                if (n >= 0) {
+                        for (i = 0; i < n; i++) {
                                 _cleanup_route_free_ Route *route = NULL;
 
                                 r = route_new_dynamic(&route);
diff --git a/src/network/sd-network.c b/src/network/sd-network.c
index 2057e53..317d087 100644
--- a/src/network/sd-network.c
+++ b/src/network/sd-network.c
@@ -168,13 +168,12 @@ _public_ int sd_network_get_dhcp_lease(unsigned index, sd_dhcp_lease **ret) {
         return 0;
 }
 
-static int network_get_in_addr(const char *key, unsigned index, struct in_addr **addr, size_t *addr_size) {
+static int network_get_in_addr(const char *key, unsigned index, struct in_addr **addr) {
         _cleanup_free_ char *p = NULL, *s = NULL;
         int r;
 
         assert_return(index, -EINVAL);
         assert_return(addr, -EINVAL);
-        assert_return(addr_size, -EINVAL);
 
         if (asprintf(&p, "/run/systemd/netif/links/%u", index) < 0)
                 return -ENOMEM;
@@ -185,24 +184,23 @@ static int network_get_in_addr(const char *key, unsigned index, struct in_addr *
         else if (!s)
                 return -EIO;
 
-        return deserialize_in_addrs(addr, addr_size, s);
+        return deserialize_in_addrs(addr, s);
 }
 
-_public_ int sd_network_get_dns(unsigned index, struct in_addr **addr, size_t *addr_size) {
-        return network_get_in_addr("DNS", index, addr, addr_size);
+_public_ int sd_network_get_dns(unsigned index, struct in_addr **addr) {
+        return network_get_in_addr("DNS", index, addr);
 }
 
-_public_ int sd_network_get_ntp(unsigned index, struct in_addr **addr, size_t *addr_size) {
-        return network_get_in_addr("NTP", index, addr, addr_size);
+_public_ int sd_network_get_ntp(unsigned index, struct in_addr **addr) {
+        return network_get_in_addr("NTP", index, addr);
 }
 
-static int network_get_in6_addr(const char *key, unsigned index, struct in6_addr **addr, size_t *addr_size) {
+static int network_get_in6_addr(const char *key, unsigned index, struct in6_addr **addr) {
         _cleanup_free_ char *p = NULL, *s = NULL;
         int r;
 
         assert_return(index, -EINVAL);
         assert_return(addr, -EINVAL);
-        assert_return(addr_size, -EINVAL);
 
         if (asprintf(&p, "/run/systemd/netif/links/%u", index) < 0)
                 return -ENOMEM;
@@ -213,15 +211,15 @@ static int network_get_in6_addr(const char *key, unsigned index, struct in6_addr
         else if (!s)
                 return -EIO;
 
-        return deserialize_in6_addrs(addr, addr_size, s);
+        return deserialize_in6_addrs(addr, s);
 }
 
-_public_ int sd_network_get_dns6(unsigned index, struct in6_addr **addr, size_t *addr_size) {
-        return network_get_in6_addr("DNS", index, addr, addr_size);
+_public_ int sd_network_get_dns6(unsigned index, struct in6_addr **addr) {
+        return network_get_in6_addr("DNS", index, addr);
 }
 
-_public_ int sd_network_get_ntp6(unsigned index, struct in6_addr **addr, size_t *addr_size) {
-        return network_get_in6_addr("NTP", index, addr, addr_size);
+_public_ int sd_network_get_ntp6(unsigned index, struct in6_addr **addr) {
+        return network_get_in6_addr("NTP", index, addr);
 }
 
 static int network_get_boolean(const char *key, unsigned index) {
diff --git a/src/network/test-network.c b/src/network/test-network.c
index 08b37b1..3dc051d 100644
--- a/src/network/test-network.c
+++ b/src/network/test-network.c
@@ -28,7 +28,7 @@ static void test_deserialize_in_addr(void) {
         _cleanup_free_ struct in6_addr *addresses6 = NULL;
         struct in_addr  a, b, c;
         struct in6_addr d, e, f;
-        size_t size;
+        int size;
         const char *addresses_string = "192.168.0.1 0:0:0:0:0:FFFF:204.152.189.116 192.168.0.2 ::1 192.168.0.3 1:0:0:0:0:0:0:8";
 
         assert_se(inet_pton(AF_INET, "0:0:0:0:0:FFFF:204.152.189.116", &a) == 0);
@@ -41,13 +41,13 @@ static void test_deserialize_in_addr(void) {
         assert_se(inet_pton(AF_INET6, "::1", &e) == 1);
         assert_se(inet_pton(AF_INET6, "1:0:0:0:0:0:0:8", &f) == 1);
 
-        assert_se(deserialize_in_addrs(&addresses, &size, addresses_string) >= 0);
+        assert_se((size = deserialize_in_addrs(&addresses, addresses_string)) >= 0);
         assert_se(size == 3);
         assert_se(!memcmp(&a, &addresses[0], sizeof(struct in_addr)));
         assert_se(!memcmp(&b, &addresses[1], sizeof(struct in_addr)));
         assert_se(!memcmp(&c, &addresses[2], sizeof(struct in_addr)));
 
-        assert_se(deserialize_in6_addrs(&addresses6, &size, addresses_string) >= 0);
+        assert_se((size = deserialize_in6_addrs(&addresses6, addresses_string)) >= 0);
         assert_se(size == 3);
         assert_se(!memcmp(&d, &addresses6[0], sizeof(struct in6_addr)));
         assert_se(!memcmp(&e, &addresses6[1], sizeof(struct in6_addr)));
diff --git a/src/resolve/resolved-link.c b/src/resolve/resolved-link.c
index 61b112c..e309b80 100644
--- a/src/resolve/resolved-link.c
+++ b/src/resolve/resolved-link.c
@@ -100,11 +100,9 @@ int link_update_rtnl(Link *l, sd_rtnl_message *m) {
 
 static int update_dhcp_dns_servers(Link *l) {
         _cleanup_dhcp_lease_unref_ sd_dhcp_lease *lease = NULL;
-        struct in_addr *nameservers = NULL;
+        const struct in_addr *nameservers = NULL;
         DnsServer *s, *nx;
-        unsigned i;
-        size_t n;
-        int r;
+        int r, n, i;
 
         assert(l);
 
@@ -119,9 +117,11 @@ static int update_dhcp_dns_servers(Link *l) {
         LIST_FOREACH(servers, s, l->dhcp_dns_servers)
                 s->marked = true;
 
-        r = sd_dhcp_lease_get_dns(lease, &nameservers, &n);
-        if (r < 0)
+        n = sd_dhcp_lease_get_dns(lease, &nameservers);
+        if (n < 0) {
+                r = n;
                 goto clear;
+        }
 
         for (i = 0; i < n; i++) {
                 union in_addr_union a = { .in = nameservers[i] };
@@ -153,18 +153,18 @@ static int update_link_dns_servers(Link *l) {
         _cleanup_free_ struct in_addr *nameservers = NULL;
         _cleanup_free_ struct in6_addr *nameservers6 = NULL;
         DnsServer *s, *nx;
-        unsigned i;
-        size_t n;
-        int r;
+        int r, n, i;
 
         assert(l);
 
         LIST_FOREACH(servers, s, l->link_dns_servers)
                 s->marked = true;
 
-        r = sd_network_get_dns(l->ifindex, &nameservers, &n);
-        if (r < 0)
+        n = sd_network_get_dns(l->ifindex, &nameservers);
+        if (n < 0) {
+                r = n;
                 goto clear;
+        }
 
         for (i = 0; i < n; i++) {
                 union in_addr_union a = { .in = nameservers[i] };
@@ -179,9 +179,11 @@ static int update_link_dns_servers(Link *l) {
                 }
         }
 
-        r = sd_network_get_dns6(l->ifindex, &nameservers6, &n);
-        if (r < 0)
+        n = sd_network_get_dns6(l->ifindex, &nameservers6);
+        if (n < 0) {
+                r = n;
                 goto clear;
+        }
 
         for (i = 0; i < n; i++) {
                 union in_addr_union a = { .in6 = nameservers6[i] };
diff --git a/src/systemd/sd-dhcp-lease.h b/src/systemd/sd-dhcp-lease.h
index 6e8ceff..a3728a7 100644
--- a/src/systemd/sd-dhcp-lease.h
+++ b/src/systemd/sd-dhcp-lease.h
@@ -38,12 +38,12 @@ int sd_dhcp_lease_get_netmask(sd_dhcp_lease *lease, struct in_addr *addr);
 int sd_dhcp_lease_get_router(sd_dhcp_lease *lease, struct in_addr *addr);
 int sd_dhcp_lease_get_next_server(sd_dhcp_lease *lease, struct in_addr *addr);
 int sd_dhcp_lease_get_server_identifier(sd_dhcp_lease *lease, struct in_addr *addr);
-int sd_dhcp_lease_get_dns(sd_dhcp_lease *lease, struct in_addr **addr, size_t *addr_size);
-int sd_dhcp_lease_get_ntp(sd_dhcp_lease *lease, struct in_addr **addr, size_t *addr_size);
+int sd_dhcp_lease_get_dns(sd_dhcp_lease *lease, const struct in_addr **addr);
+int sd_dhcp_lease_get_ntp(sd_dhcp_lease *lease, const struct in_addr **addr);
 int sd_dhcp_lease_get_mtu(sd_dhcp_lease *lease, uint16_t *mtu);
 int sd_dhcp_lease_get_domainname(sd_dhcp_lease *lease, const char **domainname);
 int sd_dhcp_lease_get_hostname(sd_dhcp_lease *lease, const char **hostname);
 int sd_dhcp_lease_get_root_path(sd_dhcp_lease *lease, const char **root_path);
-int sd_dhcp_lease_get_routes(sd_dhcp_lease *lease, struct sd_dhcp_route **routes, size_t *routes_size);
+int sd_dhcp_lease_get_routes(sd_dhcp_lease *lease, struct sd_dhcp_route **routesgn);
 
 #endif
diff --git a/src/systemd/sd-network.h b/src/systemd/sd-network.h
index 0eaefdc..30e920d 100644
--- a/src/systemd/sd-network.h
+++ b/src/systemd/sd-network.h
@@ -87,16 +87,16 @@ int sd_network_dhcp_use_dns(unsigned index);
 int sd_network_dhcp_use_ntp(unsigned index);
 
 /* Get IPv4 DNS entries statically configured for the link */
-int sd_network_get_dns(unsigned index, struct in_addr **addr, size_t *addr_size);
+int sd_network_get_dns(unsigned index, struct in_addr **addr);
 
 /* Get IPv4 NTP entries statically configured for the link */
-int sd_network_get_ntp(unsigned index, struct in_addr **addr, size_t *addr_size);
+int sd_network_get_ntp(unsigned index, struct in_addr **addr);
 
 /* Get IPv6 DNS entries statically configured for the link */
-int sd_network_get_dns6(unsigned index, struct in6_addr **addr, size_t *addr_size);
+int sd_network_get_dns6(unsigned index, struct in6_addr **addr);
 
 /* Get IPv6 NTP entries statically configured for the link */
-int sd_network_get_ntp6(unsigned index, struct in6_addr **addr, size_t *addr_size);
+int sd_network_get_ntp6(unsigned index, struct in6_addr **addr);
 
 /* Get all network interfaces' indices, and store them in *indices. Returns
  * the number of indices. If indices is NULL, only returns the number of indices. */

commit b45d9e86e41c453e0b57f2f8316bef06dee42e5a
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Jul 17 01:14:19 2014 +0200

    resolved: fix check for mdns names

diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c
index 7b5580f..1fa8401 100644
--- a/src/resolve/resolved-dns-scope.c
+++ b/src/resolve/resolved-dns-scope.c
@@ -194,7 +194,7 @@ DnsScopeMatch dns_scope_test(DnsScope *s, const char *domain) {
                 if (dns_name_endswith(domain, "254.169.in-addr.arpa") ||
                     dns_name_endswith(domain, "0.8.e.f.ip6.arpa"))
                         return DNS_SCOPE_YES;
-                else if (dns_name_endswith(domain, "local") ||
+                else if (dns_name_endswith(domain, "local") &&
                          !dns_name_single_label(domain))
                         return DNS_SCOPE_MAYBE;
 

commit faec72d5dedae93f43c2dd624de1392ed9bacd80
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Jul 17 01:14:07 2014 +0200

    resolved: we are never authoritative for localhost

diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c
index a39e705..7b5580f 100644
--- a/src/resolve/resolved-dns-scope.c
+++ b/src/resolve/resolved-dns-scope.c
@@ -187,6 +187,9 @@ DnsScopeMatch dns_scope_test(DnsScope *s, const char *domain) {
         if (dns_name_root(domain))
                 return DNS_SCOPE_NO;
 
+        if (is_localhost(domain))
+                return DNS_SCOPE_NO;
+
         if (s->type == DNS_SCOPE_MDNS) {
                 if (dns_name_endswith(domain, "254.169.in-addr.arpa") ||
                     dns_name_endswith(domain, "0.8.e.f.ip6.arpa"))

commit e1c959948c0e31d6997bcdfbabfbd077784b2bae
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Jul 17 01:13:22 2014 +0200

    resolved: properly handle MTU logic

diff --git a/src/resolve/resolved-dns-packet.h b/src/resolve/resolved-dns-packet.h
index 99f60a1..de3a789 100644
--- a/src/resolve/resolved-dns-packet.h
+++ b/src/resolve/resolved-dns-packet.h
@@ -44,8 +44,12 @@ struct DnsPacketHeader {
 
 /* The various DNS protocols deviate in how large a packet can grow,
    but the TCP transport has a 16bit size field, hence that appears to
-   be the maximum. */
+   be the absolute maximum. */
 #define DNS_PACKET_SIZE_MAX 0xFFFF
+
+/* RFC 1035 say 512 is the maximum, for classic unicast DNS */
+#define DNS_PACKET_UNICAST_SIZE_MAX 512
+
 #define DNS_PACKET_SIZE_START 512
 
 struct DnsPacket {
diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c
index 0a70cb1..a39e705 100644
--- a/src/resolve/resolved-dns-scope.c
+++ b/src/resolve/resolved-dns-scope.c
@@ -102,8 +102,19 @@ int dns_scope_send(DnsScope *s, DnsPacket *p) {
                         return -EMSGSIZE;
 
                 ifindex = s->link->ifindex;
+        } else {
+                uint32_t mtu;
+
+                mtu = manager_find_mtu(s->manager);
+                if (mtu > 0) {
+                        if (p->size > mtu)
+                                return -EMSGSIZE;
+                }
         }
 
+        if (p->size > DNS_PACKET_UNICAST_SIZE_MAX)
+                return -EMSGSIZE;
+
         if (srv->family == AF_INET)
                 r = manager_dns_ipv4_send(s->manager, srv, ifindex, p);
         else if (srv->family == AF_INET6)
diff --git a/src/resolve/resolved-link.c b/src/resolve/resolved-link.c
index 9c886a2..61b112c 100644
--- a/src/resolve/resolved-link.c
+++ b/src/resolve/resolved-link.c
@@ -91,6 +91,10 @@ int link_update_rtnl(Link *l, sd_rtnl_message *m) {
         if (r < 0)
                 return r;
 
+        r = sd_rtnl_message_read_u32(m, IFLA_MTU, &l->mtu);
+        if (r < 0)
+                return r;
+
         return 0;
 }
 
diff --git a/src/resolve/resolved-link.h b/src/resolve/resolved-link.h
index 07f68ab..c0ea236 100644
--- a/src/resolve/resolved-link.h
+++ b/src/resolve/resolved-link.h
@@ -58,7 +58,7 @@ struct Link {
         DnsScope *mdns_ipv4_scope;
         DnsScope *mdns_ipv6_scope;
 
-        size_t mtu;
+        uint32_t mtu;
 
         char *operational_state;
 
diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c
index 5fbb500..fed9a77 100644
--- a/src/resolve/resolved-manager.c
+++ b/src/resolve/resolved-manager.c
@@ -878,3 +878,23 @@ void manager_next_dns_server(Manager *m) {
 
         m->current_dns_server = m->dns_servers;
 }
+
+uint32_t manager_find_mtu(Manager *m) {
+        uint32_t mtu = 0;
+        Link *l;
+        Iterator i;
+
+        /* If we don't know on which link a DNS packet would be
+         * delivered, let's find the largest MTU that works on all
+         * interfaces we know of */
+
+        HASHMAP_FOREACH(l, m->links, i) {
+                if (l->mtu <= 0)
+                        continue;
+
+                if (mtu <= 0 || l->mtu < mtu)
+                        mtu = l->mtu;
+        }
+
+        return mtu;
+}
diff --git a/src/resolve/resolved.h b/src/resolve/resolved.h
index 438730b..c592a7e 100644
--- a/src/resolve/resolved.h
+++ b/src/resolve/resolved.h
@@ -79,6 +79,7 @@ int manager_write_resolv_conf(Manager *m);
 DnsServer* manager_find_dns_server(Manager *m, unsigned char family, union in_addr_union *in_addr);
 DnsServer *manager_get_dns_server(Manager *m);
 void manager_next_dns_server(Manager *m);
+uint32_t manager_find_mtu(Manager *m);
 
 int manager_dns_ipv4_fd(Manager *m);
 int manager_dns_ipv4_send(Manager *m, DnsServer *srv, int ifindex, DnsPacket *p);

commit 76f468c8ea568fce98fa75d7f1d540256eb0940a
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Jul 17 01:10:47 2014 +0200

    dns-domain: enforce maximum DNS domain name length

diff --git a/src/resolve/resolved-dns-domain.c b/src/resolve/resolved-dns-domain.c
index 27739c1..a41052d 100644
--- a/src/resolve/resolved-dns-domain.c
+++ b/src/resolve/resolved-dns-domain.c
@@ -203,6 +203,9 @@ int dns_name_normalize(const char *s, char **_ret) {
                 n += r;
         }
 
+        if (n > DNS_NAME_MAX)
+                return -EINVAL;
+
         if (!GREEDY_REALLOC(ret, allocated, n + 1))
                 return -ENOMEM;
 
diff --git a/src/resolve/resolved-dns-domain.h b/src/resolve/resolved-dns-domain.h
index d6b4bdd..809c4da 100644
--- a/src/resolve/resolved-dns-domain.h
+++ b/src/resolve/resolved-dns-domain.h
@@ -25,6 +25,7 @@
 #include "in-addr-util.h"
 
 #define DNS_LABEL_MAX 63
+#define DNS_NAME_MAX 255
 
 int dns_label_unescape(const char **name, char *dest, size_t sz);
 int dns_label_escape(const char *p, size_t l, char **ret);

commit 0014a4ad505d119c7ac4346d9d774c3f17f663a5
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Jul 17 01:07:17 2014 +0200

    sd-network: fix parameter order for sd_network_monitor_new()
    
    Constructors should return the object they created as first parameter,
    except when they are generated as a child/member object of some other
    object in which case that should be first.

diff --git a/src/network/networkd-wait-online.c b/src/network/networkd-wait-online.c
index c6038c6..c4783ca 100644
--- a/src/network/networkd-wait-online.c
+++ b/src/network/networkd-wait-online.c
@@ -252,7 +252,7 @@ int main(int argc, char *argv[]) {
                 goto out;
         }
 
-        r = sd_network_monitor_new(NULL, &m->monitor);
+        r = sd_network_monitor_new(&m->monitor, NULL);
         if (r < 0) {
                 log_error("Could not create monitor: %s", strerror(-r));
                 goto out;
diff --git a/src/network/sd-network.c b/src/network/sd-network.c
index 3ebc5d8..2057e53 100644
--- a/src/network/sd-network.c
+++ b/src/network/sd-network.c
@@ -316,7 +316,7 @@ static inline sd_network_monitor* FD_TO_MONITOR(int fd) {
         return (sd_network_monitor*) (unsigned long) (fd + 1);
 }
 
-_public_ int sd_network_monitor_new(const char *category, sd_network_monitor **m) {
+_public_ int sd_network_monitor_new(sd_network_monitor **m, const char *category) {
         int fd, k;
         bool good = false;
 
diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c
index ab504d0..5fbb500 100644
--- a/src/resolve/resolved-manager.c
+++ b/src/resolve/resolved-manager.c
@@ -282,7 +282,7 @@ static int manager_network_monitor_listen(Manager *m) {
 
         assert(m);
 
-        r = sd_network_monitor_new(NULL, &m->network_monitor);
+        r = sd_network_monitor_new(&m->network_monitor, NULL);
         if (r < 0)
                 return r;
 
diff --git a/src/systemd/sd-network.h b/src/systemd/sd-network.h
index 7d05086..0eaefdc 100644
--- a/src/systemd/sd-network.h
+++ b/src/systemd/sd-network.h
@@ -106,7 +106,7 @@ int sd_network_get_ifindices(unsigned **indices);
 typedef struct sd_network_monitor sd_network_monitor;
 
 /* Create a new monitor. Category must be NULL, "links" or "leases". */
-int sd_network_monitor_new(const char *category, sd_network_monitor **ret);
+int sd_network_monitor_new(sd_network_monitor **ret, const char *category);
 
 /* Destroys the passed monitor. Returns NULL. */
 sd_network_monitor* sd_network_monitor_unref(sd_network_monitor *m);
diff --git a/src/timesync/timesyncd.c b/src/timesync/timesyncd.c
index e4e3aae..732f5bf 100644
--- a/src/timesync/timesyncd.c
+++ b/src/timesync/timesyncd.c
@@ -1152,7 +1152,7 @@ static int manager_network_monitor_listen(Manager *m) {
         _cleanup_network_monitor_unref_ sd_network_monitor *monitor = NULL;
         int r, fd, events;
 
-        r = sd_network_monitor_new(NULL, &monitor);
+        r = sd_network_monitor_new(&monitor, NULL);
         if (r < 0)
                 return r;
 



More information about the systemd-commits mailing list