diff --git a/core/AmUtils.h b/core/AmUtils.h index 46e5c5e7..66d79df7 100644 --- a/core/AmUtils.h +++ b/core/AmUtils.h @@ -286,6 +286,20 @@ std::vector explode(string s, string e); /** add a directory to an environement variable */ void add_env_path(const char* name, const string& path); +#ifdef SUPPORT_IPV6 +#ifdef SIN6_LEN +#define SOCKADDR_LEN(soc_address) ((struct sockaddr *)&soc_address)->sa_len +#else +#ifndef SA_LEN +#define SA_LEN(x) (((x)->sa_family == AF_INET6)?sizeof(struct sockaddr_in6): \ + (((x)->sa_family == AF_INET)?sizeof(struct sockaddr_in):sizeof(struct sockaddr))) +#endif +#define SOCKADDR_LEN(soc_address) SA_LEN((struct sockaddr *)&soc_address) +#endif /* SIN6_LEN */ +#else +#define SOCKADDR_LEN(soc_address) sizeof(soc_address) +#endif /* SUPPORT_IPV6 */ + #endif // Local Variables: diff --git a/core/sems.cpp b/core/sems.cpp index ff51c60b..0e80c34c 100644 --- a/core/sems.cpp +++ b/core/sems.cpp @@ -455,7 +455,7 @@ static void getInterfaceList(int sd, std::vector >& if_ inet_ntoa(sa->sin_addr))); } - p_ifr = (struct ifreq*)(((char*)p_ifr) + IFNAMSIZ + p_ifr->ifr_addr.sa_len); + p_ifr = (struct ifreq*)(((char*)p_ifr) + IFNAMSIZ + SOCKADDR_LEN(p_ifr->ifr_addr)); } }