diff options
author | Andreas Baumann <abaumann@yahoo.com> | 2009-03-29 18:51:07 +0200 |
---|---|---|
committer | Andreas Baumann <abaumann@yahoo.com> | 2009-03-29 18:51:07 +0200 |
commit | f1ee6c39b2aaddf3ed30794e6a0591c3f6c99793 (patch) | |
tree | e14482c47184558b6a4709a7d465ad3e54aa04e7 /src | |
parent | 9b5e62657a7070186392521d21cfad95dee36596 (diff) | |
download | wolfbones-f1ee6c39b2aaddf3ed30794e6a0591c3f6c99793.tar.gz wolfbones-f1ee6c39b2aaddf3ed30794e6a0591c3f6c99793.tar.bz2 |
getnameinfo on Cygwin
Diffstat (limited to 'src')
-rwxr-xr-x | src/port/getaddrinfo.c | 62 | ||||
-rwxr-xr-x | src/port/getaddrinfo.h | 21 |
2 files changed, 80 insertions, 3 deletions
diff --git a/src/port/getaddrinfo.c b/src/port/getaddrinfo.c index 558cb9e..8f9db2a 100755 --- a/src/port/getaddrinfo.c +++ b/src/port/getaddrinfo.c @@ -20,7 +20,8 @@ #if !defined HAVE_GETADDRINFO || defined TEST_GETADDRINFO #include "port/string.h" /* for memset, memcpy */ -#include "port/stdlib.h" /* for atoi, malloc, free, NULL */ +#include "port/stdlib.h" /* for atoi, itoa, malloc, free, NULL */ +#include "port/unused.h" #include <netinet/in.h> /* for struct sockaddr_in */ @@ -140,6 +141,65 @@ void wolf_port_freeaddrinfo( struct wolf_port_addrinfo *result ) { } } +/* + * Convert an ipv4 address to a hostname. + * + * Bugs: - Only supports NI_NUMERICHOST and NI_NUMERICSERV + * It will never resolv a hostname. + * - No IPv6 support. + */ +extern int getnameinfo( const struct sockaddr *sa, socklen_t salen, + char *host, size_t hostlen, + char *serv, size_t servlen, + int flags ) { + WOLF_UNUSED( salen ); + + /* Invalid arguments. */ + if( sa == NULL || ( host == NULL && serv == NULL ) ) { + return EAI_FAIL; + } + + /* We don't support those. */ + if( ( host && !( flags & NI_NUMERICHOST ) ) + || ( serv && !( flags & NI_NUMERICSERV ) ) ) { + return EAI_FAIL; + } + +#ifdef HAVE_IPV6 + /* no IPV6 here */ + if( sa->sa_family == AF_INET6 ) { + return EAI_FAMILY; + } +#endif + + if( host != NULL ) { + if( sa->sa_family == AF_INET ) { + char *p; + + /* maximal size of an IP4 addres 255.255.255.255.255 */ + if( hostlen < 16 ) { + return EAI_MEMORY; + } + + p = inet_ntoa( ( (const struct sockaddr_in * ) sa)->sin_addr ); + + strlcpy( host, p, hostlen ); + } + } + + if( serv != NULL ) { + if (sa->sa_family == AF_INET ) { + /* maximal number of digits in an unsigned short */ + if( servlen < 10 ) { + return EAI_MEMORY; + } + (void)itoa( ntohs( ( (const struct sockaddr_in * )sa)->sin_port ), serv, servlen ); + } + } + + return 0; +} + const char *wolf_port_gai_strerror( int errcode ) { switch( errcode ) { case EAI_NONAME: diff --git a/src/port/getaddrinfo.h b/src/port/getaddrinfo.h index 4582ef0..746ac47 100755 --- a/src/port/getaddrinfo.h +++ b/src/port/getaddrinfo.h @@ -27,6 +27,12 @@ #include "port/sys_internal.h" +#if !defined HAVE_GETADDRINFO || defined TEST_GETADDRINFO + +#include <sys/types.h> /* for size_t */ +#include <sys/socket.h> /* for AF_UNSPEC */ +#include <arpa/inet.h> /* for TCPPROTO and others */ + /* for errors returned by getaddrinfo */ #if !defined EAI_NONAME #define EAI_NONAME -2 /**< NAME or SERVICE is unknown */ @@ -43,7 +49,12 @@ #define AI_NUMERICHOST 4 /**< don't use name resolution */ #endif -#if !defined HAVE_GETADDRINFO || defined TEST_GETADDRINFO +/* for flags in getnameinfo */ +#if !defined NI_NUMERICHOST +#define NI_NUMERICHOST 1 /**< don't try to look up hostname. */ +#define NI_NUMERICSERV 2 /**< don't convert port number to name. */ +#endif + struct wolf_port_addrinfo { int ai_flags; @@ -60,14 +71,20 @@ extern int wolf_port_getaddrinfo( const char *host_name, const char *service_name, const struct wolf_port_addrinfo *hints, struct wolf_port_addrinfo **result ); - extern void wolf_port_freeaddrinfo( struct wolf_port_addrinfo *result ); + +extern int wolf_port_getnameinfo( const struct sockaddr *sa, socklen_t salen, + char *host, size_t hostlen, + char *serv, size_t servlen, + int flags ); + extern const char *wolf_port_gai_strerror( int errcode ); #if !defined HAVE_GETADDRINFO #define addrinfo wolf_port_addrinfo #define getaddrinfo( host_name, service_name, hints, result ) wolf_port_getaddrinfo( host_name, service_name, hints, result ) #define freeaddrinfo( result ) wolf_port_freeaddrinfo( result ) +#define getnameinfo( sa, salen, host, hostlen, serv, servlen, flags ) wolf_port_getnameinfo( sa, salen, host, hostlen, serv, servlen, flags ) #define gai_strerror( errcode ) wolf_port_gai_strerror( errcode ) #endif |