diff options
author | Trond Norbye <trond.norbye@gmail.com> | 2011-03-01 09:49:56 +0100 |
---|---|---|
committer | Trond Norbye <trond.norbye@gmail.com> | 2011-03-01 09:49:56 +0100 |
commit | 6ba9aa2771adcf785fe3fde03cd71832db15b086 (patch) | |
tree | c35f0c5b904a8068269da4524fd55e79f00bd950 | |
parent | af48b1005639d3cb1dea4e08dd9d2e33a2289a95 (diff) | |
download | memcached-6ba9aa2771adcf785fe3fde03cd71832db15b086.tar.gz |
Add support for using multiple ports
-rw-r--r-- | memcached.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/memcached.c b/memcached.c index 149edd1..5a8fc8e 100644 --- a/memcached.c +++ b/memcached.c @@ -3952,7 +3952,20 @@ static int server_sockets(int port, enum network_transport transport, for (char *p = strtok_r(list, ";,", &b); p != NULL; p = strtok_r(NULL, ";,", &b)) { - ret |= server_socket(p, port, transport, portnumber_file); + int the_port = port; + char *s = strchr(p, ':'); + if (s != NULL) { + *s = '\0'; + ++s; + if (!safe_strtol(s, &the_port)) { + fprintf(stderr, "Invalid port number: \"%s\"", s); + return 1; + } + } + if (strcmp(p, "*") == 0) { + p = NULL; + } + ret |= server_socket(p, the_port, transport, portnumber_file); } free(list); return ret; @@ -4080,7 +4093,12 @@ static void usage(void) { "-U <num> UDP port number to listen on (default: 11211, 0 is off)\n" "-s <file> UNIX socket path to listen on (disables network support)\n" "-a <mask> access mask for UNIX socket, in octal (default: 0700)\n" - "-l <ip_addr> interface to listen on (default: INADDR_ANY, all addresses)\n" + "-l <addr> interface to listen on (default: INADDR_ANY, all addresses)\n" + " <addr> may be specified as host:port. If you don't specify\n" + " a port number, the value you specified with -p or -U is\n" + " used. You may specify multiple addresses separated by comma\n" + " or by using -l multiple times\n" + "-d run as a daemon\n" "-r maximize core file limit\n" "-u <username> assume identity of <username> (only when run as root)\n" @@ -4417,7 +4435,19 @@ int main (int argc, char **argv) { settings.verbose++; break; case 'l': - settings.inter= strdup(optarg); + if (settings.inter != NULL) { + size_t len = strlen(settings.inter) + strlen(optarg) + 2; + char *p = malloc(len); + if (p == NULL) { + fprintf(stderr, "Failed to allocate memory\n"); + return 1; + } + snprintf(p, len, "%s,%s", settings.inter, optarg); + free(settings.inter); + settings.inter = p; + } else { + settings.inter= strdup(optarg); + } break; case 'd': do_daemonize = true; |