From: Álvaro Fernández Rojas Date: Wed, 17 Jun 2015 17:51:26 +0000 (+0200) Subject: mcproxy: fix build with musl X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=898cc963d6320948cb84005caf5695a55d33c2ba;p=feed%2Frouting.git mcproxy: fix build with musl Signed-off-by: Álvaro Fernández Rojas --- diff --git a/mcproxy/Makefile b/mcproxy/Makefile index be96bc7..c155055 100644 --- a/mcproxy/Makefile +++ b/mcproxy/Makefile @@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mcproxy PKG_SOURCE_VERSION:=b7bd2d0809a0d1f177181c361b9a6c83e193b79a PKG_VERSION:=2014-12-31-$(PKG_SOURCE_VERSION) -PKG_RELEASE:=2 +PKG_RELEASE:=3 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=git://github.com/mcproxy/mcproxy.git diff --git a/mcproxy/patches/0002-rm-stoi.patch b/mcproxy/patches/0002-rm-stoi.patch new file mode 100644 index 0000000..a25c9fb --- /dev/null +++ b/mcproxy/patches/0002-rm-stoi.patch @@ -0,0 +1,40 @@ +--- a/mcproxy/src/parser/parser.cpp ++++ b/mcproxy/src/parser/parser.cpp +@@ -126,7 +126,7 @@ void parser::parse_instance_definition(i + get_next_token(); + if (m_current_token.get_type() == TT_STRING) { + try { +- table_number = std::stoi(m_current_token.get_string()); ++ table_number = atoi(m_current_token.get_string().c_str()); + user_selected_table_number = true; + } catch (std::logic_error e) { + HC_LOG_ERROR("failed to parse line " << m_current_line << " table number: " << table_number << " is not a number"); +@@ -299,7 +299,7 @@ std::unique_ptr parser::pars + get_next_token(); + if (m_current_token.get_type() == TT_STRING) { + try { +- unsigned int prefix = std::stoi(m_current_token.get_string()); ++ unsigned int prefix = atoi(m_current_token.get_string().c_str()); + if (prefix > 128) { + throw; + } +@@ -561,7 +561,7 @@ void parser::parse_interface_rule_match_ + get_next_token(); + if (m_current_token.get_type() == TT_STRING) { + try { +- int tmp_timeout = std::stoi(m_current_token.get_string()); ++ int tmp_timeout = atoi(m_current_token.get_string().c_str()); + timeout = std::chrono::milliseconds(tmp_timeout); + } catch (...) { + error_notification(); +--- a/mcproxy/src/utils/addr_storage.cpp ++++ b/mcproxy/src/utils/addr_storage.cpp +@@ -298,7 +298,7 @@ addr_storage& addr_storage::set_port(uin + + addr_storage& addr_storage::set_port(const std::string& port) + { +- set_port(std::stoi(port.c_str())); ++ set_port(atoi(port.c_str())); + return *this; + } + diff --git a/mcproxy/patches/0002-uclibc-rm-stoi.patch b/mcproxy/patches/0002-uclibc-rm-stoi.patch deleted file mode 100644 index a25c9fb..0000000 --- a/mcproxy/patches/0002-uclibc-rm-stoi.patch +++ /dev/null @@ -1,40 +0,0 @@ ---- a/mcproxy/src/parser/parser.cpp -+++ b/mcproxy/src/parser/parser.cpp -@@ -126,7 +126,7 @@ void parser::parse_instance_definition(i - get_next_token(); - if (m_current_token.get_type() == TT_STRING) { - try { -- table_number = std::stoi(m_current_token.get_string()); -+ table_number = atoi(m_current_token.get_string().c_str()); - user_selected_table_number = true; - } catch (std::logic_error e) { - HC_LOG_ERROR("failed to parse line " << m_current_line << " table number: " << table_number << " is not a number"); -@@ -299,7 +299,7 @@ std::unique_ptr parser::pars - get_next_token(); - if (m_current_token.get_type() == TT_STRING) { - try { -- unsigned int prefix = std::stoi(m_current_token.get_string()); -+ unsigned int prefix = atoi(m_current_token.get_string().c_str()); - if (prefix > 128) { - throw; - } -@@ -561,7 +561,7 @@ void parser::parse_interface_rule_match_ - get_next_token(); - if (m_current_token.get_type() == TT_STRING) { - try { -- int tmp_timeout = std::stoi(m_current_token.get_string()); -+ int tmp_timeout = atoi(m_current_token.get_string().c_str()); - timeout = std::chrono::milliseconds(tmp_timeout); - } catch (...) { - error_notification(); ---- a/mcproxy/src/utils/addr_storage.cpp -+++ b/mcproxy/src/utils/addr_storage.cpp -@@ -298,7 +298,7 @@ addr_storage& addr_storage::set_port(uin - - addr_storage& addr_storage::set_port(const std::string& port) - { -- set_port(std::stoi(port.c_str())); -+ set_port(atoi(port.c_str())); - return *this; - } - diff --git a/mcproxy/patches/0003-add-sourcefilter.patch b/mcproxy/patches/0003-add-sourcefilter.patch new file mode 100644 index 0000000..2f64975 --- /dev/null +++ b/mcproxy/patches/0003-add-sourcefilter.patch @@ -0,0 +1,181 @@ +--- a/mcproxy/src/utils/mc_socket.cpp ++++ b/mcproxy/src/utils/mc_socket.cpp +@@ -37,6 +37,10 @@ + #include + #include + ++#ifndef __GLIBC__ ++#include "sourcefilter.cpp" ++#endif /* __GLIBC__ */ ++ + std::string ipAddrResolver(std::string ipAddr) + { + std::string str[][2] = { +--- /dev/null ++++ b/mcproxy/src/utils/sourcefilter.cpp +@@ -0,0 +1,165 @@ ++/* Get source filter. Linux version. ++ Copyright (C) 2004-2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper , 2004. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static const struct ++{ ++ int sol; ++ int af; ++ socklen_t size; ++} sol_map[] = ++ { ++ /* Sort the array according to importance of the protocols. Add ++ more protocols when they become available. */ ++ { SOL_IP, AF_INET, sizeof (struct sockaddr_in) }, ++ { SOL_IPV6, AF_INET6, sizeof (struct sockaddr_in6) }, ++ { SOL_PACKET, AF_PACKET, sizeof (struct sockaddr_ll) } ++ }; ++#define NSOL_MAP (sizeof (sol_map) / sizeof (sol_map[0])) ++ ++ ++/* Try to determine the socket level value. Ideally both side and ++ family are set. But sometimes only the size is correct and the ++ family value might be bogus. Loop over the array entries and look ++ for a perfect match or the first match based on size. */ ++static int ++__get_sol (int af, socklen_t len) ++{ ++ int first_size_sol = -1; ++ ++ for (size_t cnt = 0; cnt < NSOL_MAP; ++cnt) ++ { ++ /* Just a test so that we make sure the special value used to ++ signal the "we have so far no socket level value" is OK. */ ++ assert (sol_map[cnt].sol != -1); ++ ++ if (len == sol_map[cnt].size) ++ { ++ /* The size matches, which is a requirement. If the family ++ matches, too, we have a winner. Otherwise we remember the ++ socket level value for this protocol if it is the first ++ match. */ ++ if (af == sol_map[cnt].af) ++ /* Bingo! */ ++ return sol_map[cnt].sol; ++ ++ if (first_size_sol == -1) ++ first_size_sol = sol_map[cnt].sol; ++ } ++ } ++ ++ return first_size_sol; ++} ++ ++ ++int ++getsourcefilter (int s, uint32_t interface, const struct sockaddr *group, ++ socklen_t grouplen, uint32_t *fmode, uint32_t *numsrc, ++ struct sockaddr_storage *slist) ++{ ++ /* We have to create an struct ip_msfilter object which we can pass ++ to the kernel. */ ++ socklen_t needed = GROUP_FILTER_SIZE (*numsrc); ++ struct group_filter *gf; ++ gf = (struct group_filter *) malloc (needed); ++ if (gf == NULL) ++ return -1; ++ ++ gf->gf_interface = interface; ++ memcpy (&gf->gf_group, group, grouplen); ++ gf->gf_numsrc = *numsrc; ++ ++ /* We need to provide the appropriate socket level value. */ ++ int result; ++ int sol = __get_sol (group->sa_family, grouplen); ++ if (sol == -1) ++ { ++ errno = EINVAL; ++ result = -1; ++ } ++ else ++ { ++ result = getsockopt (s, sol, MCAST_MSFILTER, gf, &needed); ++ ++ /* If successful, copy the results to the places the caller wants ++ them in. */ ++ if (result == 0) ++ { ++ *fmode = gf->gf_fmode; ++ memcpy (slist, gf->gf_slist, ++ MIN (*numsrc, gf->gf_numsrc) ++ * sizeof (struct sockaddr_storage)); ++ *numsrc = gf->gf_numsrc; ++ } ++ } ++ ++ int save_errno = errno; ++ free (gf); ++ errno = save_errno; ++ ++ return result; ++} ++ ++ ++int ++setsourcefilter (int s, uint32_t interface, const struct sockaddr *group, ++ socklen_t grouplen, uint32_t fmode, uint32_t numsrc, ++ const struct sockaddr_storage *slist) ++{ ++ /* We have to create an struct ip_msfilter object which we can pass ++ to the kernel. */ ++ size_t needed = GROUP_FILTER_SIZE (numsrc); ++ ++ struct group_filter *gf; ++ gf = (struct group_filter *) malloc (needed); ++ if (gf == NULL) ++ return -1; ++ ++ gf->gf_interface = interface; ++ memcpy (&gf->gf_group, group, grouplen); ++ gf->gf_fmode = fmode; ++ gf->gf_numsrc = numsrc; ++ memcpy (gf->gf_slist, slist, numsrc * sizeof (struct sockaddr_storage)); ++ ++ /* We need to provide the appropriate socket level value. */ ++ int result; ++ int sol = __get_sol (group->sa_family, grouplen); ++ if (sol == -1) ++ { ++ errno = EINVAL; ++ result = -1; ++ } ++ else ++ result = setsockopt (s, sol, MCAST_MSFILTER, gf, needed); ++ ++ int save_errno = errno; ++ free (gf); ++ errno = save_errno; ++ ++ return result; ++} diff --git a/mcproxy/patches/0003-uclibc-add-sourcefilter.patch b/mcproxy/patches/0003-uclibc-add-sourcefilter.patch deleted file mode 100644 index 7c4e90c..0000000 --- a/mcproxy/patches/0003-uclibc-add-sourcefilter.patch +++ /dev/null @@ -1,181 +0,0 @@ ---- a/mcproxy/src/utils/mc_socket.cpp -+++ b/mcproxy/src/utils/mc_socket.cpp -@@ -37,6 +37,10 @@ - #include - #include - -+#ifdef __UCLIBC__ -+#include "sourcefilter.cpp" -+#endif /* __UCLIBC__ */ -+ - std::string ipAddrResolver(std::string ipAddr) - { - std::string str[][2] = { ---- /dev/null -+++ b/mcproxy/src/utils/sourcefilter.cpp -@@ -0,0 +1,165 @@ -+/* Get source filter. Linux version. -+ Copyright (C) 2004-2014 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Contributed by Ulrich Drepper , 2004. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+static const struct -+{ -+ int sol; -+ int af; -+ socklen_t size; -+} sol_map[] = -+ { -+ /* Sort the array according to importance of the protocols. Add -+ more protocols when they become available. */ -+ { SOL_IP, AF_INET, sizeof (struct sockaddr_in) }, -+ { SOL_IPV6, AF_INET6, sizeof (struct sockaddr_in6) }, -+ { SOL_PACKET, AF_PACKET, sizeof (struct sockaddr_ll) } -+ }; -+#define NSOL_MAP (sizeof (sol_map) / sizeof (sol_map[0])) -+ -+ -+/* Try to determine the socket level value. Ideally both side and -+ family are set. But sometimes only the size is correct and the -+ family value might be bogus. Loop over the array entries and look -+ for a perfect match or the first match based on size. */ -+static int -+__get_sol (int af, socklen_t len) -+{ -+ int first_size_sol = -1; -+ -+ for (size_t cnt = 0; cnt < NSOL_MAP; ++cnt) -+ { -+ /* Just a test so that we make sure the special value used to -+ signal the "we have so far no socket level value" is OK. */ -+ assert (sol_map[cnt].sol != -1); -+ -+ if (len == sol_map[cnt].size) -+ { -+ /* The size matches, which is a requirement. If the family -+ matches, too, we have a winner. Otherwise we remember the -+ socket level value for this protocol if it is the first -+ match. */ -+ if (af == sol_map[cnt].af) -+ /* Bingo! */ -+ return sol_map[cnt].sol; -+ -+ if (first_size_sol == -1) -+ first_size_sol = sol_map[cnt].sol; -+ } -+ } -+ -+ return first_size_sol; -+} -+ -+ -+int -+getsourcefilter (int s, uint32_t interface, const struct sockaddr *group, -+ socklen_t grouplen, uint32_t *fmode, uint32_t *numsrc, -+ struct sockaddr_storage *slist) -+{ -+ /* We have to create an struct ip_msfilter object which we can pass -+ to the kernel. */ -+ socklen_t needed = GROUP_FILTER_SIZE (*numsrc); -+ struct group_filter *gf; -+ gf = (struct group_filter *) malloc (needed); -+ if (gf == NULL) -+ return -1; -+ -+ gf->gf_interface = interface; -+ memcpy (&gf->gf_group, group, grouplen); -+ gf->gf_numsrc = *numsrc; -+ -+ /* We need to provide the appropriate socket level value. */ -+ int result; -+ int sol = __get_sol (group->sa_family, grouplen); -+ if (sol == -1) -+ { -+ errno = EINVAL; -+ result = -1; -+ } -+ else -+ { -+ result = getsockopt (s, sol, MCAST_MSFILTER, gf, &needed); -+ -+ /* If successful, copy the results to the places the caller wants -+ them in. */ -+ if (result == 0) -+ { -+ *fmode = gf->gf_fmode; -+ memcpy (slist, gf->gf_slist, -+ MIN (*numsrc, gf->gf_numsrc) -+ * sizeof (struct sockaddr_storage)); -+ *numsrc = gf->gf_numsrc; -+ } -+ } -+ -+ int save_errno = errno; -+ free (gf); -+ errno = save_errno; -+ -+ return result; -+} -+ -+ -+int -+setsourcefilter (int s, uint32_t interface, const struct sockaddr *group, -+ socklen_t grouplen, uint32_t fmode, uint32_t numsrc, -+ const struct sockaddr_storage *slist) -+{ -+ /* We have to create an struct ip_msfilter object which we can pass -+ to the kernel. */ -+ size_t needed = GROUP_FILTER_SIZE (numsrc); -+ -+ struct group_filter *gf; -+ gf = (struct group_filter *) malloc (needed); -+ if (gf == NULL) -+ return -1; -+ -+ gf->gf_interface = interface; -+ memcpy (&gf->gf_group, group, grouplen); -+ gf->gf_fmode = fmode; -+ gf->gf_numsrc = numsrc; -+ memcpy (gf->gf_slist, slist, numsrc * sizeof (struct sockaddr_storage)); -+ -+ /* We need to provide the appropriate socket level value. */ -+ int result; -+ int sol = __get_sol (group->sa_family, grouplen); -+ if (sol == -1) -+ { -+ errno = EINVAL; -+ result = -1; -+ } -+ else -+ result = setsockopt (s, sol, MCAST_MSFILTER, gf, needed); -+ -+ int save_errno = errno; -+ free (gf); -+ errno = save_errno; -+ -+ return result; -+} diff --git a/mcproxy/patches/0004-add-defs.patch b/mcproxy/patches/0004-add-defs.patch new file mode 100644 index 0000000..a1105c9 --- /dev/null +++ b/mcproxy/patches/0004-add-defs.patch @@ -0,0 +1,11 @@ +--- a/mcproxy/src/utils/mc_socket.cpp ++++ b/mcproxy/src/utils/mc_socket.cpp +@@ -38,6 +38,8 @@ + #include + + #ifndef __GLIBC__ ++#define IP_MULTICAST_ALL 49 ++ + #include "sourcefilter.cpp" + #endif /* __GLIBC__ */ + diff --git a/mcproxy/patches/0004-uclibc-add-defs.patch b/mcproxy/patches/0004-uclibc-add-defs.patch deleted file mode 100644 index 022cb02..0000000 --- a/mcproxy/patches/0004-uclibc-add-defs.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/mcproxy/src/utils/mc_socket.cpp -+++ b/mcproxy/src/utils/mc_socket.cpp -@@ -38,6 +38,8 @@ - #include - - #ifdef __UCLIBC__ -+#define IP_MULTICAST_ALL 49 -+ - #include "sourcefilter.cpp" - #endif /* __UCLIBC__ */ -