version 0.3.4
[fms.git] / src / nntp / nntplistener.cpp
index 7f6e469..860da2c 100644 (file)
@@ -1,10 +1,13 @@
 #include "../../include/nntp/nntplistener.h"\r
 #include "../../include/nntp/nntpconnection.h"\r
 #include "../../include/option.h"\r
-#include "../../include/logfile.h"\r
 #include "../../include/global.h"\r
 #include "../../include/stringfunctions.h"\r
 \r
+#include <Poco/Net/SocketAddress.h>\r
+\r
+#include <cstring>\r
+\r
 #ifdef _WIN32\r
        #include <winsock2.h>\r
        #include <ws2tcpip.h>\r
@@ -27,7 +30,7 @@ NNTPListener::~NNTPListener()
 \r
 }\r
 \r
-void NNTPListener::Run()\r
+void NNTPListener::run()\r
 {\r
        int rval;\r
        fd_set readfs;\r
@@ -35,7 +38,7 @@ void NNTPListener::Run()
        std::vector<SOCKET>::iterator listeni;\r
        SOCKET highsocket;\r
 \r
-       LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"NNTPListener::run thread started.");\r
+       m_log->debug("NNTPListener::run thread started.");\r
 \r
        StartListen();\r
 \r
@@ -73,63 +76,14 @@ void NNTPListener::Run()
                                        struct sockaddr_storage addr;\r
                                        socklen_t addrlen=sizeof(addr);\r
                                        newsock=accept((*listeni),(struct sockaddr *)&addr,&addrlen);\r
-                                       LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_INFO,"NNTPListener::run NNTP client connected");\r
-                                       //m_connections.execute(new NNTPConnection(newsock));\r
-                                       //m_connectionthreads.push_back(new PThread::Thread(new NNTPConnection(newsock)));\r
-                                       m_connections.Execute(new NNTPConnection(newsock));\r
+                                       m_log->information("NNTPListener::run NNTP client connected");\r
+                                       m_connections.Start(new NNTPConnection(newsock));\r
                                }\r
                        }\r
                }\r
-/*\r
-               // check for any non-running connection threads that we can delete\r
-               for(std::vector<PThread::Thread *>::iterator i=m_connectionthreads.begin(); i!=m_connectionthreads.end(); )\r
-               {\r
-                       if((*i)->IsRunning()==false)\r
-                       {\r
-                               delete (*i);\r
-                               i=m_connectionthreads.erase(i);\r
-                       }\r
-                       if(i!=m_connectionthreads.end())\r
-                       {\r
-                               i++;\r
-                       }\r
-               }\r
-*/\r
 \r
-       //}while(!ZThread::Thread::interrupted() && m_listensockets.size()>0);\r
        }while(!IsCancelled() && m_listensockets.size()>0);\r
 \r
-       // see if any threads are still running - just calling interrupt without check would cause assert in debug mode\r
-       /*\r
-       if(m_connections.wait(1)==false)\r
-       {\r
-               LogFile::instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"NNTPListener::run interrupting connection threads and waiting 60 seconds for exit.");\r
-               try\r
-               {\r
-                       m_connections.interrupt();\r
-               }\r
-               catch(...)\r
-               {\r
-                       LogFile::instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"NNTPListener::run caught unhandled exception.");\r
-               }\r
-               if(m_connections.wait(60000)==false)\r
-               {\r
-                       LogFile::instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"NNTPListener::run connection threads did not exit after 60 seconds.");\r
-               }\r
-       }\r
-       */\r
-       /*\r
-       for(std::vector<PThread::Thread *>::iterator i=m_connectionthreads.begin(); i!=m_connectionthreads.end(); i++)\r
-       {\r
-               if((*i)->IsRunning())\r
-               {\r
-                       LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"NNTPListener::Run waiting for connection thread to exit.");\r
-                       (*i)->Cancel();\r
-                       (*i)->Join();\r
-               }\r
-               delete (*i);\r
-       }\r
-       */\r
        m_connections.Cancel();\r
        m_connections.Join();\r
 \r
@@ -143,7 +97,7 @@ void NNTPListener::Run()
        }\r
        m_listensockets.clear();\r
 \r
-       LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"NNTPListener::run thread exiting.");\r
+       m_log->debug("NNTPListener::run thread exiting.");\r
 \r
 }\r
 \r
@@ -181,19 +135,26 @@ void NNTPListener::StartListen()
                {\r
                        for(current=result; current!=NULL; current=current->ai_next)\r
                        {\r
+                               Poco::Net::SocketAddress sa(current->ai_addr,current->ai_addrlen);\r
+                               m_log->debug("NNTPListener::StartListen trying to create socket, bind, and listen on "+sa.toString());\r
+\r
                                sock=socket(current->ai_family,current->ai_socktype,current->ai_protocol);\r
                                if(sock!=INVALID_SOCKET)\r
                                {\r
+                                       #ifndef _WIN32\r
+                                       const char optval='1';\r
+                                       setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&optval,sizeof(optval));\r
+                                       #endif\r
                                        if(bind(sock,current->ai_addr,current->ai_addrlen)==0)\r
                                        {\r
                                                if(listen(sock,10)==0)\r
                                                {\r
-                                                       LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_INFO,"NNTPListener::StartListen started listening at "+(*i)+":"+nntpport);\r
+                                                       m_log->information("NNTPListener::StartListen started listening on "+sa.toString());\r
                                                        m_listensockets.push_back(sock);\r
                                                }\r
                                                else\r
                                                {\r
-                                                       LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_ERROR,"NNTPListener::StartListen socket listen failed");\r
+                                                       m_log->error("NNTPListener::StartListen socket listen failed");\r
                                                        #ifdef _WIN32\r
                                                        closesocket(sock);\r
                                                        #else\r
@@ -203,7 +164,7 @@ void NNTPListener::StartListen()
                                        }\r
                                        else\r
                                        {\r
-                                               LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_ERROR,"NNTPListener::StartListen socket bind failed");\r
+                                               m_log->error("NNTPListener::StartListen socket bind failed");\r
                                                #ifdef _WIN32\r
                                                closesocket(sock);\r
                                                #else\r
@@ -213,7 +174,7 @@ void NNTPListener::StartListen()
                                }\r
                                else\r
                                {\r
-                                       LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_ERROR,"NNTPListener::StartListen couldn't create socket");\r
+                                       m_log->error("NNTPListener::StartListen couldn't create socket");\r
                                }\r
                        }\r
                }\r
@@ -224,6 +185,6 @@ void NNTPListener::StartListen()
        }\r
        if(m_listensockets.size()==0)\r
        {\r
-               LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_FATAL,"NNTPListener::StartListen couldn't start listening on any sockets");\r
+               m_log->fatal("NNTPListener::StartListen couldn't start listening on any sockets");\r
        }\r
 }\r