Skip to content

Commit

Permalink
Improve the mingw getaddrinfo stub to handle more use cases
Browse files Browse the repository at this point in the history
Allow the node parameter to be null, which is used for getting
the default bind address.

Also allow the hints parameter to be null, to improve standard
conformance of the stub implementation a little.

Signed-off-by: Martin Storsjo <martin@martin.st>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Martin Storsjö authored and Junio C Hamano committed Nov 4, 2010
1 parent 48cfaea commit cbefd2d
Showing 1 changed file with 21 additions and 7 deletions.
28 changes: 21 additions & 7 deletions compat/mingw.c
Original file line number Diff line number Diff line change
Expand Up @@ -1039,19 +1039,22 @@ static int WSAAPI getaddrinfo_stub(const char *node, const char *service,
const struct addrinfo *hints,
struct addrinfo **res)
{
struct hostent *h = gethostbyname(node);
struct hostent *h = NULL;
struct addrinfo *ai;
struct sockaddr_in *sin;

if (!h)
return WSAGetLastError();
if (node) {
h = gethostbyname(node);
if (!h)
return WSAGetLastError();
}

ai = xmalloc(sizeof(struct addrinfo));
*res = ai;
ai->ai_flags = 0;
ai->ai_family = AF_INET;
ai->ai_socktype = hints->ai_socktype;
switch (hints->ai_socktype) {
ai->ai_socktype = hints ? hints->ai_socktype : 0;
switch (ai->ai_socktype) {
case SOCK_STREAM:
ai->ai_protocol = IPPROTO_TCP;
break;
Expand All @@ -1063,14 +1066,25 @@ static int WSAAPI getaddrinfo_stub(const char *node, const char *service,
break;
}
ai->ai_addrlen = sizeof(struct sockaddr_in);
ai->ai_canonname = strdup(h->h_name);
if (hints && (hints->ai_flags & AI_CANONNAME))
ai->ai_canonname = h ? strdup(h->h_name) : NULL;
else
ai->ai_canonname = NULL;

sin = xmalloc(ai->ai_addrlen);
memset(sin, 0, ai->ai_addrlen);
sin->sin_family = AF_INET;
/* Note: getaddrinfo is supposed to allow service to be a string,
* which should be looked up using getservbyname. This is
* currently not implemented */
if (service)
sin->sin_port = htons(atoi(service));
sin->sin_addr = *(struct in_addr *)h->h_addr;
if (h)
sin->sin_addr = *(struct in_addr *)h->h_addr;
else if (hints && (hints->ai_flags & AI_PASSIVE))
sin->sin_addr.s_addr = INADDR_ANY;
else
sin->sin_addr.s_addr = INADDR_LOOPBACK;
ai->ai_addr = (struct sockaddr *)sin;
ai->ai_next = 0;
return 0;
Expand Down

0 comments on commit cbefd2d

Please sign in to comment.