mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-13 12:59:13 +00:00
error-handling: netops
This commit is contained in:
parent
25530fca3b
commit
56b7df108c
60
src/netops.c
60
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user