]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/network/wait-online/link.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright © 2014 Tom Gundersen
6 #include "sd-network.h"
8 #include "alloc-util.h"
12 #include "string-util.h"
14 int link_new(Manager
*m
, Link
**ret
, int ifindex
, const char *ifname
) {
15 _cleanup_(link_freep
) Link
*l
= NULL
;
21 r
= hashmap_ensure_allocated(&m
->links
, NULL
);
25 r
= hashmap_ensure_allocated(&m
->links_by_name
, &string_hash_ops
);
35 l
->ifname
= strdup(ifname
);
39 r
= hashmap_put(m
->links_by_name
, l
->ifname
, l
);
45 r
= hashmap_put(m
->links
, INT_TO_PTR(ifindex
), l
);
56 Link
*link_free(Link
*l
) {
62 hashmap_remove(l
->manager
->links
, INT_TO_PTR(l
->ifindex
));
63 hashmap_remove(l
->manager
->links_by_name
, l
->ifname
);
70 int link_update_rtnl(Link
*l
, sd_netlink_message
*m
) {
78 r
= sd_rtnl_message_link_get_flags(m
, &l
->flags
);
82 r
= sd_netlink_message_read_string(m
, IFLA_IFNAME
, &ifname
);
86 if (!streq(l
->ifname
, ifname
)) {
89 new_ifname
= strdup(ifname
);
93 hashmap_remove(l
->manager
->links_by_name
, l
->ifname
);
95 l
->ifname
= new_ifname
;
97 r
= hashmap_put(l
->manager
->links_by_name
, l
->ifname
, l
);
105 int link_update_monitor(Link
*l
) {
108 l
->required_for_online
= sd_network_link_get_required_for_online(l
->ifindex
) != 0;
110 l
->operational_state
= mfree(l
->operational_state
);
112 sd_network_link_get_operational_state(l
->ifindex
, &l
->operational_state
);
114 l
->state
= mfree(l
->state
);
116 sd_network_link_get_setup_state(l
->ifindex
, &l
->state
);