Commit 56b7df10 by Carlos Martín Nieto Committed by Vicent Martí

error-handling: netops

parent 25530fca
...@@ -41,10 +41,13 @@ int gitno_recv(gitno_buffer *buf) ...@@ -41,10 +41,13 @@ int gitno_recv(gitno_buffer *buf)
int ret; int ret;
ret = recv(buf->fd, buf->data + buf->offset, buf->len - buf->offset, 0); ret = recv(buf->fd, buf->data + buf->offset, buf->len - buf->offset, 0);
if (ret < 0)
return git__throw(GIT_EOSERR, "Failed to receive data: %s", strerror(errno));
if (ret == 0) /* Orderly shutdown, so exit */ if (ret == 0) /* Orderly shutdown, so exit */
return GIT_SUCCESS; return 0;
if (ret < 0) {
giterr_set(GITERR_NET, "Error receiving data");
return -1;
}
buf->offset += ret; buf->offset += ret;
...@@ -78,18 +81,16 @@ int gitno_connect(const char *host, const char *port) ...@@ -78,18 +81,16 @@ int gitno_connect(const char *host, const char *port)
{ {
struct addrinfo *info, *p; struct addrinfo *info, *p;
struct addrinfo hints; struct addrinfo hints;
int ret, error = GIT_SUCCESS; int ret;
GIT_SOCKET s; GIT_SOCKET s;
memset(&hints, 0x0, sizeof(struct addrinfo)); memset(&hints, 0x0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC; hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM; hints.ai_socktype = SOCK_STREAM;
ret = getaddrinfo(host, port, &hints, &info); if ((ret = getaddrinfo(host, port, &hints, &info)) < 0) {
if (ret != 0) { giterr_set(GITERR_NET, "Failed to resolve address for %s: %s", host, gai_strerror(ret));
error = GIT_EOSERR; return -1;
info = NULL;
goto cleanup;
} }
for (p = info; p != NULL; p = p->ai_next) { for (p = info; p != NULL; p = p->ai_next) {
...@@ -99,27 +100,26 @@ int gitno_connect(const char *host, const char *port) ...@@ -99,27 +100,26 @@ int gitno_connect(const char *host, const char *port)
#else #else
if (s < 0) { if (s < 0) {
#endif #endif
error = GIT_EOSERR; giterr_set(GITERR_OS, "Error creating socket");
goto cleanup; freeaddrinfo(info);
return -1;
} }
ret = connect(s, p->ai_addr, p->ai_addrlen); ret = connect(s, p->ai_addr, p->ai_addrlen);
/* If we can't connect, try the next one */ /* If we can't connect, try the next one */
if (ret < 0) { if (ret < 0) {
close(s);
continue; continue;
} }
/* Return the socket */ /* Return the socket */
error = s; freeaddrinfo(info);
goto cleanup; return s;
} }
/* Oops, we couldn't connect to any address */ /* Oops, we couldn't connect to any address */
error = git__throw(GIT_EOSERR, "Failed to connect: %s", strerror(errno)); giterr_set(GITERR_OS, "Failed to connect to %s", host);
return -1;
cleanup:
freeaddrinfo(info);
return error;
} }
int gitno_send(GIT_SOCKET s, const char *msg, size_t len, int flags) int gitno_send(GIT_SOCKET s, const char *msg, size_t len, int flags)
...@@ -131,8 +131,10 @@ int gitno_send(GIT_SOCKET s, const char *msg, size_t len, int flags) ...@@ -131,8 +131,10 @@ int gitno_send(GIT_SOCKET s, const char *msg, size_t len, int flags)
errno = 0; errno = 0;
ret = send(s, msg + off, len - off, flags); ret = send(s, msg + off, len - off, flags);
if (ret < 0) if (ret < 0) {
return git__throw(GIT_EOSERR, "Error sending data: %s", strerror(errno)); giterr_set(GITERR_OS, "Error sending data: %s", strerror(errno));
return -1;
}
off += ret; off += ret;
} }
...@@ -171,29 +173,25 @@ int gitno_select_in(gitno_buffer *buf, long int sec, long int usec) ...@@ -171,29 +173,25 @@ 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) int gitno_extract_host_and_port(char **host, char **port, const char *url, const char *default_port)
{ {
char *colon, *slash, *delim; char *colon, *slash, *delim;
int error = GIT_SUCCESS;
colon = strchr(url, ':'); colon = strchr(url, ':');
slash = strchr(url, '/'); slash = strchr(url, '/');
if (slash == NULL) if (slash == NULL) {
return git__throw(GIT_EOBJCORRUPTED, "Malformed URL: missing /"); giterr_set(GITERR_NET, "Malformed URL: missing /");
return -1;
}
if (colon == NULL) { if (colon == NULL) {
*port = git__strdup(default_port); *port = git__strdup(default_port);
} else { } else {
*port = git__strndup(colon + 1, slash - colon - 1); *port = git__strndup(colon + 1, slash - colon - 1);
} }
if (*port == NULL) GITERR_CHECK_ALLOC(*port);
return GIT_ENOMEM;;
delim = colon == NULL ? slash : colon; delim = colon == NULL ? slash : colon;
*host = git__strndup(url, delim - url); *host = git__strndup(url, delim - url);
if (*host == NULL) { GITERR_CHECK_ALLOC(*host);
git__free(*port);
error = GIT_ENOMEM;
}
return error; return 0;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment