diff options
author | Eduardo Bart <edub4rt@gmail.com> | 2012-11-06 20:16:53 -0200 |
---|---|---|
committer | Eduardo Bart <edub4rt@gmail.com> | 2012-11-06 20:22:11 -0200 |
commit | d1a69d0fff03dcd4326adb63aee6464be0cad83f (patch) | |
tree | d6fb572817dff805637f10a6b4fa961ace0a0dcc /src/netops.c | |
parent | 8a85378829cb3bd417b04cd690da8d7d470b6214 (diff) | |
download | libgit2-d1a69d0fff03dcd4326adb63aee6464be0cad83f.tar.gz |
Fix compilation for mingw32 and cygwin
inet_pton is available only in windows vista or later,
fixed the issue by reimplementing it using WSAStringToAddress
Diffstat (limited to 'src/netops.c')
-rw-r--r-- | src/netops.c | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/src/netops.c b/src/netops.c index 3e2743486..6d7d2c1c1 100644 --- a/src/netops.c +++ b/src/netops.c @@ -274,11 +274,11 @@ static int verify_server_cert(gitno_ssl *ssl, const char *host) } /* Try to parse the host as an IP address to see if it is */ - if (inet_pton(AF_INET, host, &addr4)) { + if (gitno_inet_pton(AF_INET, host, &addr4)) { type = GEN_IPADD; addr = &addr4; } else { - if(inet_pton(AF_INET6, host, &addr6)) { + if(gitno_inet_pton(AF_INET6, host, &addr6)) { type = GEN_IPADD; addr = &addr6; } @@ -597,3 +597,51 @@ int gitno_extract_host_and_port(char **host, char **port, const char *url, const return 0; } + +int gitno_inet_pton(int af, const char* src, void* dst) +{ + /* inet_pton is only available in Windows Vista or later + * mingw32 and cygwin give compile errors */ +#ifndef GIT_WIN32 + return inet_pton(af, src, dst); +#else + union { + struct sockaddr_in6 sin6; + struct sockaddr_in sin; + } sa; + size_t srcsize; + + switch(af) + { + case AF_INET: + sa.sin.sin_family = AF_INET; + srcsize = sizeof (sa.sin); + break; + case AF_INET6: + sa.sin6.sin6_family = AF_INET6; + srcsize = sizeof (sa.sin6); + break; + default: + errno = WSAEPFNOSUPPORT; + return -1; + } + + if (WSAStringToAddress(src, af, NULL, (struct sockaddr *) &sa, &srcsize) != 0) + { + errno = WSAGetLastError(); + return -1; + } + + switch(af) + { + case AF_INET: + memcpy(dst, &sa.sin.sin_addr, sizeof(sa.sin.sin_addr)); + break; + case AF_INET6: + memcpy(dst, &sa.sin6.sin6_addr, sizeof(sa.sin6.sin6_addr)); + break; + } + + return 1; +#endif +} |