summaryrefslogtreecommitdiff
path: root/src/netops.c
diff options
context:
space:
mode:
authorEduardo Bart <edub4rt@gmail.com>2012-11-06 20:16:53 -0200
committerEduardo Bart <edub4rt@gmail.com>2012-11-06 20:22:11 -0200
commitd1a69d0fff03dcd4326adb63aee6464be0cad83f (patch)
treed6fb572817dff805637f10a6b4fa961ace0a0dcc /src/netops.c
parent8a85378829cb3bd417b04cd690da8d7d470b6214 (diff)
downloadlibgit2-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.c52
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
+}