On Mon, Feb 20, 2006 at 08:03:30PM +0700, David Favro
wrote:> Here's a small patch that gives better diagnostics on the daemon side
> if it fails to start up due to inability to create or bind the socket.
Thanks for the patch. I've considered it and your misgivings, and have
come up with the attached revised version that only outputs the extra
socket()/bind() failure messages in the case of a total failure, or when
the daemon was run with at least -vv. See what you think.
..wayne..
-------------- next part --------------
--- socket.c 7 Mar 2006 08:46:29 -0000 1.118
+++ socket.c 22 Mar 2006 17:47:03 -0000
@@ -333,9 +333,9 @@ static int *open_socket_in(int type, int
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
/* 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
/* 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
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",