38 #if LWIP_DNS && LWIP_SOCKET 51 struct 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 85 lwip_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];
98 err = netconn_gethostbyname(name, &addr);
101 h_errno = HOST_NOT_FOUND;
106 s_hostent_addr = addr;
107 s_phostent_addr[0] = &s_hostent_addr;
108 s_phostent_addr[1] =
NULL;
111 s_hostent.h_name = s_hostname;
113 s_hostent.h_aliases = &s_aliases;
114 s_hostent.h_addrtype = AF_INET;
116 s_hostent.h_addr_list = (
char**)&s_phostent_addr;
126 if (s_hostent.h_addr_list !=
NULL) {
128 for (idx=0; s_hostent.h_addr_list[
idx]; idx++) {
135 #if LWIP_DNS_API_HOSTENT_STORAGE 137 return sys_thread_hostent(&s_hostent);
160 lwip_gethostbyname_r(
const char *name,
struct hostent *ret,
char *buf,
161 size_t buflen,
struct hostent **result,
int *h_errnop)
164 struct gethostbyname_r_helper *h;
169 if (h_errnop ==
NULL) {
171 h_errnop = &lh_errno;
174 if (result ==
NULL) {
187 namelen = strlen(name);
188 if (buflen < (
sizeof(
struct gethostbyname_r_helper) + namelen + 1 + (
MEM_ALIGNMENT - 1))) {
195 hostname = ((
char*)h) +
sizeof(
struct gethostbyname_r_helper);
198 err = netconn_gethostbyname(name, &h->addr);
201 *h_errnop = HOST_NOT_FOUND;
206 MEMCPY(hostname, name, namelen);
207 hostname[namelen] = 0;
210 h->addr_list[0] = &h->addr;
211 h->addr_list[1] =
NULL;
213 ret->h_name = hostname;
214 ret->h_aliases = &h->aliases;
215 ret->h_addrtype = AF_INET;
217 ret->h_addr_list = (
char**)&h->addr_list;
234 lwip_freeaddrinfo(
struct addrinfo *ai)
236 struct addrinfo *next;
267 lwip_getaddrinfo(
const char *nodename,
const char *servname,
268 const struct addrinfo *hints,
struct addrinfo **res)
273 struct sockaddr_storage *sa =
NULL;
283 if ((nodename ==
NULL) && (servname ==
NULL)) {
288 ai_family = hints->ai_family;
289 if ((ai_family != AF_UNSPEC)
291 && (ai_family != AF_INET)
294 && (ai_family != AF_INET6)
300 ai_family = AF_UNSPEC;
303 if (servname !=
NULL) {
306 port_nr = atoi(servname);
307 if ((port_nr <= 0) || (port_nr > 0xffff)) {
312 if (nodename !=
NULL) {
314 if ((hints !=
NULL) && (hints->ai_flags & AI_NUMERICHOST)) {
319 #if LWIP_IPV4 && LWIP_IPV6 326 #if LWIP_IPV4 && LWIP_IPV6 328 u8_t type = NETCONN_DNS_IPV4_IPV6;
329 if (ai_family == AF_INET) {
330 type = NETCONN_DNS_IPV4;
331 }
else if (ai_family == AF_INET6) {
332 type = NETCONN_DNS_IPV6;
335 err = netconn_gethostbyname_addrtype(nodename, &addr, type);
342 if ((hints !=
NULL) && (hints->ai_flags & AI_PASSIVE)) {
349 total_size =
sizeof(
struct addrinfo) + sizeof(struct sockaddr_storage);
350 if (nodename !=
NULL) {
351 namelen = strlen(nodename);
356 LWIP_ASSERT(
"namelen is too long", total_size + namelen + 1 > total_size);
357 total_size += namelen + 1;
360 LWIP_ASSERT(
"total_size <= NETDB_ELEM_SIZE: please report this!",
361 total_size <= NETDB_ELEM_SIZE);
366 memset(ai, 0, total_size);
367 sa = (
struct sockaddr_storage *)(
void*)((
u8_t*)ai +
sizeof(
struct addrinfo));
370 struct sockaddr_in6 *sa6 = (
struct sockaddr_in6*)sa;
372 inet6_addr_from_ip6addr(&sa6->sin6_addr,
ip_2_ip6(&addr));
373 sa6->sin6_family = AF_INET6;
374 sa6->sin6_len =
sizeof(
struct sockaddr_in6);
376 ai->ai_family = AF_INET6;
380 struct sockaddr_in *sa4 = (
struct sockaddr_in*)sa;
382 inet_addr_from_ipaddr(&sa4->sin_addr, ip_2_ip4(&addr));
383 sa4->sin_family = AF_INET;
384 sa4->sin_len =
sizeof(
struct sockaddr_in);
386 ai->ai_family = AF_INET;
393 ai->ai_socktype = hints->ai_socktype;
394 ai->ai_protocol = hints->ai_protocol;
396 if (nodename !=
NULL) {
398 ai->ai_canonname = ((
char*)ai +
sizeof(
struct addrinfo) +
sizeof(
struct sockaddr_storage));
399 MEMCPY(ai->ai_canonname, nodename, namelen);
400 ai->ai_canonname[namelen] = 0;
402 ai->ai_addrlen =
sizeof(
struct sockaddr_storage);
403 ai->ai_addr = (
struct sockaddr*)sa;
#define DNS_MAX_NAME_LENGTH
#define MEMCPY(dst, src, len)
void memp_free(memp_t type, void *mem)
#define ip_addr_set_any(is_ipv6, ipaddr)
#define IP_IS_V6_VAL(ipaddr)
#define LWIP_ASSERT(message, assertion)
#define ipaddr_aton(cp, addr)
#define ipaddr_ntoa(ipaddr)
#define LWIP_MEM_ALIGN(addr)
#define ip_addr_set_loopback(is_ipv6, ipaddr)
void * memp_malloc(memp_t type)
#define LWIP_DEBUGF(debug, message)