Fix --server with multiple domains.

This commit is contained in:
Simon Kelley
2022-11-07 23:14:30 +00:00
parent 6c596f1cc1
commit 262dadf50e

View File

@@ -2957,7 +2957,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
case LOPT_LOCAL: /* --local */ case LOPT_LOCAL: /* --local */
case 'A': /* --address */ case 'A': /* --address */
{ {
char *lastdomain = NULL, *domain = ""; char *lastdomain = NULL, *domain = "", *cur_domain;
u16 flags = 0; u16 flags = 0;
char *err; char *err;
union all_addr addr; union all_addr addr;
@@ -3009,8 +3009,11 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
if (servers_only && option == 'S') if (servers_only && option == 'S')
flags |= SERV_FROM_FILE; flags |= SERV_FROM_FILE;
cur_domain = domain;
while ((flags & SERV_LITERAL_ADDRESS) || parse_server_next(&sdetails)) while ((flags & SERV_LITERAL_ADDRESS) || parse_server_next(&sdetails))
{ {
cur_domain = domain;
if (!(flags & SERV_LITERAL_ADDRESS) && (err = parse_server_addr(&sdetails))) if (!(flags & SERV_LITERAL_ADDRESS) && (err = parse_server_addr(&sdetails)))
ret_err(err); ret_err(err);
@@ -3022,24 +3025,24 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
{ {
/* server=//1.2.3.4 is special. */ /* server=//1.2.3.4 is special. */
if (lastdomain) if (lastdomain)
{ {
if (strlen(domain) == 0) if (strlen(cur_domain) == 0)
flags |= SERV_FOR_NODOTS; flags |= SERV_FOR_NODOTS;
else else
flags &= ~SERV_FOR_NODOTS; flags &= ~SERV_FOR_NODOTS;
/* address=/#/ matches the same as without domain */ /* address=/#/ matches the same as without domain */
if (option == 'A' && domain[0] == '#' && domain[1] == 0) if (option == 'A' && cur_domain[0] == '#' && cur_domain[1] == 0)
domain[0] = 0; cur_domain[0] = 0;
} }
if (!add_update_server(flags, sdetails.addr, sdetails.source_addr, sdetails.interface, domain, &addr)) if (!add_update_server(flags, sdetails.addr, sdetails.source_addr, sdetails.interface, cur_domain, &addr))
ret_err(gen_err); ret_err(gen_err);
if (!lastdomain || domain == lastdomain) if (!lastdomain || cur_domain == lastdomain)
break; break;
domain += strlen(domain) + 1; cur_domain += strlen(cur_domain) + 1;
} }
if (flags & SERV_LITERAL_ADDRESS) if (flags & SERV_LITERAL_ADDRESS)