1 /* $Header: /cvsroot/pgsql/src/port/getaddrinfo.c,v 1.1 2003/03/29 11:31:52 petere Exp $ */
4 #include "getaddrinfo.h"
6 #include <sys/socket.h>
7 #include <netinet/in.h>
12 getaddrinfo(const char *node, const char *service,
13 const struct addrinfo *hints,
14 struct addrinfo **res)
17 struct sockaddr_in sin, *psin;
19 if (!hints || (hints->ai_family != AF_INET && hints->ai_family != AF_UNSPEC))
22 if (hints->ai_socktype != SOCK_STREAM)
25 if (!node && !service)
31 sin.sin_addr.s_addr = htonl(INADDR_ANY);
32 else if (hints->ai_flags & AI_NUMERICHOST)
34 inet_aton(node, &sin.sin_addr);
40 hp = gethostbyname(node);
56 if (hp->h_addrtype != AF_INET)
57 return EAI_ADDRFAMILY;
59 memmove(&(sin.sin_addr), hp->h_addr, hp->h_length);
64 if (hints->ai_flags & AI_PASSIVE)
65 sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
69 sin.sin_port = htons((unsigned short)atoi(service));
71 ai = malloc(sizeof(*ai));
74 psin = malloc(sizeof(*psin));
81 memcpy(psin, &sin, sizeof(sin));
83 ai->ai_family = hints->ai_family;
84 ai->ai_socktype = hints->ai_socktype;
85 ai->ai_protocol = hints->ai_protocol;
86 ai->ai_addrlen = sizeof(*psin);
87 ai->ai_addr = (struct sockaddr *) psin;
88 ai->ai_canonname = NULL;
98 freeaddrinfo(struct addrinfo *res)
110 gai_strerror(int errcode)
117 hcode = HOST_NOT_FOUND;
131 return hstrerror(hcode);