Commit 56b7df108c6b24fe786325944309a52e79087a52

Carlos Martín Nieto 2012-03-07T07:01:20

error-handling: netops

diff --git a/src/netops.c b/src/netops.c
index 4b307af..e69e2ee 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;
 }