X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsocket.cpp;h=c426f16e696ea8bdc7b163e228ae05168045b14c;hb=7c340cba11b16d3c4a95c274c22f1617ac4711f2;hp=7d44b7e37d4bb46ece3dee4952199d5bbc8b0b94;hpb=77d5c9f765702a06a1ad77f239d1cbe2d9b11662;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/socket.cpp b/src/socket.cpp index 7d44b7e37..c426f16e6 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -25,37 +25,14 @@ using irc::sockets::sockaddrs; 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 { @@ -67,37 +44,24 @@ bool InspIRCd::BindSocket(int sockfd, int port, const char* addr, bool dolisten) 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) { @@ -134,31 +98,30 @@ int irc::sockets::OpenTCPSocket(const char* addr, int socktype) 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); } } @@ -248,7 +211,7 @@ int InspIRCd::BindPorts(FailedPortList &failed_ports) 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) @@ -277,7 +240,7 @@ int irc::sockets::aptosa(const char* addr, int port, irc::sockets::sockaddrs* sa 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) {