diff options
author | Sailesh Mukil <sailesh@apache.org> | 2022-01-21 14:20:54 -0800 |
---|---|---|
committer | dormando <dormando@rydia.net> | 2022-01-25 15:00:05 -0800 |
commit | 5ae69e9d3c38b38288c2705f17ec980aa4130e41 (patch) | |
tree | 707bbea3148d1575e79bb5883ee121417721ca0f /memcached.c | |
parent | 9c2a4bcb2472c5ebc320ceb6ea45fb9b3a3cb121 (diff) | |
download | memcached-5ae69e9d3c38b38288c2705f17ec980aa4130e41.tar.gz |
Fix error message on conflicting ports while using '-l'
Memcached can be started with configurable addresses to listen on,
using the "-l" option. Eg:
$> ./memcached -l 127.0.2.1:22122
If the port 22122 is available, things run smoothly. However, if
the port is unavailable, we see the following error message:
"failed to listen on TCP port 11211"
Note that the port number is incorrect and is the default port
number 11211 instead of the configured 22122.
This is because the server_sockets() function treats settings.port
and settings.inter differently. If "-l" is provided, settings.inter
contains the correct port number, whereas settings.port the default
port, and settings.port is used to print the error info, hence
printing the incorrect port number.
Since multiple interfaces can be provided with '-l', this patch prints
all of them on a bind error, to maintain code simplicity. The
server_sockets() function is also adjusted to remember the first bind
error's 'errno' that occurs, as the caller of server_sockets() relies
on the errno to print the error message.
Diffstat (limited to 'memcached.c')
-rw-r--r-- | memcached.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/memcached.c b/memcached.c index e111789..a6e187c 100644 --- a/memcached.c +++ b/memcached.c @@ -3643,6 +3643,8 @@ static int server_sockets(int port, enum network_transport transport, fprintf(stderr, "Failed to allocate memory for parsing server interface string\n"); return 1; } + // If we encounter any failure, preserve the first errno for the caller. + int errno_save = 0; for (char *p = strtok_r(list, ";,", &b); p != NULL; p = strtok_r(NULL, ";,", &b)) { @@ -3700,8 +3702,10 @@ static int server_sockets(int port, enum network_transport transport, p = NULL; } ret |= server_socket(p, the_port, transport, portnumber_file, ssl_enabled); + if (ret != 0 && errno_save == 0) errno_save = errno; } free(list); + errno = errno_save; return ret; } } @@ -6029,7 +6033,11 @@ int main (int argc, char **argv) { errno = 0; if (settings.port && server_sockets(settings.port, tcp_transport, portnumber_file)) { - vperror("failed to listen on TCP port %d", settings.port); + if (settings.inter == NULL) { + vperror("failed to listen on TCP port %d", settings.port); + } else { + vperror("failed to listen on one of interface(s) %s", settings.inter); + } exit(EX_OSERR); } @@ -6044,7 +6052,11 @@ int main (int argc, char **argv) { errno = 0; if (settings.udpport && server_sockets(settings.udpport, udp_transport, portnumber_file)) { - vperror("failed to listen on UDP port %d", settings.udpport); + if (settings.inter == NULL) { + vperror("failed to listen on UDP port %d", settings.udpport); + } else { + vperror("failed to listen on one of interface(s) %s", settings.inter); + } exit(EX_OSERR); } |