bool InspIRCd::BindSocket(int sockfd, int port, const char* addr, bool dolisten)
{
sockaddrs servaddr;
- memset(&servaddr, 0, sizeof(servaddr));
-
- int ret, size;
+ int ret;
if (*addr == '*')
addr = "";
-#ifdef IPV6
if (*addr)
{
- /* There is an address here. Is it ipv6? */
- if (strchr(addr,':'))
- {
- if (inet_pton(AF_INET6, addr, &servaddr.in6.sin6_addr) < 1)
- {
- return false;
- }
- servaddr.in6.sin6_family = AF_INET6;
- servaddr.in6.sin6_port = htons(port);
- size = sizeof(sockaddr_in6);
- }
- else
- {
- if (inet_pton(AF_INET, addr, &servaddr.in4.sin_addr) < 1)
- {
- return false;
- }
- servaddr.in4.sin_family = AF_INET;
- servaddr.in4.sin_port = htons(port);
- size = sizeof(sockaddr_in);
- }
+ irc::sockets::aptosa(addr, port, &servaddr);
}
else
{
servaddr.in4.sin_family = AF_INET;
servaddr.in4.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.in4.sin_port = 0;
- size = sizeof(sockaddr_in);
}
else
{
- /* There's no address here, default to ipv6 bind to all */
+ /* No address */
+#ifdef IPV6
+ /* Default to ipv6 bind to all */
servaddr.in6.sin6_family = AF_INET6;
servaddr.in6.sin6_port = htons(port);
- size = sizeof(sockaddr_in6);
- }
- }
+ memset(&servaddr.in6.sin6_addr, 0, sizeof(servaddr.in6.sin6_addr));
#else
- /* If we aren't built with ipv6, the choice becomes simple */
- servaddr.in4.sin_family = AF_INET;
- if (*addr)
- {
- /* There is an address here. */
- if (inet_pton(AF_INET, addr, &servaddr.in4.sin_addr) < 1)
- {
- return false;
+ /* Bind ipv4 to all */
+ servaddr.in4.sin_family = AF_INET;
+ servaddr.in4.sin_addr.s_addr = htonl(INADDR_ANY);
+ servaddr.in4.sin_port = htons(port);
+#endif
}
}
- else
- {
- /* Bind ipv4 to all */
- servaddr.in4.sin_addr.s_addr = htonl(INADDR_ANY);
- }
- /* Bind ipv4 port number */
- servaddr.in4.sin_port = htons(port);
- size = sizeof(sockaddr_in);
-#endif
- ret = SE->Bind(sockfd, &servaddr.sa, size);
+ ret = SE->Bind(sockfd, &servaddr.sa, sa_size(servaddr));
if (ret < 0)
{
int on = 1;
addr = addr;
struct linger linger = { 0, 0 };
-#ifdef IPV6
if (!*addr)
{
+#ifdef IPV6
sockfd = socket (PF_INET6, socktype, 0);
if (sockfd < 0)
+#endif
sockfd = socket (PF_INET, socktype, 0);
}
else if (strchr(addr,':'))
sockfd = socket (PF_INET6, socktype, 0);
else
sockfd = socket (PF_INET, socktype, 0);
+
if (sockfd < 0)
-#else
- if ((sockfd = socket (PF_INET, socktype, 0)) < 0)
-#endif
{
return ERROR;
}
else
{
- setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char*)&on, sizeof(on));
+ setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &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));
+ setsockopt(sockfd, SOL_SOCKET, SO_LINGER, &linger, sizeof(linger));
return (sockfd);
}
}
return bound;
}
-int irc::sockets::aptosa(const char* addr, int port, irc::sockets::sockaddrs* sa)
+bool irc::sockets::aptosa(const char* addr, int port, irc::sockets::sockaddrs* sa)
{
memset(sa, 0, sizeof(*sa));
if (!addr || !*addr)
return false;
}
-int irc::sockets::satoap(const irc::sockets::sockaddrs* sa, std::string& addr, int &port) {
+bool irc::sockets::satoap(const irc::sockets::sockaddrs* sa, std::string& addr, int &port) {
char addrv[INET6_ADDRSTRLEN+1];
if (sa->sa.sa_family == AF_INET)
{