chiark / gitweb /
networkd: make sure Links and Networks are freed
[elogind.git] / src / network / networkd-address.c
index e02b1df864abeacba8b495da77bb2dbb5e34ada2..9fb24c95c19f2900c72222730973b4b04869c14d 100644 (file)
@@ -55,10 +55,13 @@ void address_free(Address *address) {
         free(address);
 }
 
-int address_configure(Manager *manager, Address *address, Link *link) {
+int address_configure(Address *address, Link *link,
+                      sd_rtnl_message_handler_t callback) {
         _cleanup_sd_rtnl_message_unref_ sd_rtnl_message *req = NULL;
         int r;
 
+        assert(link->manager);
+
         r = sd_rtnl_message_addr_new(RTM_NEWADDR, link->ifindex,
                         address->family, address->prefixlen,
                         IFA_F_PERMANENT, RT_SCOPE_UNIVERSE, &req);
@@ -78,8 +81,7 @@ int address_configure(Manager *manager, Address *address, Link *link) {
         if (address->family == AF_INET) {
                 struct in_addr broadcast;
 
-                broadcast.s_addr = address->in_addr.in.s_addr |
-                                   htonl(0xfffffffflu >> address->prefixlen);
+                broadcast.s_addr = address->in_addr.in.s_addr | address->netmask.s_addr;
 
                 r = sd_rtnl_message_append(req, IFA_BROADCAST, &broadcast);
                 if (r < 0) {
@@ -98,13 +100,13 @@ int address_configure(Manager *manager, Address *address, Link *link) {
                 }
         }
 
-        r = sd_rtnl_call(manager->rtnl, req, 0, NULL);
+        r = sd_rtnl_call_async(link->manager->rtnl, req, callback, link, 0, NULL);
         if (r < 0) {
-                log_error("Could not configure address: %s", strerror(-r));
-                return r != -EEXIST ? r : 0;
+                log_error("Could not send rtnetlink message: %s", strerror(-r));
+                return r;
         }
 
-        log_info("Configured interface address");
+        link->rtnl_messages ++;
 
         return 0;
 }
@@ -147,6 +149,8 @@ int config_parse_address(const char *unit,
                 }
 
                 n->prefixlen = (unsigned char) i;
+                n->netmask.s_addr = htonl(0xfffffffflu >> n->prefixlen);
+
                 address = strndup(rvalue, e - rvalue);
                 if (!address)
                         return log_oom();