link->route_messages --;
- if (link->state == LINK_STATE_FAILED)
+ if (link->state == LINK_STATE_FAILED) {
+ link_unref(link);
return 1;
+ }
r = sd_rtnl_message_get_errno(m);
if (r < 0 && r != -EEXIST)
link_enter_configured(link);
}
+ link_unref(link);
+
return 1;
}
return r;
}
+ link_ref(link);
link->route_messages ++;
}
return r;
}
+ link_ref(link);
link->route_messages ++;
}
}
return r;
}
+ link_ref(link);
link->route_messages ++;
route->family = AF_INET;
return r;
}
+ link_ref(link);
link->route_messages ++;
}
}
assert(link);
assert(link->ifname);
- if (link->state == LINK_STATE_FAILED)
+ if (link->state == LINK_STATE_FAILED) {
+ link_unref(link);
return 1;
+ }
r = sd_rtnl_message_get_errno(m);
if (r < 0 && r != -ENOENT)
"ERRNO=%d", -r,
NULL);
+ link_unref(link);
+
return 0;
}
link->addr_messages --;
- if (link->state == LINK_STATE_FAILED)
+ if (link->state == LINK_STATE_FAILED) {
+ link_unref(link);
return 1;
+ }
r = sd_rtnl_message_get_errno(m);
if (r < 0 && r != -EEXIST)
link_enter_set_routes(link);
}
+ link_unref(link);
+
return 1;
}
return r;
}
+ link_ref(link);
link->addr_messages ++;
}
return r;
}
+ link_ref(link);
link->addr_messages ++;
}
}
return r;
}
+ link_ref(link);
link->addr_messages ++;
}
assert(link);
assert(link->ifname);
- if (link->state == LINK_STATE_FAILED)
+ if (link->state == LINK_STATE_FAILED) {
+ link_unref(link);
return 1;
+ }
r = sd_rtnl_message_get_errno(m);
if (r < 0 && r != -ENOENT)
"ERRNO=%d", -r,
NULL);
+ link_unref(link);
+
return 0;
}
assert(link);
assert(link->ifname);
- if (link->state == LINK_STATE_FAILED)
+ if (link->state == LINK_STATE_FAILED) {
+ link_unref(link);
return 1;
+ }
r = sd_rtnl_message_get_errno(m);
if (r < 0 && r != -ENOENT)
"ERRNO=%d", -r,
NULL);
+ link_unref(link);
+
return 0;
}
static int set_hostname_handler(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
+ Link *link = userdata;
int r;
+ assert(link);
+
r = sd_bus_message_get_errno(m);
if (r < 0)
log_warning("Could not set hostname: %s", strerror(-r));
+ link_unref(link);
+
return 1;
}
-static int set_hostname(sd_bus *bus, const char *hostname) {
+static int link_set_hostname(Link *link, const char *hostname) {
_cleanup_bus_message_unref_ sd_bus_message *m = NULL;
int r = 0;
+ assert(link);
+ assert(link->manager);
assert(hostname);
- log_debug("Setting transient hostname: '%s'", hostname);
+ log_debug_link(link, "Setting transient hostname: '%s'", hostname);
- if (!bus) { /* TODO: replace by assert when we can rely on kdbus */
- log_info("Not connected to system bus, ignoring transient hostname.");
+ if (!link->manager->bus) { /* TODO: replace by assert when we can rely on kdbus */
+ log_info_link(link, "Not connected to system bus, ignoring transient hostname.");
return 0;
}
r = sd_bus_message_new_method_call(
- bus,
+ link->manager->bus,
&m,
"org.freedesktop.hostname1",
"/org/freedesktop/hostname1",
if (r < 0)
return r;
- r = sd_bus_call_async(bus, m, set_hostname_handler, NULL, 0, NULL);
+ r = sd_bus_call_async(link->manager->bus, m, set_hostname_handler, link, 0, NULL);
if (r < 0)
- log_error("Could not set transient hostname: %s", strerror(-r));
+ log_error_link(link, "Could not set transient hostname: %s", strerror(-r));
+
+ link_ref(link);
return r;
}
assert(link);
assert(link->ifname);
- if (link->state == LINK_STATE_FAILED)
+ if (link->state == LINK_STATE_FAILED) {
+ link_unref(link);
return 1;
+ }
r = sd_rtnl_message_get_errno(m);
if (r < 0)
"ERRNO=%d", -r,
NULL);
+ link_unref(link);
+
return 1;
}
return r;
}
+ link_unref(link);
+
return 0;
}
route_gw->scope = RT_SCOPE_LINK;
route_drop(route_gw, link, &route_drop_handler);
+ link_ref(link);
}
r = route_new_dynamic(&route);
route->in_addr.in = gateway;
route_drop(route, link, &route_drop_handler);
+ link_ref(link);
}
}
address->prefixlen = prefixlen;
address_drop(address, link, &address_drop_handler);
+ link_ref(link);
}
if (link->network->dhcp_mtu) {
r = sd_dhcp_lease_get_hostname(link->dhcp_lease, &hostname);
if (r >= 0 && hostname) {
- r = set_hostname(link->manager->bus, "");
+ r = link_set_hostname(link, "");
if (r < 0)
log_error("Failed to reset transient hostname");
}
r = sd_dhcp_lease_get_hostname(lease, &hostname);
if (r >= 0) {
- r = set_hostname(link->manager->bus, hostname);
+ r = link_set_hostname(link, hostname);
if (r < 0)
log_error("Failed to set transient hostname "
"to '%s'", hostname);
address->broadcast.s_addr = address->in_addr.in.s_addr | htonl(0xfffffffflu >> address->prefixlen);
address_update(address, link, &address_update_handler);
+ link_ref(link);
}
return 0;
address->scope = RT_SCOPE_LINK;
address_drop(address, link, &address_drop_handler);
+ link_ref(link);
r = route_new_dynamic(&route);
if (r < 0) {
route->metrics = 99;
route_drop(route, link, &route_drop_handler);
+ link_ref(link);
}
return 0;
assert(link);
- if (link->state == LINK_STATE_FAILED)
+ if (link->state == LINK_STATE_FAILED) {
+ link_unref(link);
return 1;
+ }
r = sd_rtnl_message_get_errno(m);
if (r < 0) {
NULL);
}
+ link_unref(link);
+
return 1;
}
return r;
}
+ link_ref(link);
+
return 0;
}
link->enslaving --;
- if (link->state == LINK_STATE_FAILED)
+ if (link->state == LINK_STATE_FAILED) {
+ link_unref(link);
return 1;
+ }
r = sd_rtnl_message_get_errno(m);
if (r < 0) {
"ERRNO=%d", -r,
NULL);
link_enter_failed(link);
+ link_unref(link);
return 1;
}
if (link->enslaving == 0)
link_enslaved(link);
+ link_unref(link);
+
return 1;
}
return r;
}
+ link_ref(link);
link->enslaving ++;
}
return r;
}
+ link_ref(link);
link->enslaving ++;
}
return r;
}
+ link_ref(link);
link->enslaving ++;
}
return r;
}
+ link_ref(link);
link->enslaving ++;
}
log_info_netdev(netdev, "netdev ready");
LIST_FOREACH(callbacks, callback, netdev->callbacks) {
- /* enslave the links that were attempted to be enslaved befor the
+ /* enslave the links that were attempted to be enslaved before the
* link was ready */
netdev_enslave_ready(netdev, callback->link, callback->callback);
}
}
int netdev_enslave(NetDev *netdev, Link *link, sd_rtnl_message_handler_t callback) {
+ int r;
+
if (netdev->kind == NETDEV_KIND_VLAN || netdev->kind == NETDEV_KIND_MACVLAN)
return netdev_create(netdev, link, callback);
if (netdev->state == NETDEV_STATE_READY) {
- netdev_enslave_ready(netdev, link, callback);
+ r = netdev_enslave_ready(netdev, link, callback);
+ if (r < 0)
+ return r;
} else {
/* the netdev is not yet read, save this request for when it is*/
netdev_enslave_callback *cb;