-#include "socket.h"
-#include "socketengine.h"
-using irc::sockets::sockaddrs;
-
-/** This will bind a socket to a port. It works for UDP/TCP.
- * It can only bind to IP addresses, if you wish to bind to hostnames
- * you should first resolve them using class 'Resolver'.
- */
-bool InspIRCd::BindSocket(int sockfd, int port, const char* addr, bool dolisten)
-{
- sockaddrs servaddr;
- int ret;
-
- if ((*addr == '*' || *addr == '\0') && port == -1)
- {
- /* Port -1: Means UDP IPV4 port binding - Special case
- * used by DNS engine.
- */
- memset(&servaddr, 0, sizeof(servaddr));
- servaddr.in4.sin_family = AF_INET;
- }
- else if (!irc::sockets::aptosa(addr, port, servaddr))
- return false;
-
- ret = SE->Bind(sockfd, &servaddr.sa, sa_size(servaddr));
-
- if (ret < 0)
- {
- return false;
- }
- else
- {
- if (dolisten)
- {
- if (SE->Listen(sockfd, Config->MaxConn) == -1)
- {
- this->Logs->Log("SOCKET",DEFAULT,"ERROR in listen(): %s",strerror(errno));
- return false;
- }
- else
- {
- this->Logs->Log("SOCKET",DEBUG,"New socket binding for %d with listen: %s:%d", sockfd, addr, port);
- SE->NonBlocking(sockfd);
- return true;
- }
- }
- else
- {
- this->Logs->Log("SOCKET",DEBUG,"New socket binding for %d without listen: %s:%d", sockfd, addr, port);
- return true;
- }
- }
-}
-
-// Open a TCP Socket
-int irc::sockets::OpenTCPSocket(const std::string& addr, int socktype)
-{
- int sockfd;
- int on = 1;
- struct linger linger = { 0, 0 };
- if (addr.empty())
- {
-#ifdef IPV6
- sockfd = socket (PF_INET6, socktype, 0);
- if (sockfd < 0)
-#endif
- sockfd = socket (PF_INET, socktype, 0);
- }
- else if (addr.find(':') != std::string::npos)
- sockfd = socket (PF_INET6, socktype, 0);
- else
- sockfd = socket (PF_INET, socktype, 0);
-
- if (sockfd < 0)
- {
- return ERROR;
- }
- else
- {
- setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char*)&on, sizeof(on));
- /* This is BSD compatible, setting l_onoff to 0 is *NOT* http://web.irc.org/mla/ircd-dev/msg02259.html */
- linger.l_onoff = 1;
- linger.l_linger = 1;
- setsockopt(sockfd, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(linger));
- return (sockfd);
- }
-}