aboutsummaryrefslogtreecommitdiffstats
path: root/socket.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2006-03-22 17:48:59 +0000
committerWayne Davison <wayned@samba.org>2006-03-22 17:48:59 +0000
commit5c6d46329b2c83ec0bbb8e6344d63517c8d8eec6 (patch)
treedc87a8844809946340362d20f7b1f21b3da3a3ca /socket.c
parent8b3e964d14aaf4b128d40362a74e20a390393327 (diff)
downloadandroid_external_rsync-5c6d46329b2c83ec0bbb8e6344d63517c8d8eec6.tar.gz
android_external_rsync-5c6d46329b2c83ec0bbb8e6344d63517c8d8eec6.tar.bz2
android_external_rsync-5c6d46329b2c83ec0bbb8e6344d63517c8d8eec6.zip
If open_socket_in() fails, we now log the reasons why.
Diffstat (limited to 'socket.c')
-rw-r--r--socket.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/socket.c b/socket.c
index 8a960613..9079093c 100644
--- a/socket.c
+++ b/socket.c
@@ -333,9 +333,9 @@ static int *open_socket_in(int type, int port, const char *bind_addr,
int af_hint)
{
int one = 1;
- int s, *socks, maxs, i;
+ int s, *socks, maxs, i, ecnt;
struct addrinfo hints, *all_ai, *resp;
- char portbuf[10];
+ char portbuf[10], **errmsgs;
int error;
memset(&hints, 0, sizeof hints);
@@ -353,17 +353,25 @@ static int *open_socket_in(int type, int port, const char *bind_addr,
/* Count max number of sockets we might open. */
for (maxs = 0, resp = all_ai; resp; resp = resp->ai_next, maxs++) {}
- if (!(socks = new_array(int, maxs + 1)))
+ socks = new_array(int, maxs + 1);
+ errmsgs = new_array(char *, maxs);
+ if (!socks || !errmsgs)
out_of_memory("open_socket_in");
/* We may not be able to create the socket, if for example the
* machine knows about IPv6 in the C library, but not in the
* kernel. */
- for (resp = all_ai, i = 0; resp; resp = resp->ai_next) {
+ for (resp = all_ai, i = ecnt = 0; resp; resp = resp->ai_next) {
s = socket(resp->ai_family, resp->ai_socktype,
resp->ai_protocol);
if (s == -1) {
+ int r = asprintf(&errmsgs[ecnt++],
+ "socket(%d,%d,%d) failed: %s\n",
+ (int)resp->ai_family, (int)resp->ai_socktype,
+ (int)resp->ai_protocol, strerror(errno));
+ if (r < 0)
+ out_of_memory("open_socket_in");
/* See if there's another address that will work... */
continue;
}
@@ -385,6 +393,10 @@ static int *open_socket_in(int type, int port, const char *bind_addr,
/* Now we've got a socket - we need to bind it. */
if (bind(s, resp->ai_addr, resp->ai_addrlen) < 0) {
/* Nope, try another */
+ int r = asprintf(&errmsgs[ecnt++],
+ "bind() failed: %s\n", strerror(errno));
+ if (r < 0)
+ out_of_memory("open_socket_in");
close(s);
continue;
}
@@ -396,6 +408,15 @@ static int *open_socket_in(int type, int port, const char *bind_addr,
if (all_ai)
freeaddrinfo(all_ai);
+ /* Only output the socket()/bind() messages if we were totally
+ * unsuccessful, or if the daemon is being run with -vv. */
+ for (s = 0; s < ecnt; s++) {
+ if (!i || verbose > 1)
+ rwrite(FLOG, errmsgs[s], strlen(errmsgs[s]));
+ free(errmsgs[s]);
+ }
+ free(errmsgs);
+
if (!i) {
rprintf(FERROR,
"unable to bind any inbound sockets on port %d\n",