38#if LWIP_DNS && LWIP_SOCKET
43#include "lwip/ip_addr.h"
51struct gethostbyname_r_helper {
58#if LWIP_DNS_API_DECLARE_H_ERRNO
64#ifndef LWIP_DNS_API_HOSTENT_STORAGE
65#define LWIP_DNS_API_HOSTENT_STORAGE 0
69#if LWIP_DNS_API_HOSTENT_STORAGE
70#define HOSTENT_STORAGE
72#define HOSTENT_STORAGE static
85lwip_gethostbyname(
const char *name)
91 HOSTENT_STORAGE
struct hostent s_hostent;
92 HOSTENT_STORAGE
char *s_aliases;
94 HOSTENT_STORAGE
ip_addr_t *s_phostent_addr[2];
97 err = netconn_gethostbyname(name, &addr);
100 h_errno = HOST_NOT_FOUND;
105 s_hostent_addr = addr;
106 s_phostent_addr[0] = &s_hostent_addr;
107 s_phostent_addr[1] =
NULL;
108 s_hostent.h_name = (
char*)name;
109 s_hostent.h_aliases = &s_aliases;
110 s_hostent.h_addrtype = AF_INET;
112 s_hostent.h_addr_list = (
char**)&s_phostent_addr;
118 if (s_hostent.h_aliases !=
NULL) {
120 for ( idx=0; s_hostent.h_aliases[idx]; idx++) {
128 if (s_hostent.h_addr_list !=
NULL) {
130 for ( idx=0; s_hostent.h_addr_list[idx]; idx++) {
137#if LWIP_DNS_API_HOSTENT_STORAGE
139 return sys_thread_hostent(&s_hostent);
162lwip_gethostbyname_r(
const char *name,
struct hostent *ret,
char *buf,
163 size_t buflen,
struct hostent **result,
int *h_errnop)
166 struct gethostbyname_r_helper *h;
171 if (h_errnop ==
NULL) {
173 h_errnop = &lh_errno;
176 if (result ==
NULL) {
189 namelen = strlen(name);
190 if (buflen < (
sizeof(
struct gethostbyname_r_helper) + namelen + 1 + (
MEM_ALIGNMENT - 1))) {
197 hostname = ((
char*)h) +
sizeof(
struct gethostbyname_r_helper);
200 err = netconn_gethostbyname(name, &h->addr);
203 *h_errnop = HOST_NOT_FOUND;
208 MEMCPY(hostname, name, namelen);
209 hostname[namelen] = 0;
212 h->addr_list[0] = &h->addr;
213 h->addr_list[1] =
NULL;
215 ret->h_name = hostname;
216 ret->h_aliases = &h->aliases;
217 ret->h_addrtype = AF_INET;
219 ret->h_addr_list = (
char**)&h->addr_list;
236lwip_freeaddrinfo(
struct addrinfo *ai)
238 struct addrinfo *
next;
267lwip_getaddrinfo(
const char *nodename,
const char *servname,
268 const struct addrinfo *hints,
struct addrinfo **res)
273 struct sockaddr_in *sa =
NULL;
282 if ((nodename ==
NULL) && (servname ==
NULL)) {
286 if (servname !=
NULL) {
289 port_nr = atoi(servname);
290 if ((port_nr <= 0) || (port_nr > 0xffff)) {
295 if (nodename !=
NULL) {
297 err = netconn_gethostbyname(nodename, &addr);
306 total_size =
sizeof(
struct addrinfo) + sizeof(struct sockaddr_in);
307 if (nodename !=
NULL) {
308 namelen = strlen(nodename);
310 total_size += namelen + 1;
313 LWIP_ASSERT(
"total_size <= NETDB_ELEM_SIZE: please report this!",
314 total_size <= NETDB_ELEM_SIZE);
319 memset(ai, 0, total_size);
320 sa = (
struct sockaddr_in*)((
u8_t*)ai +
sizeof(
struct addrinfo));
323 sa->sin_family = AF_INET;
324 sa->sin_len =
sizeof(
struct sockaddr_in);
328 ai->ai_family = AF_INET;
331 ai->ai_socktype = hints->ai_socktype;
332 ai->ai_protocol = hints->ai_protocol;
334 if (nodename !=
NULL) {
336 ai->ai_canonname = ((
char*)ai +
sizeof(
struct addrinfo) +
sizeof(
struct sockaddr_in));
337 MEMCPY(ai->ai_canonname, nodename, namelen);
338 ai->ai_canonname[namelen] = 0;
340 ai->ai_addrlen =
sizeof(
struct sockaddr_in);
341 ai->ai_addr = (
struct sockaddr*)sa;
#define LWIP_DEBUGF(debug, message)
#define LWIP_ASSERT(message, assertion)
#define inet_addr_from_ipaddr(target_inaddr, source_ipaddr)
#define ip_addr_set_loopback(ipaddr)
typedefPACK_STRUCT_END struct ip_addr ip_addr_t
#define LWIP_MEM_ALIGN(addr)
void * memp_malloc(memp_t type)
void memp_free(memp_t type, void *mem)
#define MEMCPY(dst, src, len)