1From 2ce43bae10979eb95b42432eec4c6589ee1676a1 Mon Sep 17 00:00:00 2001
2From: Michael Forney <mforney@mforney.org>
3Date: Mon, 24 Jun 2019 16:03:55 -0700
4Subject: [PATCH] ip: Fix get_link_kind when linked statically
5
6---
7 ip/iplink.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++------
8 1 file changed, 90 insertions(+), 10 deletions(-)
9
10diff --git a/ip/iplink.c b/ip/iplink.c
11index 95314af5..b3ee3eef 100644
12--- a/ip/iplink.c
13+++ b/ip/iplink.c
14@@ -141,7 +141,6 @@ static int on_off(const char *msg, const char *realval)
15 return -1;
16 }
17
18-static void *BODY; /* cached dlopen(NULL) handle */
19 static struct link_util *linkutil_list;
20
21 struct link_util *get_link_kind(const char *id)
22@@ -150,21 +149,102 @@ struct link_util *get_link_kind(const char *id)
23 char buf[256];
24 struct link_util *l;
25
26+ if (linkutil_list == NULL) {
27+ // <sed -n 's/^\(struct link_util .*_link_util\) = {/ extern \1;/p' ip/*.c
28+ extern struct link_util bareudp_link_util;
29+ extern struct link_util bond_link_util;
30+ extern struct link_util bond_slave_link_util;
31+ extern struct link_util bridge_link_util;
32+ extern struct link_util bridge_slave_link_util;
33+ extern struct link_util can_link_util;
34+ extern struct link_util dummy_link_util;
35+ extern struct link_util geneve_link_util;
36+ extern struct link_util hsr_link_util;
37+ extern struct link_util ifb_link_util;
38+ extern struct link_util ipoib_link_util;
39+ extern struct link_util ipvlan_link_util;
40+ extern struct link_util ipvtap_link_util;
41+ extern struct link_util macvlan_link_util;
42+ extern struct link_util macvtap_link_util;
43+ extern struct link_util netdevsim_link_util;
44+ extern struct link_util nlmon_link_util;
45+ extern struct link_util rmnet_link_util;
46+ extern struct link_util team_link_util;
47+ extern struct link_util vcan_link_util;
48+ extern struct link_util vlan_link_util;
49+ extern struct link_util vrf_link_util;
50+ extern struct link_util vrf_slave_link_util;
51+ extern struct link_util vxcan_link_util;
52+ extern struct link_util vxlan_link_util;
53+ extern struct link_util wwan_link_util;
54+ extern struct link_util macsec_link_util;
55+ extern struct link_util tun_link_util;
56+ extern struct link_util gre_link_util;
57+ extern struct link_util gretap_link_util;
58+ extern struct link_util erspan_link_util;
59+ extern struct link_util ip6gre_link_util;
60+ extern struct link_util ip6gretap_link_util;
61+ extern struct link_util ip6erspan_link_util;
62+ extern struct link_util ip6tnl_link_util;
63+ extern struct link_util ipip_link_util;
64+ extern struct link_util sit_link_util;
65+ extern struct link_util veth_link_util;
66+ extern struct link_util vti_link_util;
67+ extern struct link_util vti6_link_util;
68+ extern struct link_util xfrm_link_util;
69+
70+ // <sed -n 's/^struct link_util \(.*_link_util\) = {/ \1.next = linkutil_list, linkutil_list = \&\1;/p' ip/*.c
71+ bareudp_link_util.next = linkutil_list, linkutil_list = &bareudp_link_util;
72+ bond_link_util.next = linkutil_list, linkutil_list = &bond_link_util;
73+ bond_slave_link_util.next = linkutil_list, linkutil_list = &bond_slave_link_util;
74+ bridge_link_util.next = linkutil_list, linkutil_list = &bridge_link_util;
75+ bridge_slave_link_util.next = linkutil_list, linkutil_list = &bridge_slave_link_util;
76+ can_link_util.next = linkutil_list, linkutil_list = &can_link_util;
77+ dummy_link_util.next = linkutil_list, linkutil_list = &dummy_link_util;
78+ geneve_link_util.next = linkutil_list, linkutil_list = &geneve_link_util;
79+ hsr_link_util.next = linkutil_list, linkutil_list = &hsr_link_util;
80+ ifb_link_util.next = linkutil_list, linkutil_list = &ifb_link_util;
81+ ipoib_link_util.next = linkutil_list, linkutil_list = &ipoib_link_util;
82+ ipvlan_link_util.next = linkutil_list, linkutil_list = &ipvlan_link_util;
83+ ipvtap_link_util.next = linkutil_list, linkutil_list = &ipvtap_link_util;
84+ macvlan_link_util.next = linkutil_list, linkutil_list = &macvlan_link_util;
85+ macvtap_link_util.next = linkutil_list, linkutil_list = &macvtap_link_util;
86+ netdevsim_link_util.next = linkutil_list, linkutil_list = &netdevsim_link_util;
87+ nlmon_link_util.next = linkutil_list, linkutil_list = &nlmon_link_util;
88+ rmnet_link_util.next = linkutil_list, linkutil_list = &rmnet_link_util;
89+ team_link_util.next = linkutil_list, linkutil_list = &team_link_util;
90+ vcan_link_util.next = linkutil_list, linkutil_list = &vcan_link_util;
91+ vlan_link_util.next = linkutil_list, linkutil_list = &vlan_link_util;
92+ vrf_link_util.next = linkutil_list, linkutil_list = &vrf_link_util;
93+ vrf_slave_link_util.next = linkutil_list, linkutil_list = &vrf_slave_link_util;
94+ vxcan_link_util.next = linkutil_list, linkutil_list = &vxcan_link_util;
95+ vxlan_link_util.next = linkutil_list, linkutil_list = &vxlan_link_util;
96+ wwan_link_util.next = linkutil_list, linkutil_list = &wwan_link_util;
97+ macsec_link_util.next = linkutil_list, linkutil_list = &macsec_link_util;
98+ tun_link_util.next = linkutil_list, linkutil_list = &tun_link_util;
99+ gre_link_util.next = linkutil_list, linkutil_list = &gre_link_util;
100+ gretap_link_util.next = linkutil_list, linkutil_list = &gretap_link_util;
101+ erspan_link_util.next = linkutil_list, linkutil_list = &erspan_link_util;
102+ ip6gre_link_util.next = linkutil_list, linkutil_list = &ip6gre_link_util;
103+ ip6gretap_link_util.next = linkutil_list, linkutil_list = &ip6gretap_link_util;
104+ ip6erspan_link_util.next = linkutil_list, linkutil_list = &ip6erspan_link_util;
105+ ip6tnl_link_util.next = linkutil_list, linkutil_list = &ip6tnl_link_util;
106+ ipip_link_util.next = linkutil_list, linkutil_list = &ipip_link_util;
107+ sit_link_util.next = linkutil_list, linkutil_list = &sit_link_util;
108+ veth_link_util.next = linkutil_list, linkutil_list = &veth_link_util;
109+ vti_link_util.next = linkutil_list, linkutil_list = &vti_link_util;
110+ vti6_link_util.next = linkutil_list, linkutil_list = &vti6_link_util;
111+ xfrm_link_util.next = linkutil_list, linkutil_list = &xfrm_link_util;
112+ }
113+
114 for (l = linkutil_list; l; l = l->next)
115 if (strcmp(l->id, id) == 0)
116 return l;
117
118 snprintf(buf, sizeof(buf), "%s/link_%s.so", get_ip_lib_dir(), id);
119 dlh = dlopen(buf, RTLD_LAZY);
120- if (dlh == NULL) {
121- /* look in current binary, only open once */
122- dlh = BODY;
123- if (dlh == NULL) {
124- dlh = BODY = dlopen(NULL, RTLD_LAZY);
125- if (dlh == NULL)
126- return NULL;
127- }
128- }
129+ if (dlh == NULL)
130+ return NULL;
131
132 snprintf(buf, sizeof(buf), "%s_link_util", id);
133 l = dlsym(dlh, buf);
134--
1352.44.0
136