# HG changeset patch # User Stephan Bosch # Date 1440884792 -10800 # Node ID c53ccafc4a8e64a6b2cbcd3e9b7a9d07edadcadf # Parent 512a4792d9f58aafe5bff7a412df33d907e93d2d Earlier in_port_t fix created problems with service listener configuration. Listeners are disabled with port=0, which was not allowed anymore. diff -r 512a4792d9f5 -r c53ccafc4a8e src/config/config-request.c --- a/src/config/config-request.c Sun Aug 30 00:42:16 2015 +0300 +++ b/src/config/config-request.c Sun Aug 30 00:46:32 2015 +0300 @@ -116,7 +116,8 @@ } break; } - case SET_IN_PORT: { + case SET_IN_PORT: + case SET_IN_PORT_ZERO: { const in_port_t *val = value, *dval = default_value; if (dump_default || dval == NULL || *val != *dval) @@ -253,6 +254,7 @@ case SET_UINT_OCT: case SET_TIME: case SET_IN_PORT: + case SET_IN_PORT_ZERO: case SET_STR_VARS: case SET_STR: case SET_ENUM: diff -r 512a4792d9f5 -r c53ccafc4a8e src/lib-settings/settings-parser.c --- a/src/lib-settings/settings-parser.c Sun Aug 30 00:42:16 2015 +0300 +++ b/src/lib-settings/settings-parser.c Sun Aug 30 00:46:32 2015 +0300 @@ -595,6 +595,18 @@ } static int +get_in_port_zero(struct setting_parser_context *ctx, const char *value, + in_port_t *result_r) +{ + if (net_str2port(value, result_r) < 0) { + ctx->error = p_strdup_printf(ctx->parser_pool, + "Invalid port number %s", value); + return -1; + } + return 0; +} + +static int settings_parse(struct setting_parser_context *ctx, struct setting_link *link, const struct setting_define *def, const char *key, const char *value) @@ -646,6 +658,10 @@ if (get_in_port(ctx, value, (in_port_t *)ptr) < 0) return -1; break; + case SET_IN_PORT_ZERO: + if (get_in_port_zero(ctx, value, (in_port_t *)ptr) < 0) + return -1; + break; case SET_STR: *((char **)ptr) = p_strdup(ctx->set_pool, value); break; @@ -1248,6 +1264,7 @@ case SET_TIME: case SET_SIZE: case SET_IN_PORT: + case SET_IN_PORT_ZERO: case SET_STR: case SET_ENUM: case SET_STRLIST: @@ -1344,6 +1361,7 @@ case SET_TIME: case SET_SIZE: case SET_IN_PORT: + case SET_IN_PORT_ZERO: case SET_STR: case SET_ENUM: case SET_STRLIST: @@ -1428,7 +1446,8 @@ *dest_size = *src_size; break; } - case SET_IN_PORT: { + case SET_IN_PORT: + case SET_IN_PORT_ZERO: { const in_port_t *src_size = src; in_port_t *dest_size = dest; @@ -1549,6 +1568,7 @@ case SET_TIME: case SET_SIZE: case SET_IN_PORT: + case SET_IN_PORT_ZERO: case SET_STR_VARS: case SET_STR: case SET_ENUM: diff -r 512a4792d9f5 -r c53ccafc4a8e src/lib-settings/settings-parser.h --- a/src/lib-settings/settings-parser.h Sun Aug 30 00:42:16 2015 +0300 +++ b/src/lib-settings/settings-parser.h Sun Aug 30 00:46:32 2015 +0300 @@ -24,6 +24,7 @@ SET_TIME, SET_SIZE, SET_IN_PORT, /* internet port */ + SET_IN_PORT_ZERO, /* internet port */ SET_STR, SET_STR_VARS, /* string with %variables */ SET_ENUM, diff -r 512a4792d9f5 -r c53ccafc4a8e src/lib/net.c --- a/src/lib/net.c Sun Aug 30 00:42:16 2015 +0300 +++ b/src/lib/net.c Sun Aug 30 00:46:32 2015 +0300 @@ -957,6 +957,19 @@ return 0; } +int net_str2port_zero(const char *str, in_port_t *port_r) +{ + uintmax_t l; + + if (str_to_uintmax(str, &l) < 0) + return -1; + + if (l > (in_port_t)-1) + return -1; + *port_r = (in_port_t)l; + return 0; +} + int net_ipv6_mapped_ipv4_convert(const struct ip_addr *src, struct ip_addr *dest) { diff -r 512a4792d9f5 -r c53ccafc4a8e src/lib/net.h --- a/src/lib/net.h Sun Aug 30 00:42:16 2015 +0300 +++ b/src/lib/net.h Sun Aug 30 00:46:32 2015 +0300 @@ -150,6 +150,8 @@ int net_addr2ip(const char *addr, struct ip_addr *ip); /* char* -> net_port_t translation */ int net_str2port(const char *str, in_port_t *port_r); +/* char* -> net_port_t translation (allows port zero) */ +int net_str2port_zero(const char *str, in_port_t *port_r); /* Convert IPv6 mapped IPv4 address to an actual IPv4 address. Returns 0 if successful, -1 if the source address isn't IPv6 mapped IPv4 address. */ diff -r 512a4792d9f5 -r c53ccafc4a8e src/master/master-settings.c --- a/src/master/master-settings.c Sun Aug 30 00:42:16 2015 +0300 +++ b/src/master/master-settings.c Sun Aug 30 00:46:32 2015 +0300 @@ -62,7 +62,7 @@ static const struct setting_define inet_listener_setting_defines[] = { DEF(SET_STR, name), DEF(SET_STR, address), - DEF(SET_IN_PORT, port), + DEF(SET_IN_PORT_ZERO, port), DEF(SET_BOOL, ssl), DEF(SET_BOOL, reuse_port), DEF(SET_BOOL, haproxy),