- if (listener->fd >= 0) {
- /* If the listener is already open, do not try to re-open.
- * Only update the socket options.
- */
- set_listener_options(listener, listener->fd);
+#ifdef IPV6
+ if (FlagHas(&listener->flags, LISTEN_IPV6)
+ && (irc_in_addr_unspec(&vaddr) || !irc_in_addr_is_ipv4(&vaddr))) {
+ if (listener->fd_v6 >= 0) {
+ set_listener_options(listener, listener->fd_v6);
+ okay = 1;
+ } else if ((fd = inetport(listener, AF_INET6)) >= 0) {
+ listener->fd_v6 = fd;
+ okay = 1;
+ }
+ } else if (-1 < listener->fd_v6) {
+ close(listener->fd_v6);
+ socket_del(&listener->socket_v6);
+ listener->fd_v6 = -1;
+ }
+#endif
+
+ if (FlagHas(&listener->flags, LISTEN_IPV4)
+ && (irc_in_addr_unspec(&vaddr) || irc_in_addr_is_ipv4(&vaddr))) {
+ if (listener->fd_v4 >= 0) {
+ set_listener_options(listener, listener->fd_v4);
+ okay = 1;
+ } else if ((fd = inetport(listener, AF_INET)) >= 0) {
+ listener->fd_v4 = fd;
+ okay = 1;
+ }
+ } else if (-1 < listener->fd_v4) {
+ close(listener->fd_v4);
+ socket_del(&listener->socket_v4);
+ listener->fd_v4 = -1;