logo

oasis

Own branch of Oasis Linux (upstream: <https://git.sr.ht/~mcf/oasis/>) git clone https://anongit.hacktivis.me/git/oasis.git

0009-ip-Fix-get_link_kind-when-linked-statically.patch (6477B)


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