- st->addr.sa.sa_family=AF_INET;
- j=dict_find_item(d,"address",False,"udp",st->loc);
- st->addr.sin.sin_addr.s_addr=j?string_item_to_ipaddr(j, "udp"):INADDR_ANY;
- st->addr.sin.sin_port=dict_read_number(d,"port",True,"udp",st->loc,0);
+ int port=dict_read_number(d,"port",True,"udp",st->loc,0);
+
+ union iaddr defaultaddrs[] = {
+#ifdef CONFIG_IPV6
+ { .sin6 = { .sin6_family=AF_INET6,
+ .sin6_port=htons(port),
+ .sin6_addr=IN6ADDR_ANY_INIT } },
+#endif
+ { .sin = { .sin_family=AF_INET,
+ .sin_port=htons(port),
+ .sin_addr= { .s_addr=INADDR_ANY } } }
+ };
+
+ caddrl=dict_lookup(d,"address");
+ st->n_socks=caddrl ? list_length(caddrl) : (int)ARRAY_SIZE(defaultaddrs);
+ if (st->n_socks<=0 || st->n_socks>MAX_SOCKETS)
+ cfgfatal(st->loc,"udp","`address' must be 1..%d addresses",
+ MAX_SOCKETS);
+
+ for (i=0; i<st->n_socks; i++) {
+ struct udpsock *us=&st->socks[i];
+ FILLZERO(us->addr);
+ if (!list_length(caddrl)) {
+ us->addr=defaultaddrs[i];
+ } else {
+ text2iaddr(list_elem(caddrl,i),port,
+ &us->addr,"udp");
+ }
+ us->fd=-1;
+ }
+