mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-13 13:23:02 +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;
|
int ret;
|
||||||
|
|
||||||
ret = recv(buf->fd, buf->data + buf->offset, buf->len - buf->offset, 0);
|
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 */
|
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;
|
buf->offset += ret;
|
||||||
|
|
||||||
@ -78,18 +81,16 @@ int gitno_connect(const char *host, const char *port)
|
|||||||
{
|
{
|
||||||
struct addrinfo *info, *p;
|
struct addrinfo *info, *p;
|
||||||
struct addrinfo hints;
|
struct addrinfo hints;
|
||||||
int ret, error = GIT_SUCCESS;
|
int ret;
|
||||||
GIT_SOCKET s;
|
GIT_SOCKET s;
|
||||||
|
|
||||||
memset(&hints, 0x0, sizeof(struct addrinfo));
|
memset(&hints, 0x0, sizeof(struct addrinfo));
|
||||||
hints.ai_family = AF_UNSPEC;
|
hints.ai_family = AF_UNSPEC;
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
|
||||||
ret = getaddrinfo(host, port, &hints, &info);
|
if ((ret = getaddrinfo(host, port, &hints, &info)) < 0) {
|
||||||
if (ret != 0) {
|
giterr_set(GITERR_NET, "Failed to resolve address for %s: %s", host, gai_strerror(ret));
|
||||||
error = GIT_EOSERR;
|
return -1;
|
||||||
info = NULL;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (p = info; p != NULL; p = p->ai_next) {
|
for (p = info; p != NULL; p = p->ai_next) {
|
||||||
@ -99,27 +100,26 @@ int gitno_connect(const char *host, const char *port)
|
|||||||
#else
|
#else
|
||||||
if (s < 0) {
|
if (s < 0) {
|
||||||
#endif
|
#endif
|
||||||
error = GIT_EOSERR;
|
giterr_set(GITERR_OS, "Error creating socket");
|
||||||
goto cleanup;
|
freeaddrinfo(info);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = connect(s, p->ai_addr, p->ai_addrlen);
|
ret = connect(s, p->ai_addr, p->ai_addrlen);
|
||||||
/* If we can't connect, try the next one */
|
/* If we can't connect, try the next one */
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
close(s);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the socket */
|
/* Return the socket */
|
||||||
error = s;
|
freeaddrinfo(info);
|
||||||
goto cleanup;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Oops, we couldn't connect to any address */
|
/* Oops, we couldn't connect to any address */
|
||||||
error = git__throw(GIT_EOSERR, "Failed to connect: %s", strerror(errno));
|
giterr_set(GITERR_OS, "Failed to connect to %s", host);
|
||||||
|
return -1;
|
||||||
cleanup:
|
|
||||||
freeaddrinfo(info);
|
|
||||||
return error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int gitno_send(GIT_SOCKET s, const char *msg, size_t len, int flags)
|
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;
|
errno = 0;
|
||||||
|
|
||||||
ret = send(s, msg + off, len - off, flags);
|
ret = send(s, msg + off, len - off, flags);
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
return git__throw(GIT_EOSERR, "Error sending data: %s", strerror(errno));
|
giterr_set(GITERR_OS, "Error sending data: %s", strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
off += ret;
|
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)
|
int gitno_extract_host_and_port(char **host, char **port, const char *url, const char *default_port)
|
||||||
{
|
{
|
||||||
char *colon, *slash, *delim;
|
char *colon, *slash, *delim;
|
||||||
int error = GIT_SUCCESS;
|
|
||||||
|
|
||||||
colon = strchr(url, ':');
|
colon = strchr(url, ':');
|
||||||
slash = strchr(url, '/');
|
slash = strchr(url, '/');
|
||||||
|
|
||||||
if (slash == NULL)
|
if (slash == NULL) {
|
||||||
return git__throw(GIT_EOBJCORRUPTED, "Malformed URL: missing /");
|
giterr_set(GITERR_NET, "Malformed URL: missing /");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (colon == NULL) {
|
if (colon == NULL) {
|
||||||
*port = git__strdup(default_port);
|
*port = git__strdup(default_port);
|
||||||
} else {
|
} else {
|
||||||
*port = git__strndup(colon + 1, slash - colon - 1);
|
*port = git__strndup(colon + 1, slash - colon - 1);
|
||||||
}
|
}
|
||||||
if (*port == NULL)
|
GITERR_CHECK_ALLOC(*port);
|
||||||
return GIT_ENOMEM;;
|
|
||||||
|
|
||||||
|
|
||||||
delim = colon == NULL ? slash : colon;
|
delim = colon == NULL ? slash : colon;
|
||||||
*host = git__strndup(url, delim - url);
|
*host = git__strndup(url, delim - url);
|
||||||
if (*host == NULL) {
|
GITERR_CHECK_ALLOC(*host);
|
||||||
git__free(*port);
|
|
||||||
error = GIT_ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
return error;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user