]> git.vomp.tv Git - vompserver.git/commitdiff
Fix config dir thread safety
authorChris Tallon <chris@vomp.tv>
Mon, 26 Nov 2007 18:49:07 +0000 (18:49 +0000)
committerChris Tallon <chris@vomp.tv>
Mon, 26 Nov 2007 18:49:07 +0000 (18:49 +0000)
mvpclient.c
mvpclient.h
mvpserver.c
mvpserver.h
vompserver.c

index 21674e9302460c1f03611b426036f4d0ac8e0f6c..d366e51e1ccc2f9ec41589cfc8ddc154846e8ffb 100644 (file)
@@ -29,7 +29,7 @@ pthread_mutex_t threadClientMutex;
 int MVPClient::nr_clients = 0;
 
 
-MVPClient::MVPClient(Config* cfgBase, char* tconfigDirExtra, int tsocket)
+MVPClient::MVPClient(Config* cfgBase, char* tconfigDir, int tsocket)
  : tcp(tsocket)
 {
 #ifndef VOMPSTANDALONE
@@ -40,7 +40,7 @@ MVPClient::MVPClient(Config* cfgBase, char* tconfigDirExtra, int tsocket)
   imageFile = 0;
   log = Log::getInstance();
   loggedIn = false;
-  configDirExtra = tconfigDirExtra;
+  configDir = tconfigDir;
   baseConfig = cfgBase;
   incClients();
 }
@@ -396,17 +396,6 @@ int MVPClient::processLogin(UCHAR* buffer, int length, ResponsePacket* rp)
 
   // Open the config
 
-#ifndef VOMPSTANDALONE
-  const char* configDir = cPlugin::ConfigDirectory(configDirExtra);
-#else
-  const char* configDir = ".";
-#endif
-  if (!configDir)
-  {
-    log->log("Client", Log::DEBUG, "No config dir!");
-    return 0;
-  }
-
   char configFileName[PATH_MAX];
   snprintf(configFileName, PATH_MAX, "%s/vomp-%02X-%02X-%02X-%02X-%02X-%02X.conf", configDir, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);
   config.init(configFileName);
index dfa767ab592d0f3007aadcc67b0ab0498350483e..8afdf4fd3ce9dee9965fa16180b68a9a969a1bef 100644 (file)
@@ -49,7 +49,7 @@ class ResponsePacket;
 class MVPClient
 {
   public:
-    MVPClient(Config* baseConfig, char* configDirExtra, int tsocket);
+    MVPClient(Config* baseConfig, char* configDir, int tsocket);
     ~MVPClient();
 
     int run();
@@ -66,7 +66,7 @@ class MVPClient
     Config config;
     Config* baseConfig;
     bool loggedIn;
-    char* configDirExtra;
+    char* configDir;
     FILE* imageFile;
 
 #ifndef VOMPSTANDALONE
index 85bc8da9eb28767e62c9fa6290f43ceec13c1a86..211150c058259ea045724f8c7114d4e1e3c88cb9 100644 (file)
@@ -54,36 +54,27 @@ int MVPServer::stop()
   return 1;
 }
 
-int MVPServer::run(char* tconfigDirExtra)
+int MVPServer::run(char* tconfigDir)
 {
   if (threadIsActive()) return 1;
 
-  configDirExtra = tconfigDirExtra;
+  configDir = tconfigDir;
 
   // Start config
-#ifndef VOMPSTANDALONE
-  const char* configDir = cPlugin::ConfigDirectory(configDirExtra);
-#else
-  const char* configDir = ".";
+#ifdef VOMPSTANDALONE
 #define dsyslog(x) std::cout << x << std::endl;
 #endif
-  if (!configDir)
+
+  char configFileName[PATH_MAX];
+  snprintf(configFileName, PATH_MAX, "%s/vomp.conf", configDir);
+
+  if (config.init(configFileName))
   {
-    dsyslog("VOMP: Could not get config dir from VDR");
+    dsyslog("VOMP: Config file found");
   }
   else
   {
-    char configFileName[PATH_MAX];
-    snprintf(configFileName, PATH_MAX, "%s/vomp.conf", configDir);
-
-    if (config.init(configFileName))
-    {
-      dsyslog("VOMP: Config file found");
-    }
-    else
-    {
-      dsyslog("VOMP: Config file not found");
-    }
+    dsyslog("VOMP: Config file not found");
   }
 
   // Start logging
@@ -158,7 +149,6 @@ int MVPServer::run(char* tconfigDirExtra)
   if (tftpEnabled)
   {
     char tftpPath[PATH_MAX];
-//    snprintf(configFileName, PATH_MAX, "%s/vomp.conf", configDir);
 
     configString = config.getValueString("General", "TFTP directory");
     if (configString)
@@ -258,7 +248,7 @@ void MVPServer::threadMethod()
   while(1)
   {
     clientSocket = accept(listeningSocket,(struct sockaddr *)&address, &length);
-    MVPClient* m = new MVPClient(&config, configDirExtra, clientSocket);
+    MVPClient* m = new MVPClient(&config, configDir, clientSocket);
     m->run();
   }
 }
index 5236f3575c4d3aa2d51c1adb18083dc67f151818..78523a61050a8227aea1724544ffa4031faf99dc 100644 (file)
@@ -53,7 +53,7 @@ class MVPServer : public Thread
     Tftpd tftpd;
     MVPRelay mvprelay;
     int listeningSocket;
-    char* configDirExtra;
+    char* configDir;
 };
 
 #endif
index 624f2798eed2dad6d40cdeb8fa4b29ce20b737fd..c1179e12c93d523cd4d66b25a03ec0007dc28674 100644 (file)
@@ -65,6 +65,19 @@ cPluginVompserver::cPluginVompserver(void)
 bool cPluginVompserver::Start(void)
 {
   // Start any background activities the plugin shall perform.
+  
+  if (!configDir)
+  {
+    const char* vdrret = cPlugin::ConfigDirectory("vompserver");
+    if (!vdrret)
+    {
+      dsyslog("VOMP: Could not get config dir from VDR");
+      return false;
+    }
+    configDir = new char[strlen(vdrret)+1];
+    strcpy(configDir, vdrret);
+  }
+  
   int success = mvpserver.run(configDir);
   if (success) return true;
   else return false;
@@ -74,6 +87,7 @@ cPluginVompserver::~cPluginVompserver()
 {
   // Clean up after yourself!
   mvpserver.stop();
+  if (configDir) delete[] configDir;
 }
 
 const char *cPluginVompserver::CommandLineHelp(void)
@@ -92,7 +106,15 @@ bool cPluginVompserver::ProcessArgs(int argc, char *argv[])
   {
     if (c == 'c')
     {
-      configDir = optarg;
+      const char* vdrret = cPlugin::ConfigDirectory(optarg);
+      if (!vdrret)
+      {
+        dsyslog("VOMP: Could not get config dir from VDR");
+        return false;
+      }
+    
+      configDir = new char[strlen(vdrret)+1];
+      strcpy(configDir, vdrret);
     }
     else
     {