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; }