version 0.3.27
[fms.git] / src / fmsapp.cpp
index 3182443..261ea46 100644 (file)
@@ -17,6 +17,8 @@
 #include <Poco/FormattingChannel.h>\r
 #include <Poco/PatternFormatter.h>\r
 #include <iostream>\r
+#include <string>\r
+#include <cstring>\r
 \r
 #ifdef _WIN32\r
        #include <direct.h>\r
        #include <unistd.h>\r
 #endif\r
 \r
-FMSApp::FMSApp():m_displayhelp(false),m_showoptions(false),m_setoption(false),m_logtype("file")\r
+FMSApp::FMSApp():m_displayhelp(false),m_showoptions(false),m_setoption(false),m_logtype("file"),m_workingdirectory("")\r
 {\r
-\r
+       // get current working dir so we can go to it later\r
+       char wd[1024];\r
+       char *wdptr=NULL;\r
+       memset(wd,0,1024);\r
+       wdptr=getcwd(wd,1023);\r
+       if(wdptr)\r
+       {\r
+               m_workingdirectory=wdptr;\r
+       }\r
 }\r
 \r
 void FMSApp::defineOptions(Poco::Util::OptionSet &options)\r
@@ -90,8 +100,13 @@ void FMSApp::initialize(Poco::Util::Application &self)
 {\r
        ServerApplication::initialize(self);\r
 \r
-       // set working directory to program directory\r
-       int rval=chdir(config().getString("application.dir").c_str());\r
+       // set working directory - fall back on application.dir if working directory isn't set\r
+       // if we are runing as a service, then working directory needs to be set to the application directory\r
+       if(m_workingdirectory=="" || config().getBool("application.runAsService",false)==true)\r
+       {\r
+               m_workingdirectory=config().getString("application.dir");\r
+       }\r
+       int rval=chdir(m_workingdirectory.c_str());\r
 \r
        SetupDB();\r
        SetupDefaultOptions();\r
@@ -145,10 +160,14 @@ int FMSApp::main(const std::vector<std::string> &args)
 \r
        // running as a daemon would reset the working directory to / before calling main\r
        // so we need to set the working directory again\r
-       // set working directory to program directory\r
-       int rval=chdir(config().getString("application.dir").c_str());\r
+       int rval=chdir(m_workingdirectory.c_str());\r
 \r
-       if(m_displayhelp)\r
+       if(VerifyDB()==false)\r
+       {\r
+               std::cout << "The FMS database failed verification.  It is most likely corrupt!" << std::endl;\r
+               logger().fatal("The FMS database failed verification.  It is most likely corrupt!");\r
+       }\r
+       else if(m_displayhelp)\r
        {\r
        }\r
        else if(m_showoptions)\r
@@ -162,6 +181,15 @@ int FMSApp::main(const std::vector<std::string> &args)
        else\r
        {\r
                logger().information("FMS startup v"FMS_VERSION);\r
+               logger().information("Using SQLite "SQLITE_VERSION);\r
+\r
+               std::string tempval="";\r
+               Option::Instance()->Get("VacuumOnStartup",tempval);\r
+               if(tempval=="true")\r
+               {\r
+                       logger().information("VACUUMing database");\r
+                       SQLite3DB::DB::Instance()->Execute("VACUUM;");\r
+               }\r
 \r
                StartThreads();\r
 \r
@@ -235,6 +263,10 @@ void FMSApp::StartThreads()
        {\r
                logger().trace("FMSApp::StartThreads starting HTTPThread");\r
                m_threads.Start(new HTTPThread());\r
+               if(isInteractive())\r
+               {\r
+                       std::cout << "Started HTTP Thread" << std::endl;\r
+               }\r
        }\r
        else\r
        {\r
@@ -247,6 +279,10 @@ void FMSApp::StartThreads()
        {\r
                logger().trace("FMSApp::StartThreads starting NNTPListener");\r
                m_threads.Start(new NNTPListener());\r
+               if(isInteractive())\r
+               {\r
+                       std::cout << "Started NNTP Thread" << std::endl;\r
+               }\r
        }\r
        else\r
        {\r
@@ -259,6 +295,10 @@ void FMSApp::StartThreads()
        {\r
                logger().trace("FMSApp::StartThreads starting FreenetMasterThread");\r
                m_threads.Start(new FreenetMasterThread());\r
+               if(isInteractive())\r
+               {\r
+                       std::cout << "Started Freenet FCP Thread" << std::endl;\r
+               }\r
        }\r
        else\r
        {\r