summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarlos Martín Nieto <carlos@cmartin.tk>2011-09-30 23:48:27 +0200
committerCarlos Martín Nieto <carlos@cmartin.tk>2011-10-01 00:41:09 +0200
commitbad53552e539e58b76c4fcf4902686534f8a2678 (patch)
tree33eee462cf8d8e6ab4a4f366bc5c3378d33d1e18 /src
parenta28889198cf9565944aa0ff983459c6bf6eec311 (diff)
downloadlibgit2-bad53552e539e58b76c4fcf4902686534f8a2678.tar.gz
netops: abstract away socket closing
Winsock wants us to use closesocket() instead of close(), so introduce the gitno_close function, which does the right thing. Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
Diffstat (limited to 'src')
-rw-r--r--src/netops.c12
-rw-r--r--src/netops.h1
-rw-r--r--src/transport-http.c2
-rw-r--r--src/transport_git.c13
4 files changed, 20 insertions, 8 deletions
diff --git a/src/netops.c b/src/netops.c
index c8fe37645..7d8a7b28c 100644
--- a/src/netops.c
+++ b/src/netops.c
@@ -138,6 +138,18 @@ int gitno_send(GIT_SOCKET s, const char *msg, size_t len, int flags)
return off;
}
+#ifdef GIT_WIN32
+int gitno_close(GIT_SOCKET s)
+{
+ return closesocket(s) == SOCKET_ERROR ? -1 : 0;
+}
+#else
+int gitno_close(GIT_SOCKET s)
+{
+ return close(s);
+}
+#endif
+
int gitno_select_in(gitno_buffer *buf, long int sec, long int usec)
{
fd_set fds;
diff --git a/src/netops.h b/src/netops.h
index b0425ae76..203df85af 100644
--- a/src/netops.h
+++ b/src/netops.h
@@ -27,6 +27,7 @@ void gitno_consume_n(gitno_buffer *buf, size_t cons);
int gitno_connect(const char *host, const char *port);
int gitno_send(GIT_SOCKET s, const char *msg, size_t len, int flags);
+int gitno_close(GIT_SOCKET s);
int gitno_select_in(gitno_buffer *buf, long int sec, long int usec);
int gitno_extract_host_and_port(char **host, char **port, const char *url, const char *default_port);
diff --git a/src/transport-http.c b/src/transport-http.c
index 3ee4025f8..1da56e11f 100644
--- a/src/transport-http.c
+++ b/src/transport-http.c
@@ -362,7 +362,7 @@ static int http_close(git_transport *transport)
transport_http *t = (transport_http *) transport;
int error;
- error = close(t->socket);
+ error = gitno_close(t->socket);
if (error < 0)
return git__throw(GIT_EOSERR, "Failed to close the socket: %s", strerror(errno));
diff --git a/src/transport_git.c b/src/transport_git.c
index 42503e1c9..8529fd47a 100644
--- a/src/transport_git.c
+++ b/src/transport_git.c
@@ -505,15 +505,18 @@ static int git_download_pack(char **out, git_transport *transport, git_repositor
static int git_close(git_transport *transport)
{
transport_git *t = (transport_git*) transport;
- int s = t->socket;
int error;
/* Can't do anything if there's an error, so don't bother checking */
- git_pkt_send_flush(s);
- error = close(s);
+ git_pkt_send_flush(t->socket);
+ error = gitno_close(t->socket);
if (error < 0)
error = git__throw(GIT_EOSERR, "Failed to close socket");
+#ifdef GIT_WIN32
+ WSACleanup();
+#endif
+
return error;
}
@@ -528,10 +531,6 @@ static void git_free(git_transport *transport)
git_pkt_free(p);
}
-#ifdef GIT_WIN32
- WSACleanup();
-#endif
-
git_vector_free(refs);
free(t->heads);
free(t->parent.url);