* @brief Header file for plugin util
*/
+#include <unistd.h>
#include "plugin_utils.h"
-#include <dpl/semaphore.h>
#include <dpl/exception.h>
#include <dpl/log/log.h>
#include <dpl/wrt-dao-ro/global_config.h>
+#include <sys/file.h>
using namespace WrtDB;
namespace PluginUtils {
-const char PLUGIN_INSTALL_SEMAPHORE[] = "/.wrt_plugin_install_lock";
+const char* PLUGIN_INSTALL_LOCK_FILE = "/tmp/.wrt_plugin_install_lock";
-static DPL::Semaphore semaphore(PLUGIN_INSTALL_SEMAPHORE);
+static int s_plugin_install_lock_fd = -1;
-bool lockPluginInstallation()
+bool lockPluginInstallation(bool isPreload)
{
- Try {
- semaphore.Lock();
+ if (isPreload) {
+ fprintf(stderr, "Skip create lock file.. \n");
return true;
}
- Catch(DPL::Semaphore::Exception::Base){
+
+ int ret = 0;
+
+ LogInfo("Try to lock for plugins installation.");
+
+ s_plugin_install_lock_fd =
+ open(PLUGIN_INSTALL_LOCK_FILE, O_RDONLY | O_CREAT, 0666);
+
+ if (s_plugin_install_lock_fd == -1) {
+ LogError("Lock file open failed!");
+
+ return false;
+ }
+
+ ret = flock(s_plugin_install_lock_fd, LOCK_EX); //lock with waiting
+
+ if (ret == -1) {
+ LogError("Lock failed!");
+
+ close(s_plugin_install_lock_fd);
+ s_plugin_install_lock_fd = -1;
+
return false;
}
+
+ return true;
}
-bool unlockPluginInstallation()
+bool unlockPluginInstallation(bool isPreload)
{
- Try {
- semaphore.Unlock();
+ LogInfo("Unlock for plugins installation.");
+ if (isPreload) {
+ fprintf(stderr, "Skip plugin unlock.. \n");
return true;
}
- Catch(DPL::Semaphore::Exception::Base){
- return false;
+
+ if (s_plugin_install_lock_fd != -1) {
+ int ret = 0;
+
+ ret = flock(s_plugin_install_lock_fd, LOCK_UN); //unlock
+
+ if (ret == -1) {
+ LogError("Unlock failed!");
+ }
+
+ close(s_plugin_install_lock_fd);
+ s_plugin_install_lock_fd = -1;
+
+ return true;
+ } else {
+ LogError("Lock file was not created!");
}
+
+ return false;
}
bool checkPluginInstallationRequired()
checkFile(installRequest);
switch (installationRequest) {
- case FileState::FILE_EXISTS:
- return true;
- case FileState::FILE_NOT_EXISTS:
- return false;
- default:
+ case FileState::FILE_EXISTS:
+ return true;
+ case FileState::FILE_NOT_EXISTS:
+ return false;
+ default:
LogWarning("Opening installation request file failed");
return false;
}