master hovercats/oakiss / pkg / iproute2 / patch / 0009-ip-Fix-get_link_kind-when-linked-statically.patch
  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