When reporting socket/bind failures we want to ensure any fatal error
reported is as accurate as possible. We'll prefer reporting a bind()
errno over a socket() errno, because if socket() works but bind() fails
that is a more significant event.
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
src/rpc/virnetsocket.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c
index fee61ace60..8e04d61e98 100644
--- a/src/rpc/virnetsocket.c
+++ b/src/rpc/virnetsocket.c
@@ -310,8 +310,8 @@ int virNetSocketNewListenTCP(const char *nodename,
struct addrinfo hints;
int fd = -1;
size_t i;
- bool addrInUse = false;
- bool familyNotSupported = false;
+ int socketErrno = 0;
+ int bindErrno = 0;
virSocketAddr tmp_addr;
*retsocks = NULL;
@@ -351,7 +351,7 @@ int virNetSocketNewListenTCP(const char *nodename,
if ((fd = socket(runp->ai_family, runp->ai_socktype,
runp->ai_protocol)) < 0) {
if (errno == EAFNOSUPPORT) {
- familyNotSupported = true;
+ socketErrno = errno;
runp = runp->ai_next;
continue;
}
@@ -386,7 +386,7 @@ int virNetSocketNewListenTCP(const char *nodename,
virReportSystemError(errno, "%s", _("Unable to bind to
port"));
goto error;
}
- addrInUse = true;
+ bindErrno = errno;
VIR_FORCE_CLOSE(fd);
runp = runp->ai_next;
continue;
@@ -409,14 +409,14 @@ int virNetSocketNewListenTCP(const char *nodename,
fd = -1;
}
- if (nsocks == 0 && familyNotSupported) {
- virReportSystemError(EAFNOSUPPORT, "%s", _("Unable to bind to
port"));
- goto error;
- }
-
- if (nsocks == 0 &&
- addrInUse) {
- virReportSystemError(EADDRINUSE, "%s", _("Unable to bind to
port"));
+ if (nsocks == 0) {
+ if (bindErrno) {
+ virReportSystemError(bindErrno, "%s", _("Unable to bind to
port"));
+ } else if (socketErrno) {
+ virReportSystemError(socketErrno, "%s", _("Unable to create
socket"));
+ } else {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("No addresses
to bind to"));
+ }
goto error;
}
--
2.17.1