From eacae7243eef172d8b549c6d1a49c433377f6aec Mon Sep 17 00:00:00 2001 From: olsner Date: Wed, 10 Dec 2003 19:29:01 +0000 Subject: [PATCH] IPv6/getaddrinfo stuff - DLL detection This was SVN commit r134. --- source/lib/posix.cpp | 22 +++++++++++++++++-- source/lib/posix.h | 50 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 66 insertions(+), 6 deletions(-) diff --git a/source/lib/posix.cpp b/source/lib/posix.cpp index 8b458dd975..5bfcb42f31 100755 --- a/source/lib/posix.cpp +++ b/source/lib/posix.cpp @@ -479,10 +479,14 @@ int uname(struct utsname* un) u16_t htons(u16_t s) { - return (s >> 8) || ((s & 0xff) << 8); + return (s >> 8) | ((s & 0xff) << 8); } - +/******************************************************************/ +/* socket dynamic functions */ +fp_getnameinfo_t getnameinfo; +fp_getaddrinfo_t getaddrinfo; +fp_freeaddrinfo_t freeaddrinfo; void entry(void) { @@ -492,5 +496,19 @@ void entry(void) WSAStartup(0x0002, d); // want 2.0 #endif + HMODULE h=LoadLibrary("ws2_32.dll"); + if (h) + { + getaddrinfo=(fp_getaddrinfo_t)GetProcAddress(h, "getaddrinfo"); + getnameinfo=(fp_getnameinfo_t)GetProcAddress(h, "getnameinfo"); + freeaddrinfo=(fp_freeaddrinfo_t)GetProcAddress(h, "freeaddrinfo"); + } + else + { + getaddrinfo=NULL; + getnameinfo=NULL; + freeaddrinfo=NULL; + } + mainCRTStartup(); } diff --git a/source/lib/posix.h b/source/lib/posix.h index a823d08518..d3bfb65a15 100755 --- a/source/lib/posix.h +++ b/source/lib/posix.h @@ -402,6 +402,8 @@ struct sockaddr_in unsigned char sin_zero[8]; }; +#define INET_ADDRSTRLEN 16 + #define INADDR_ANY 0 #define INADDR_NONE ((in_addr_t)-1) @@ -417,7 +419,7 @@ struct ip_mreq // IPv6 Structures -struct in_addr6 { +struct in6_addr { unsigned char s6_addr[16]; }; @@ -425,7 +427,7 @@ struct sockaddr_in6 { sa_family_t sin6_family; /* AF_INET6 */ in_port_t sin6_port; /* Transport level port number */ unsigned long sin6_flowinfo; /* IPv6 flow information */ - struct in_addr6 sin6_addr; /* IPv6 address */ + struct in6_addr sin6_addr; /* IPv6 address */ unsigned long sin6_scope_id; /* set of interfaces for a scope */ }; @@ -436,8 +438,6 @@ extern const struct in6_addr in6addr_loopback; /* ::1 */ #define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } } #define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } } -#define INET6_ADDRSTRLEN 46 - // // // @@ -459,7 +459,49 @@ IMP(struct hostent*, gethostbyname, (const char *name)) #define h_error WSAGetLastError() #define TRY_AGAIN 11002 +#define HOST_NOT_FOUND 11001 +/* addrinfo struct */ +struct addrinfo +{ + int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */ + int ai_family; /* PF_xxx */ + int ai_socktype; /* SOCK_xxx */ + int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ + size_t ai_addrlen; /* Length of ai_addr */ + char *ai_canonname; /* Canonical name for nodename */ + struct sockaddr *ai_addr; /* Binary address */ + struct addrinfo *ai_next; /* Next structure in linked list */ +}; + +/* Hint flags for getaddrinfo */ +#define AI_PASSIVE 0x1 /* Socket address will be used in bind() call */ + +/* Flags for getnameinfo() */ +#define NI_NUMERICHOST 0x02 /* Return numeric form of the host's address */ + +/* Various Constants */ +#define NI_MAXHOST 1025 +#define NI_MAXSERV 32 + +/* Note that these are function pointers. They will be initialized by the + entry point function in posix.cpp */ +typedef int (*fp_getnameinfo_t)(const struct sockaddr *sa, socklen_t salen, char *node, + socklen_t nodelen, char *serv, socklen_t servlen, unsigned int flags); +typedef int (*fp_getaddrinfo_t)(const char *nodename, const char *servname, + const struct addrinfo *hints, struct addrinfo **res); +typedef void (*fp_freeaddrinfo_t)(struct addrinfo *ai); + +extern fp_getnameinfo_t p_getnameinfo; +extern fp_getaddrinfo_t p_getaddrinfo; +extern fp_freeaddrinfo_t p_freeaddrinfo; + +#define getnameinfo p_getnameinfo +#define getaddrinfo p_getaddrinfo +#define freeaddrinfo p_freeaddrinfo + +// getaddr/nameinfo error codes +#define EAI_NONAME HOST_NOT_FOUND // //