diff options
author | plutooo <tfy12vbr@student.lu.se> | 2013-08-01 11:52:13 -0700 |
---|---|---|
committer | plutooo <tfy12vbr@student.lu.se> | 2013-08-01 11:54:06 -0700 |
commit | 3d916b35f2dadd17a7c9f5acd08ef396b8c8263c (patch) | |
tree | cf0fcbc0a51c0c02e4949e3cd4e8822b41bf5af8 /core/network.c | |
parent | d534a052648cc0085d6d6e40c22701e2feb5b416 (diff) |
core: getaddrinfo() lookup error handling
Diffstat (limited to 'core/network.c')
-rw-r--r-- | core/network.c | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/core/network.c b/core/network.c index a7a4efcd..c58549bf 100644 --- a/core/network.c +++ b/core/network.c | |||
@@ -164,25 +164,42 @@ void shutdown_networking() | |||
164 | return; | 164 | return; |
165 | } | 165 | } |
166 | 166 | ||
167 | /* resolves provided address to a binary data in network byte order | 167 | /* |
168 | address is ASCII null terminated string | 168 | resolve_addr(): |
169 | address should represent IPv4, IPv6 or a hostname | 169 | address should represent IPv4 or a hostname with A record |
170 | on success returns a data in network byte order that can be used to set IP.i or IP_Port.ip.i | 170 | |
171 | on failure returns -1 */ | 171 | returns a data in network byte order that can be used to set IP.i or IP_Port.ip.i |
172 | int resolve_addr(const char *address) | 172 | returns 0 on failure |
173 | |||
174 | TODO: Fix ipv6 support | ||
175 | */ | ||
176 | uint32_t resolve_addr(const char *address) | ||
173 | { | 177 | { |
174 | struct addrinfo hints; | 178 | struct addrinfo *server = NULL; |
179 | struct addrinfo hints; | ||
180 | int rc; | ||
181 | uint32_t addr; | ||
182 | |||
175 | memset(&hints, 0, sizeof(hints)); | 183 | memset(&hints, 0, sizeof(hints)); |
176 | hints.ai_family = AF_UNSPEC; //support both IPv4 and IPv6 | 184 | hints.ai_family = AF_INET; // IPv4 only right now. |
177 | hints.ai_socktype = SOCK_DGRAM; //type of socket Tox uses | 185 | hints.ai_socktype = SOCK_DGRAM; // type of socket Tox uses. |
178 | 186 | ||
179 | struct addrinfo *server = NULL; | 187 | rc = getaddrinfo(address, "echo", &hints, &server); |
180 | 188 | ||
181 | int success = getaddrinfo(address, "echo", &hints, &server); | 189 | // Lookup failed. |
182 | if(success != 0) | 190 | if(rc != 0) { |
183 | return -1; | 191 | return 0; |
192 | } | ||
193 | |||
194 | // IPv4 records only.. | ||
195 | if(server->ai_family != AF_INET) { | ||
196 | freeaddrinfo(server); | ||
197 | return 0; | ||
198 | } | ||
199 | |||
200 | |||
201 | addr = ((struct sockaddr_in*)server->ai_addr)->sin_addr.s_addr; | ||
184 | 202 | ||
185 | int resolved = ((struct sockaddr_in*)server->ai_addr)->sin_addr.s_addr; | ||
186 | freeaddrinfo(server); | 203 | freeaddrinfo(server); |
187 | return resolved; | 204 | return addr; |
188 | } | 205 | } |