source:
code/branches/ipv6/src/external/enet/patches/0001-use-getaddrinfo-for-lookup-in-unix.c.patch
@
7384
Last change on this file since 7384 was 7378, checked in by adrfried, 14 years ago | |
---|---|
File size: 4.1 KB |
-
unix.c
From e4638515a1ade5a23f3b8eb9ca7dad249a3d6903 Mon Sep 17 00:00:00 2001 From: Adrian Friedli <adi@koalatux.ch> Date: Thu, 2 Sep 2010 14:26:42 +0200 Subject: [PATCH 1/4] use getaddrinfo for lookup in unix.c --- unix.c | 99 +++++++++++++++++++++++++-------------------------------------- 1 files changed, 39 insertions(+), 60 deletions(-) diff --git a/unix.c b/unix.c index 6971541..7329e8d 100644
a b enet_time_set (enet_uint32 newTimeBase) 74 74 int 75 75 enet_address_set_host (ENetAddress * address, const char * name) 76 76 { 77 struct hostent * hostEntry = NULL; 78 #ifdef HAS_GETHOSTBYNAME_R 79 struct hostent hostData; 80 char buffer [2048]; 81 int errnum; 82 83 #if defined(linux) || defined(__linux) || defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) 84 gethostbyname_r (name, & hostData, buffer, sizeof (buffer), & hostEntry, & errnum); 85 #else 86 hostEntry = gethostbyname_r (name, & hostData, buffer, sizeof (buffer), & errnum); 87 #endif 88 #else 89 hostEntry = gethostbyname (name); 90 #endif 77 struct addrinfo hints; 78 struct addrinfo * result; 79 struct addrinfo * res; 80 81 memset(& hints, 0, sizeof (hints)); 82 hints.ai_flags = AI_NUMERICSERV; 83 hints.ai_family = AF_INET; 91 84 92 if (hostEntry == NULL || 93 hostEntry -> h_addrtype != AF_INET) 85 if ( getaddrinfo(name, NULL, &hints, &result) ) 94 86 { 95 #ifdef HAS_INET_PTON 96 if (! inet_pton (AF_INET, name, & address -> host)) 97 #else 98 if (! inet_aton (name, (struct in_addr *) & address -> host)) 99 #endif 100 return -1; 101 return 0; 87 return -1; 102 88 } 103 89 104 address -> host = * (enet_uint32 *) hostEntry -> h_addr_list [0]; 90 for (res = result; res != NULL; res = res -> ai_next) 91 { 92 if (res -> ai_family == AF_INET) 93 { 94 address -> host = ((struct sockaddr_in *) res -> ai_addr ) -> sin_addr.s_addr; 95 break; 96 } 97 } 98 freeaddrinfo(result); 99 if (res == NULL) return -1; 105 100 106 101 return 0; 107 102 } 108 103 109 int110 enet_address_get_host_ ip (const ENetAddress * address, char * name, size_t nameLength)104 static int 105 enet_address_get_host_x (const ENetAddress * address, char * name, size_t nameLength, int flags) 111 106 { 112 #ifdef HAS_INET_NTOP 113 if (inet_ntop (AF_INET, & address -> host, name, nameLength) == NULL) 114 #else 115 char * addr = inet_ntoa (* (struct in_addr *) & address -> host); 116 if (addr != NULL) 117 strncpy (name, addr, nameLength); 118 else 119 #endif 107 struct sockaddr_in sin; 108 109 memset (& sin, 0, sizeof (struct sockaddr_in)); 110 111 sin.sin_family = AF_INET; 112 sin.sin_addr = * (struct in_addr *) & address -> host; 113 114 if ( getnameinfo((struct sockaddr *) & sin, sizeof(sin), name, nameLength, NULL, 0, flags)) 115 { 120 116 return -1; 117 } 118 121 119 return 0; 122 120 } 123 121 124 122 int 125 enet_address_get_host (const ENetAddress * address, char * name, size_t nameLength)123 enet_address_get_host_ip (const ENetAddress * address, char * name, size_t nameLength) 126 124 { 127 struct in_addr in; 128 struct hostent * hostEntry = NULL; 129 #ifdef HAS_GETHOSTBYADDR_R 130 struct hostent hostData; 131 char buffer [2048]; 132 int errnum; 133 134 in.s_addr = address -> host; 135 136 #if defined(linux) || defined(__linux) || defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) 137 gethostbyaddr_r ((char *) & in, sizeof (struct in_addr), AF_INET, & hostData, buffer, sizeof (buffer), & hostEntry, & errnum); 138 #else 139 hostEntry = gethostbyaddr_r ((char *) & in, sizeof (struct in_addr), AF_INET, & hostData, buffer, sizeof (buffer), & errnum); 140 #endif 141 #else 142 in.s_addr = address -> host; 143 144 hostEntry = gethostbyaddr ((char *) & in, sizeof (struct in_addr), AF_INET); 145 #endif 146 147 if (hostEntry == NULL) 148 return enet_address_get_host_ip (address, name, nameLength); 149 150 strncpy (name, hostEntry -> h_name, nameLength); 125 return enet_address_get_host_x(address, name, nameLength, NI_NUMERICHOST); 126 } 151 127 152 return 0; 128 int 129 enet_address_get_host (const ENetAddress * address, char * name, size_t nameLength) 130 { 131 return enet_address_get_host_x(address, name, nameLength, 0); 153 132 } 154 133 155 134 int
Note: See TracBrowser
for help on using the repository browser.