- ((sockaddr_in*)servaddr)->sin_family = AF_INET;
- ((sockaddr_in*)servaddr)->sin_addr = addy;
- ((sockaddr_in*)servaddr)->sin_port = htons(port);
- size = sizeof(sockaddr_in);
+ // Check for characters which are problematic in the IRC message format.
+ if (path.find_first_of("\n\r\t!@: ") != std::string::npos)
+ {
+ this->Logs->Log("SOCKET", LOG_DEFAULT, "UNIX listener on %s at %s specified a path containing invalid characters!",
+ path.c_str(), tag->getTagLocation().c_str());
+ continue;
+ }
+
+ irc::sockets::untosa(path, bindspec);
+ if (!BindPort(tag, bindspec, old_ports))
+ failed_ports.push_back(std::make_pair(bindspec, errno));
+ else
+ bound++;
+ }
+#endif
+ }
+
+ std::vector<ListenSocket*>::iterator n = ports.begin();
+ for (std::vector<ListenSocket*>::iterator o = old_ports.begin(); o != old_ports.end(); ++o)
+ {
+ while (n != ports.end() && *n != *o)
+ n++;
+ if (n == ports.end())
+ {
+ this->Logs->Log("SOCKET", LOG_DEFAULT, "Port bindings slipped out of vector, aborting close!");
+ break;