]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/socket.cpp
Move some local-only fields to LocalUser
[user/henk/code/inspircd.git] / src / socket.cpp
index cc9cb79b9e6fa1920aafc2d32d4647f22738165a..c4be23a6092b0483a024f916011c4b7200f17d57 100644 (file)
@@ -27,10 +27,7 @@ bool InspIRCd::BindSocket(int sockfd, int port, const char* addr, bool dolisten)
        sockaddrs servaddr;
        int ret;
 
-       if (*addr == '*' || *addr == '\0')
-               addr = NULL;
-
-       if (port == -1 && !addr)
+       if ((*addr == '*' || *addr == '\0') && port == -1)
        {
                /* Port -1: Means UDP IPV4 port binding - Special case
                 * used by DNS engine.
@@ -72,13 +69,12 @@ bool InspIRCd::BindSocket(int sockfd, int port, const char* addr, bool dolisten)
 }
 
 // Open a TCP Socket
-int irc::sockets::OpenTCPSocket(const char* addr, int socktype)
+int irc::sockets::OpenTCPSocket(const std::string& addr, int socktype)
 {
        int sockfd;
        int on = 1;
-       addr = addr;
        struct linger linger = { 0, 0 };
-       if (!*addr)
+       if (addr.empty())
        {
 #ifdef IPV6
                sockfd = socket (PF_INET6, socktype, 0);
@@ -86,7 +82,7 @@ int irc::sockets::OpenTCPSocket(const char* addr, int socktype)
 #endif
                        sockfd = socket (PF_INET, socktype, 0);
        }
-       else if (strchr(addr,':'))
+       else if (addr.find(':') != std::string::npos)
                sockfd = socket (PF_INET6, socktype, 0);
        else
                sockfd = socket (PF_INET, socktype, 0);
@@ -97,11 +93,11 @@ int irc::sockets::OpenTCPSocket(const char* addr, int socktype)
        }
        else
        {
-               setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
+               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, &linger, sizeof(linger));
+               setsockopt(sockfd, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(linger));
                return (sockfd);
        }
 }
@@ -109,29 +105,28 @@ int irc::sockets::OpenTCPSocket(const char* addr, int socktype)
 // XXX: it would be VERY nice to genericize this so all listen stuff (server/client) could use the one function. -- w00t
 int InspIRCd::BindPorts(FailedPortList &failed_ports)
 {
-       char configToken[MAXBUF], Addr[MAXBUF], Type[MAXBUF], Desc[MAXBUF];
        int bound = 0;
        std::vector<ListenSocketBase*> old_ports(ports.begin(), ports.end());
 
-       for (int count = 0; count < Config->ConfValueEnum("bind"); count++)
+       for (int count = 0;; count++)
        {
-               Config->ConfValue("bind", "port", count, configToken, MAXBUF);
-               Config->ConfValue("bind", "address", count, Addr, MAXBUF);
-               Config->ConfValue("bind", "type", count, Type, MAXBUF);
-               Config->ConfValue("bind", "ssl", count, Desc, MAXBUF);
+               ConfigTag* tag = ServerInstance->Config->ConfValue("bind", count);
+               if (!tag)
+                       break;
+               std::string porttag = tag->getString("port");
+               std::string Addr = tag->getString("address");
+               std::string Type = tag->getString("type");
+               std::string Desc = tag->getString("ssl");
 
-               if (strncmp(Addr, "::ffff:", 7) == 0)
+               if (strncmp(Addr.c_str(), "::ffff:", 7) == 0)
                        this->Logs->Log("SOCKET",DEFAULT, "Using 4in6 (::ffff:) isn't recommended. You should bind IPv4 addresses directly instead.");
 
-               if ((!*Type) || (!strcmp(Type,"clients")))
+               if (Type.empty() || Type == "clients")
                {
-                       irc::portparser portrange(configToken, false);
+                       irc::portparser portrange(porttag, false);
                        int portno = -1;
                        while (0 != (portno = portrange.GetToken()))
                        {
-                               if (*Addr == '*')
-                                       *Addr = 0;
-
                                irc::sockets::sockaddrs bindspec;
                                irc::sockets::aptosa(Addr, portno, &bindspec);
                                std::string bind_readable = irc::sockets::satouser(&bindspec);
@@ -148,16 +143,16 @@ int InspIRCd::BindPorts(FailedPortList &failed_ports)
                                }
                                if (!skip)
                                {
-                                       ClientListenSocket *ll = new ClientListenSocket(this, portno, Addr);
+                                       ClientListenSocket *ll = new ClientListenSocket(portno, Addr, "clients", Desc.empty() ? "plaintext" : Desc);
                                        if (ll->GetFd() > -1)
                                        {
                                                bound++;
-                                               ll->SetDescription(*Desc ? Desc : "plaintext");
                                                ports.push_back(ll);
                                        }
                                        else
                                        {
                                                failed_ports.push_back(std::make_pair(bind_readable, strerror(errno)));
+                                               delete ll;
                                        }
                                }
                        }
@@ -186,10 +181,10 @@ int InspIRCd::BindPorts(FailedPortList &failed_ports)
        return bound;
 }
 
-bool irc::sockets::aptosa(const char* addr, int port, irc::sockets::sockaddrs* sa)
+bool irc::sockets::aptosa(const std::string& addr, int port, irc::sockets::sockaddrs* sa)
 {
        memset(sa, 0, sizeof(*sa));
-       if (!addr || !*addr)
+       if (addr.empty())
        {
 #ifdef IPV6
                sa->in6.sin6_family = AF_INET6;
@@ -200,13 +195,13 @@ bool irc::sockets::aptosa(const char* addr, int port, irc::sockets::sockaddrs* s
 #endif
                return true;
        }
-       else if (inet_pton(AF_INET, addr, &sa->in4.sin_addr) > 0)
+       else if (inet_pton(AF_INET, addr.c_str(), &sa->in4.sin_addr) > 0)
        {
                sa->in4.sin_family = AF_INET;
                sa->in4.sin_port = htons(port);
                return true;
        }
-       else if (inet_pton(AF_INET6, addr, &sa->in6.sin6_addr) > 0)
+       else if (inet_pton(AF_INET6, addr.c_str(), &sa->in6.sin6_addr) > 0)
        {
                sa->in6.sin6_family = AF_INET6;
                sa->in6.sin6_port = htons(port);