int link_update_rtnl(Link *l, sd_rtnl_message *m) { const char *ifname; int r; assert(l); assert(l->manager); assert(m); r = sd_rtnl_message_link_get_flags(m, &l->flags); if (r < 0) return r; r = sd_rtnl_message_read_string(m, IFLA_IFNAME, &ifname); if (r < 0) return r; if (!streq(l->ifname, ifname)) { char *new_ifname; new_ifname = strdup(ifname); if (!new_ifname) return -ENOMEM; hashmap_remove(l->manager->links_by_name, l->ifname); free(l->ifname); l->ifname = new_ifname; r = hashmap_put(l->manager->links_by_name, l->ifname, l); if (r < 0) return r; } return 0; }
static bool check_loopback(sd_netlink *rtnl) { _cleanup_netlink_message_unref_ sd_netlink_message *req = NULL, *reply = NULL; unsigned flags; int r; r = sd_rtnl_message_new_link(rtnl, &req, RTM_GETLINK, LOOPBACK_IFINDEX); if (r < 0) return false; r = sd_netlink_call(rtnl, req, 0, &reply); if (r < 0) return false; r = sd_rtnl_message_link_get_flags(reply, &flags); if (r < 0) return false; return flags & IFF_UP; }
int link_update_rtnl(Link *l, sd_netlink_message *m) { const char *n = NULL; int r; assert(l); assert(m); r = sd_rtnl_message_link_get_flags(m, &l->flags); if (r < 0) return r; sd_netlink_message_read_u32(m, IFLA_MTU, &l->mtu); if (sd_netlink_message_read_string(m, IFLA_IFNAME, &n) >= 0) { strncpy(l->name, n, sizeof(l->name)-1); char_array_0(l->name); } link_allocate_scopes(l); link_add_rrs(l, false); return 0; }
static int manager_rtnl_process_link(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata) { Manager *m = userdata; Link *link; unsigned flags; int r, ifindex; r = sd_rtnl_message_link_get_ifindex(message, &ifindex); if (r < 0) return 0; link = hashmap_get(m->links, &ifindex); if (!link) return 0; r = sd_rtnl_message_link_get_flags(message, &flags); if (r < 0) return 0; r = link_update_flags(link, flags); if (r < 0) return 0; return 1; }