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