- if ((listener = find_listener(port, &vaddr))) {
- /*
- * set active flag and change connect mask here, it's the only thing
- * that can change on a rehash
- */
- listener->active = 1;
- if (mask)
- ipmask_parse(mask, &listener->mask, &listener->mask_bits);
- else
- listener->mask_bits = 0;
- listener->hidden = is_hidden;
- listener->server = is_server;
- return;
+ listener = find_listener(port, &vaddr);
+ if (!listener)
+ {
+ new_listener = 1;
+ listener = make_listener(port, &vaddr);
+
+
+ }
+ memcpy(&listener->flags, flags, sizeof(listener->flags));
+
+ if(FlagHas(&listener->flags, LISTEN_SSL) && !listener->ssl_listener) {
+ listener->ssl_listener = ssl_create_listener();
+ } else if(!FlagHas(&listener->flags, LISTEN_SSL) && listener->ssl_listener) {
+ ssl_free_listener(listener->ssl_listener);
+ listener->ssl_listener = NULL;
+ }
+
+ FlagSet(&listener->flags, LISTEN_ACTIVE);
+ if (mask)
+ ipmask_parse(mask, &listener->mask, &listener->mask_bits);
+ else
+ listener->mask_bits = 0;
+
+#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;