summaryrefslogtreecommitdiff
path: root/src/netops.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/netops.c')
-rw-r--r--src/netops.c38
1 files changed, 31 insertions, 7 deletions
diff --git a/src/netops.c b/src/netops.c
index 67a361ea9..7ee720d67 100644
--- a/src/netops.c
+++ b/src/netops.c
@@ -166,9 +166,35 @@ void gitno_consume_n(gitno_buffer *buf, size_t cons)
buf->offset -= cons;
}
+int gitno_ssl_teardown(git_transport *t)
+{
+ int ret = ret;
+
+ if (!t->encrypt)
+ return 0;
+
#ifdef GIT_GNUTLS
+ gnutls_deinit(t->ssl.session);
+ gnutls_certificate_free_credentials(t->ssl.cred);
+ gnutls_global_deinit();
+#elif defined(GIT_OPENSSL)
+
+ do {
+ ret = SSL_shutdown(t->ssl.ssl);
+ } while (ret == 0);
+ if (ret < 0)
+ return ssl_set_error(&t->ssl, ret);
+
+ SSL_free(t->ssl.ssl);
+ SSL_CTX_free(t->ssl.ctx);
+#endif
+ return 0;
+}
+
+
static int ssl_setup(git_transport *t)
{
+#ifdef GIT_GNUTLS
int ret;
if ((ret = gnutls_global_init()) < 0)
@@ -199,11 +225,9 @@ static int ssl_setup(git_transport *t)
on_error:
gnutls_deinit(t->ssl.session);
+ gnutls_global_deinit();
return -1;
-}
#elif defined(GIT_OPENSSL)
-static int ssl_setup(git_transport *t)
-{
int ret;
SSL_library_init();
@@ -225,9 +249,11 @@ static int ssl_setup(git_transport *t)
return ssl_set_error(&t->ssl, ret);
return 0;
-}
+#else
+ GIT_UNUSED(t);
+ return 0;
#endif
-
+}
int gitno_connect(git_transport *t, const char *host, const char *port)
{
struct addrinfo *info = NULL, *p;
@@ -268,10 +294,8 @@ int gitno_connect(git_transport *t, const char *host, const char *port)
t->socket = s;
freeaddrinfo(info);
-#ifdef GIT_SSL
if (t->encrypt && ssl_setup(t) < 0)
return -1;
-#endif
return 0;
}