-
- irc::sockets::insp_sockaddr addr;
-
-#ifdef IPV6
- irc::sockets::insp_aton("::1", &addr.sin6_addr);
- addr.sin6_family = AF_INET6;
- addr.sin6_port = htons(listener->GetPort());
-#else
- irc::sockets::insp_aton("127.0.0.1", &addr.sin_addr);
- addr.sin_family = AF_INET;
- addr.sin_port = htons(listener->GetPort());
-#endif
-
- if (connect(connFD, reinterpret_cast<struct sockaddr*>(&addr), sizeof(addr)) == -1)
- {
- SI->SE->DelFd(listener);
- closesocket(connFD);
- throw CoreException("Could not connet to ITC pipe");
- }
+
+ if (!ServerInstance->BindSocket(listenFD, 0, "127.0.0.1", true))
+ throw CoreException("Could not create ITC pipe");
+ ServerInstance->SE->NonBlocking(connFD);
+
+ struct sockaddr_in addr;
+ socklen_t sz = sizeof(addr);
+ getsockname(listenFD, reinterpret_cast<struct sockaddr*>(&addr), &sz);
+ connect(connFD, reinterpret_cast<struct sockaddr*>(&addr), sz);
+ ServerInstance->SE->Blocking(listenFD);
+ int nfd = accept(listenFD, reinterpret_cast<struct sockaddr*>(&addr), &sz);
+ if (nfd < 0)
+ throw CoreException("Could not create ITC pipe");
+ new ThreadSignalSocket(this, nfd);
+ closesocket(listenFD);
+
+ ServerInstance->SE->Blocking(connFD);