summaryrefslogtreecommitdiff
path: root/src/netops.c
diff options
context:
space:
mode:
authorCarlos Martín Nieto <carlos@cmartin.tk>2012-03-07 07:01:20 +0100
committerVicent Martí <tanoku@gmail.com>2012-04-11 19:16:10 +0200
commit56b7df108c6b24fe786325944309a52e79087a52 (patch)
tree5d982eaab2431438f0384071b8ff6aa7379eafd2 /src/netops.c
parent25530fca3bde2ee9a2d06098da554eca2536b2b9 (diff)
downloadlibgit2-56b7df108c6b24fe786325944309a52e79087a52.tar.gz
error-handling: netops
Diffstat (limited to 'src/netops.c')
-rw-r--r--src/netops.c60
1 files changed, 29 insertions, 31 deletions
diff --git a/src/netops.c b/src/netops.c
index 4b307af45..e69e2ee95 100644
--- a/src/netops.c
+++ b/src/netops.c
@@ -41,10 +41,13 @@ int gitno_recv(gitno_buffer *buf)
int ret;
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 */
- return GIT_SUCCESS;
+ return 0;
+
+ if (ret < 0) {
+ giterr_set(GITERR_NET, "Error receiving data");
+ return -1;
+ }
buf->offset += ret;
@@ -78,18 +81,16 @@ int gitno_connect(const char *host, const char *port)
{
struct addrinfo *info, *p;
struct addrinfo hints;
- int ret, error = GIT_SUCCESS;
+ int ret;
GIT_SOCKET s;
memset(&hints, 0x0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
- ret = getaddrinfo(host, port, &hints, &info);
- if (ret != 0) {
- error = GIT_EOSERR;
- info = NULL;
- goto cleanup;
+ if ((ret = getaddrinfo(host, port, &hints, &info)) < 0) {
+ giterr_set(GITERR_NET, "Failed to resolve address for %s: %s", host, gai_strerror(ret));
+ return -1;
}
for (p = info; p != NULL; p = p->ai_next) {
@@ -99,27 +100,26 @@ int gitno_connect(const char *host, const char *port)
#else
if (s < 0) {
#endif
- error = GIT_EOSERR;
- goto cleanup;
+ giterr_set(GITERR_OS, "Error creating socket");
+ freeaddrinfo(info);
+ return -1;
}
ret = connect(s, p->ai_addr, p->ai_addrlen);
/* If we can't connect, try the next one */
if (ret < 0) {
+ close(s);
continue;
}
/* Return the socket */
- error = s;
- goto cleanup;
+ freeaddrinfo(info);
+ return s;
}
/* Oops, we couldn't connect to any address */
- error = git__throw(GIT_EOSERR, "Failed to connect: %s", strerror(errno));
-
-cleanup:
- freeaddrinfo(info);
- return error;
+ giterr_set(GITERR_OS, "Failed to connect to %s", host);
+ return -1;
}
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;
ret = send(s, msg + off, len - off, flags);
- if (ret < 0)
- return git__throw(GIT_EOSERR, "Error sending data: %s", strerror(errno));
+ if (ret < 0) {
+ giterr_set(GITERR_OS, "Error sending data: %s", strerror(errno));
+ return -1;
+ }
off += ret;
}
@@ -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)
{
char *colon, *slash, *delim;
- int error = GIT_SUCCESS;
colon = strchr(url, ':');
slash = strchr(url, '/');
- if (slash == NULL)
- return git__throw(GIT_EOBJCORRUPTED, "Malformed URL: missing /");
+ if (slash == NULL) {
+ giterr_set(GITERR_NET, "Malformed URL: missing /");
+ return -1;
+ }
if (colon == NULL) {
*port = git__strdup(default_port);
} else {
*port = git__strndup(colon + 1, slash - colon - 1);
}
- if (*port == NULL)
- return GIT_ENOMEM;;
-
+ GITERR_CHECK_ALLOC(*port);
delim = colon == NULL ? slash : colon;
*host = git__strndup(url, delim - url);
- if (*host == NULL) {
- git__free(*port);
- error = GIT_ENOMEM;
- }
+ GITERR_CHECK_ALLOC(*host);
- return error;
+ return 0;
}