summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrond Norbye <trond.norbye@gmail.com>2011-03-01 09:49:56 +0100
committerTrond Norbye <trond.norbye@gmail.com>2011-03-01 09:49:56 +0100
commit6ba9aa2771adcf785fe3fde03cd71832db15b086 (patch)
treec35f0c5b904a8068269da4524fd55e79f00bd950
parentaf48b1005639d3cb1dea4e08dd9d2e33a2289a95 (diff)
downloadmemcached-6ba9aa2771adcf785fe3fde03cd71832db15b086.tar.gz
Add support for using multiple ports
-rw-r--r--memcached.c36
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;