summaryrefslogtreecommitdiff
path: root/include/wolf/port/netdb.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/wolf/port/netdb.h')
-rw-r--r--include/wolf/port/netdb.h82
1 files changed, 82 insertions, 0 deletions
diff --git a/include/wolf/port/netdb.h b/include/wolf/port/netdb.h
index 99abf73..28aa679 100644
--- a/include/wolf/port/netdb.h
+++ b/include/wolf/port/netdb.h
@@ -29,6 +29,14 @@
* @author Andreas Baumann <abaumann@yahoo.com>
*/
+/*
+ * Based on ideas found in:
+ * - Postgres src/port/getaddrinfo.c
+ * Copyright (c) 2003-2008, PostgreSQL Global Development Group
+ * - Unix Stevens Network Programming
+ * libgai implementation in unpv12e
+ */
+
#include "port/sys.h"
#ifdef FREEBSD
@@ -84,6 +92,80 @@
#define NI_MAXSERV 32
#endif
+#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 */
+#define EAI_AGAIN -3 /**< temporary failure in name resolution */
+#define EAI_FAIL -4 /**< non-recoverable failure in name resultion */
+#define EAI_FAMILY -6 /**< socket family not supported */
+#define EAI_MEMORY -10 /**< memory allocation failure */
+#endif
+
+/* for ai_flags */
+#if !defined AI_PASSIVE
+#define AI_PASSIVE 1 /**< socket is intended for bind() + listen() */
+#define AI_CANONNAME 2 /**< return canonical name */
+#define AI_NUMERICHOST 4 /**< don't use name resolution */
+#endif
+
+/* 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;
+ int ai_family;
+ int ai_socktype;
+ int ai_protocol;
+ size_t ai_addrlen;
+ struct sockaddr *ai_addr;
+ char *ai_canonname;
+ struct wolf_port_addrinfo *ai_next;
+};
+
+int wolf_port_getaddrinfo( const char *host_name,
+ const char *service_name,
+ const struct wolf_port_addrinfo *hints,
+ struct wolf_port_addrinfo **result );
+void wolf_port_freeaddrinfo( struct wolf_port_addrinfo *result );
+
+int wolf_port_getnameinfo( const struct sockaddr *sa, socklen_t salen,
+ char *host, size_t hostlen,
+ char *serv, size_t servlen,
+ int flags );
+
+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
+
+#endif /* !defined HAVE_GETADDRINFO || defined TEST_GETADDRINFO */
+
+/* gai_strerror is not thread-safe. Some platforms (like AIX 6.1) started to
+ * introduce a thread-safe version gai_strerror_r
+ */
+#if !defined HAVE_GAI_STRERROR_R || defined TEST_GAI_STRERROR_R
+int wolf_port_gai_strerror_r( int errcode, char *buf, size_t buflen );
+#if !defined HAVE_GAI_STRERROR_R
+#define gai_strerror_r( errcode, buf, buflen ) wolf_port_gai_strerror_r( errcode, buf, buflen )
+#endif /* !defined HAVE_GAI_STRERROR_R */
+
+#endif /* !defined HAVE_GAI_STRERROR_R || defined TEST_GAI_STRERROR_R */
+
/** @} */ /* @addtogroup wolf_port */
#endif /* ifndef WOLF_NETDB_H */