1
0
forked from mirrors/0ad

IPv6/getaddrinfo stuff - DLL detection

This was SVN commit r134.
This commit is contained in:
olsner
2003-12-10 19:29:01 +00:00
parent 68493a5a20
commit eacae7243e
2 changed files with 66 additions and 6 deletions
+20 -2
View File
@@ -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();
}
+46 -4
View File
@@ -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
//
// <netdb.h>
//
@@ -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
//
// <arpa/inet.h>