mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-06 19:37:29 +00:00
Initialise the winsock DLL
Windows wants us to initialise the networking DLL before we're allowed to send data through a socket. Call WSASetup and WSACleanup if GIT_WIN32 is defined. Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
This commit is contained in:
parent
a95aeb489f
commit
ccc9872d4d
12
src/netops.c
12
src/netops.c
@ -77,7 +77,7 @@ int gitno_connect(const char *host, const char *port)
|
||||
struct addrinfo *info, *p;
|
||||
struct addrinfo hints;
|
||||
int ret, error = GIT_SUCCESS;
|
||||
int s;
|
||||
GIT_SOCKET s;
|
||||
|
||||
memset(&hints, 0x0, sizeof(struct addrinfo));
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
@ -92,7 +92,11 @@ int gitno_connect(const char *host, const char *port)
|
||||
|
||||
for (p = info; p != NULL; p = p->ai_next) {
|
||||
s = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
|
||||
#ifdef GIT_WIN32
|
||||
if (s == INVALID_SOCKET) {
|
||||
#else
|
||||
if (s < 0) {
|
||||
#endif
|
||||
error = GIT_EOSERR;
|
||||
goto cleanup;
|
||||
}
|
||||
@ -109,19 +113,21 @@ int gitno_connect(const char *host, const char *port)
|
||||
}
|
||||
|
||||
/* Oops, we couldn't connect to any address */
|
||||
error = GIT_EOSERR;
|
||||
error = git__throw(GIT_EOSERR, "Failed to connect: %s", strerror(errno));
|
||||
|
||||
cleanup:
|
||||
freeaddrinfo(info);
|
||||
return error;
|
||||
}
|
||||
|
||||
int gitno_send(int s, const char *msg, size_t len, int flags)
|
||||
int gitno_send(GIT_SOCKET s, const char *msg, size_t len, int flags)
|
||||
{
|
||||
int ret;
|
||||
size_t off = 0;
|
||||
|
||||
while (off < len) {
|
||||
errno = 0;
|
||||
|
||||
ret = send(s, msg + off, len - off, flags);
|
||||
if (ret < 0)
|
||||
return git__throw(GIT_EOSERR, "Error sending data: %s", strerror(errno));
|
||||
|
@ -10,7 +10,7 @@
|
||||
#ifndef GIT_WIN32
|
||||
typedef int GIT_SOCKET;
|
||||
#else
|
||||
typedef unsigned int GIT_SOCKET;
|
||||
typedef SOCKET GIT_SOCKET;
|
||||
#endif
|
||||
|
||||
typedef struct gitno_buffer {
|
||||
@ -26,7 +26,7 @@ void gitno_consume(gitno_buffer *buf, const char *ptr);
|
||||
void gitno_consume_n(gitno_buffer *buf, size_t cons);
|
||||
|
||||
int gitno_connect(const char *host, const char *port);
|
||||
int gitno_send(int s, const char *msg, size_t len, int flags);
|
||||
int gitno_send(GIT_SOCKET s, const char *msg, size_t len, int flags);
|
||||
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);
|
||||
|
@ -52,6 +52,9 @@ typedef struct {
|
||||
enum last_cb last_cb;
|
||||
char *content_type;
|
||||
char *service;
|
||||
#ifdef GIT_WIN32
|
||||
WSADATA wsd;
|
||||
#endif
|
||||
} transport_http;
|
||||
|
||||
static int gen_request(git_buf *buf, const char *url, const char *host, const char *service)
|
||||
@ -76,7 +79,8 @@ static int gen_request(git_buf *buf, const char *url, const char *host, const ch
|
||||
static int do_connect(transport_http *t, const char *service)
|
||||
{
|
||||
git_buf request = GIT_BUF_INIT;
|
||||
int s = -1, error;
|
||||
int error;
|
||||
int s;
|
||||
const char *url, *prefix;
|
||||
char *host = NULL, *port = NULL;
|
||||
|
||||
@ -362,6 +366,10 @@ static int http_close(git_transport *transport)
|
||||
if (error < 0)
|
||||
return git__throw(GIT_EOSERR, "Failed to close the socket: %s", strerror(errno));
|
||||
|
||||
#ifdef GIT_WIN32
|
||||
WSACleanup();
|
||||
#endif
|
||||
|
||||
return GIT_SUCCESS;
|
||||
}
|
||||
|
||||
@ -388,6 +396,9 @@ static void http_free(git_transport *transport)
|
||||
int git_transport_http(git_transport **out)
|
||||
{
|
||||
transport_http *t;
|
||||
#ifdef GIT_WIN32
|
||||
int ret;
|
||||
#endif
|
||||
|
||||
t = git__malloc(sizeof(transport_http));
|
||||
if (t == NULL)
|
||||
@ -402,5 +413,13 @@ int git_transport_http(git_transport **out)
|
||||
|
||||
*out = (git_transport *) t;
|
||||
|
||||
#ifdef GIT_WIN32
|
||||
ret = WSAStartup(MAKEWORD(2,2), &t->wsd);
|
||||
if (ret != 0) {
|
||||
http_free(*out);
|
||||
return git__throw(GIT_EOSERR, "Winsock init failed");
|
||||
}
|
||||
#endif
|
||||
|
||||
return GIT_SUCCESS;
|
||||
}
|
||||
|
@ -22,10 +22,13 @@
|
||||
|
||||
typedef struct {
|
||||
git_transport parent;
|
||||
int socket;
|
||||
GIT_SOCKET socket;
|
||||
git_vector refs;
|
||||
git_remote_head **heads;
|
||||
git_transport_caps caps;
|
||||
#ifdef GIT_WIN32
|
||||
WSADATA wsd;
|
||||
#endif
|
||||
} transport_git;
|
||||
|
||||
/*
|
||||
@ -68,7 +71,7 @@ static int gen_proto(char **out, int *outlen, const char *cmd, const char *url)
|
||||
return GIT_SUCCESS;
|
||||
}
|
||||
|
||||
static int send_request(int s, const char *cmd, const char *url)
|
||||
static int send_request(GIT_SOCKET s, const char *cmd, const char *url)
|
||||
{
|
||||
int error, len;
|
||||
char *msg = NULL;
|
||||
@ -91,7 +94,7 @@ cleanup:
|
||||
*/
|
||||
static int do_connect(transport_git *t, const char *url)
|
||||
{
|
||||
int s = -1;
|
||||
GIT_SOCKET s;
|
||||
char *host, *port;
|
||||
const char prefix[] = "git://";
|
||||
int error, connected = 0;
|
||||
@ -525,6 +528,10 @@ 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);
|
||||
@ -534,6 +541,9 @@ static void git_free(git_transport *transport)
|
||||
int git_transport_git(git_transport **out)
|
||||
{
|
||||
transport_git *t;
|
||||
#ifdef GIT_WIN32
|
||||
int ret;
|
||||
#endif
|
||||
|
||||
t = git__malloc(sizeof(transport_git));
|
||||
if (t == NULL)
|
||||
@ -554,5 +564,13 @@ int git_transport_git(git_transport **out)
|
||||
|
||||
*out = (git_transport *) t;
|
||||
|
||||
#ifdef GIT_WIN32
|
||||
ret = WSAStartup(MAKEWORD(2,2), &t->wsd);
|
||||
if (ret != 0) {
|
||||
git_free(*out);
|
||||
return git__throw(GIT_EOSERR, "Winsock init failed");
|
||||
}
|
||||
#endif
|
||||
|
||||
return GIT_SUCCESS;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user