error-handling: netops
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
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;
}