summaryrefslogtreecommitdiff
path: root/src/port
diff options
context:
space:
mode:
authorAndreas Baumann <abaumann@yahoo.com>2009-03-29 18:51:07 +0200
committerAndreas Baumann <abaumann@yahoo.com>2009-03-29 18:51:07 +0200
commitf1ee6c39b2aaddf3ed30794e6a0591c3f6c99793 (patch)
treee14482c47184558b6a4709a7d465ad3e54aa04e7 /src/port
parent9b5e62657a7070186392521d21cfad95dee36596 (diff)
downloadwolfbones-f1ee6c39b2aaddf3ed30794e6a0591c3f6c99793.tar.gz
wolfbones-f1ee6c39b2aaddf3ed30794e6a0591c3f6c99793.tar.bz2
getnameinfo on Cygwin
Diffstat (limited to 'src/port')
-rwxr-xr-xsrc/port/getaddrinfo.c62
-rwxr-xr-xsrc/port/getaddrinfo.h21
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