diff options
author | Xavier Roche <xroche@users.noreply.github.com> | 2014-05-18 10:53:29 +0000 |
---|---|---|
committer | Xavier Roche <xroche@users.noreply.github.com> | 2014-05-18 10:53:29 +0000 |
commit | 08a17f31d48319acf4be0e0d929456eb3c88a936 (patch) | |
tree | b7e8f701fcdfc6b9b63e4c3717b4e83ad9f26252 /src/htsnet.h | |
parent | 6c8b76e53168dd1fc9c4b88cc42819903fd2eabc (diff) |
Removed size member from SOCaddr
Diffstat (limited to 'src/htsnet.h')
-rw-r--r-- | src/htsnet.h | 75 |
1 files changed, 44 insertions, 31 deletions
diff --git a/src/htsnet.h b/src/htsnet.h index d8bdf2c..0cd6da3 100644 --- a/src/htsnet.h +++ b/src/htsnet.h @@ -87,45 +87,58 @@ typedef struct SOCaddr SOCaddr; #endif struct SOCaddr { union { + /* Generic version, for network functions such as getnameinfo() */
+ struct sockaddr sa;
+ /* IPv4 */
struct sockaddr_in in; #if HTS_INET6 != 0 + /* IPv6 */
struct sockaddr_in6 in6; #endif - /* For network functions such as getnameinfo */ - struct sockaddr sa; } m_addr; - socklen_t size; }; -static HTS_INLINE HTS_UNUSED in_port_t* SOCaddr_sinport_(SOCaddr *const addr) { +static HTS_INLINE HTS_UNUSED in_port_t* SOCaddr_sinport_(SOCaddr *const addr, + const char *file, const int line) { + assertf_(addr != NULL, file, line); + switch(addr->m_addr.sa.sa_family) { + case AF_INET: + return &addr->m_addr.in.sin_port; + break; #if HTS_INET6 != 0 - if (addr->size == sizeof(struct sockaddr_in6)) { + case AF_INET6: return &addr->m_addr.in6.sin6_port; - } else { + break; #endif - assertf(addr->size == sizeof(struct sockaddr_in)); - return &addr->m_addr.in.sin_port; -#if HTS_INET6 != 0 + default: + assertf_(! "invalid structure", file, line); + return 0; + break; } -#endif } -static HTS_INLINE HTS_UNUSED sa_family_t* SOCaddr_sinfamily_(SOCaddr *const addr) { +static HTS_INLINE HTS_UNUSED socklen_t SOCaddr_size_(const SOCaddr*const addr, + const char *file, const int line) { + assertf_(addr != NULL, file, line); + switch(addr->m_addr.sa.sa_family) { + case AF_INET: + return sizeof(addr->m_addr.in); + break; #if HTS_INET6 != 0 - if (addr->size == sizeof(struct sockaddr_in6)) { - return (sa_family_t*) &addr->m_addr.in6.sin6_family; - } else { + case AF_INET6: + return sizeof(addr->m_addr.in6); + break; #endif - assertf(addr->size == sizeof(struct sockaddr_in)); - return (sa_family_t*) &addr->m_addr.in.sin_family; -#if HTS_INET6 != 0 + default: + return 0; + break; } -#endif } /* Ipv4/6 structure members */ -#define SOCaddr_sinfamily(server) (*SOCaddr_sinfamily_(&(server))) -#define SOCaddr_sinport(server) (*SOCaddr_sinport_(&(server))) +#define SOCaddr_sinfamily(server) ((server).m_addr.sa.sa_family) +#define SOCaddr_sinport(server) (*SOCaddr_sinport_(&(server), __FILE__, __LINE__)) +#define SOCaddr_size(server) (*SOCaddr_size_(&(server, __FILE__, __LINE__))) /* AF_xx */ #if HTS_INET6 != 0 @@ -139,15 +152,16 @@ static HTS_INLINE HTS_UNUSED sa_family_t* SOCaddr_sinfamily_(SOCaddr *const addr SOCaddr_sinport(server) = htons((in_port_t) (port)); \ } while(0) -static HTS_INLINE HTS_UNUSED socklen_t SOCaddr_initany_(SOCaddr*const addr) { - addr->size = sizeof(struct sockaddr_in); +static HTS_INLINE HTS_UNUSED socklen_t SOCaddr_initany_(SOCaddr*const addr, + const char *file, const int line) { + assertf_(addr != NULL, file, line); memset(&addr->m_addr.in, 0, sizeof(addr->m_addr.in)); addr->m_addr.in.sin_family = AF_INET; - return addr->size; + return SOCaddr_size_(addr, file, line); } #define SOCaddr_initany(server, server_len) do { \ - server_len = (int) SOCaddr_initany_(&(server)); \ + server_len = (int) SOCaddr_initany_(&(server), __FILE__, __LINE__); \ } while(0) /* @@ -161,30 +175,28 @@ static HTS_UNUSED socklen_t SOCaddr_copyaddr_(SOCaddr*const server, if (data_size == sizeof(struct sockaddr_in)) { memcpy(&server->m_addr.in, data, sizeof(struct sockaddr_in)); - server->size = sizeof(struct sockaddr_in); + assertf_(server->m_addr.sa.sa_family == AF_INET, file, line); #if HTS_INET6 != 0 } else if (data_size == sizeof(struct sockaddr_in6)) { memcpy(&server->m_addr.in6, data, sizeof(struct sockaddr_in6)); - server->size = sizeof(struct sockaddr_in6); + assertf_(server->m_addr.sa.sa_family == AF_INET6, file, line); #endif } else if (data_size == 4) { memset(&server->m_addr.in, 0, sizeof(server->m_addr.in)); server->m_addr.in.sin_family = AF_INET; server->m_addr.in.sin_port = 0; memcpy(&server->m_addr.in.sin_addr, data, 4); - server->size = sizeof(struct sockaddr_in); #if HTS_INET6 != 0 } else if (data_size == 16) { memset(&server->m_addr.in6, 0, sizeof(server->m_addr.in6)); server->m_addr.in6.sin6_family = AF_INET6; server->m_addr.in6.sin6_port = 0; memcpy(&server->m_addr.in6.sin6_addr, data, 16); - server->size = sizeof(struct sockaddr_in6); #endif } else { - server->size = 0; /* Error */ + server->m_addr.in.sin_family = AF_INET; } - return server->size; + return SOCaddr_size_(server, file, line); } #define SOCaddr_copyaddr(server, server_len, hpaddr, hpsize) do { \ @@ -198,7 +210,8 @@ static HTS_UNUSED void SOCaddr_inetntoa_(char *namebuf, size_t namebuflen, const char *file, const int line) { assertf_(namebuf != NULL, file, line); assertf_(ss != NULL, file, line); - if (getnameinfo(&ss->m_addr.sa, ss->size, + + if (getnameinfo(&ss->m_addr.sa, sizeof(ss->m_addr), namebuf, namebuflen, NULL, 0, NI_NUMERICHOST) == 0) { |