From 9e24808fed16d954217543169e643aa2b7ff0b9a Mon Sep 17 00:00:00 2001 From: Chris Tallon Date: Mon, 26 Nov 2007 18:49:07 +0000 Subject: [PATCH] Fix config dir thread safety --- mvpclient.c | 15 ++------------- mvpclient.h | 4 ++-- mvpserver.c | 32 +++++++++++--------------------- mvpserver.h | 2 +- vompserver.c | 24 +++++++++++++++++++++++- 5 files changed, 39 insertions(+), 38 deletions(-) diff --git a/mvpclient.c b/mvpclient.c index 21674e9..d366e51 100644 --- a/mvpclient.c +++ b/mvpclient.c @@ -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); diff --git a/mvpclient.h b/mvpclient.h index dfa767a..8afdf4f 100644 --- a/mvpclient.h +++ b/mvpclient.h @@ -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 diff --git a/mvpserver.c b/mvpserver.c index 85bc8da..211150c 100644 --- a/mvpserver.c +++ b/mvpserver.c @@ -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(); } } diff --git a/mvpserver.h b/mvpserver.h index 5236f35..78523a6 100644 --- a/mvpserver.h +++ b/mvpserver.h @@ -53,7 +53,7 @@ class MVPServer : public Thread Tftpd tftpd; MVPRelay mvprelay; int listeningSocket; - char* configDirExtra; + char* configDir; }; #endif diff --git a/vompserver.c b/vompserver.c index 624f279..c1179e1 100644 --- a/vompserver.c +++ b/vompserver.c @@ -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 { -- 2.39.2