4 * Simple version of getaddrinfo()
13 void freeaddrinfo(struct addrinfo
*res
)
18 freeaddrinfo(res
->ai_next
);
21 if (res
->ai_canonname
)
22 free(res
->ai_canonname
);
26 int getaddrinfo(const char *node
, const char *service
, const struct addrinfo
*hints
,
27 struct addrinfo
**res
)
33 if ((!node
) || (!res
)) {
38 /* we do not support service in this version */
43 host
= gethostbyname(node
);
47 if (hints
->ai_family
!= AF_UNSPEC
) {
48 if (hints
->ai_family
!= host
->h_addrtype
)
49 return EAI_ADDRFAMILY
;
52 *res
= malloc(sizeof(struct addrinfo
));
56 memset(*res
, 0, sizeof(struct addrinfo
));
57 (*res
)->ai_family
= host
->h_addrtype
;
59 if (host
->h_addrtype
== AF_INET
)
60 size
= sizeof(struct sockaddr_in
);
62 else if (host
->h_addrtype
== AF_INET6
)
63 size
= sizeof(struct sockaddr_in6
);
68 return EAI_ADDRFAMILY
;
78 (*res
)->ai_addrlen
= size
;
79 sa
->sa_family
= host
->h_addrtype
;
80 if (host
->h_addrtype
== AF_INET
)
81 memcpy(&((struct sockaddr_in
*)sa
)->sin_addr
, host
->h_addr
, host
->h_length
);
84 memcpy(&((struct sockaddr_in6
*)sa
)->sin6_addr
, host
->h_addr
, host
->h_length
);
88 (*res
)->ai_canonname
= strdup(host
->h_name
);
90 /* we only handle the first address entry and do not build a list now */
96 const char *gai_strerror(int errcode
)
111 s
= hstrerror(h_errno
);
114 s
= "address does not match address family";
117 s
= "unknown error code";