f168866a044cb29af7194c8a0e094daee70743b2
[framework/web/wrt-installer.git] / src / wrt-installer / plugin_utils.cpp
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  *    Licensed under the Apache License, Version 2.0 (the "License");
5  *    you may not use this file except in compliance with the License.
6  *    You may obtain a copy of the License at
7  *
8  *        http://www.apache.org/licenses/LICENSE-2.0
9  *
10  *    Unless required by applicable law or agreed to in writing, software
11  *    distributed under the License is distributed on an "AS IS" BASIS,
12  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  *    See the License for the specific language governing permissions and
14  *    limitations under the License.
15  */
16 /**
17  * @file    plugin-utils.cpp
18  * @author
19  * @version 1.0
20  * @brief   Header file for plugin util
21  */
22
23 #include <unistd.h>
24 #include "plugin_utils.h"
25 #include <dpl/exception.h>
26 #include <dpl/log/log.h>
27 #include <dpl/wrt-dao-ro/global_config.h>
28 #include <sys/file.h>
29
30 using namespace WrtDB;
31
32 namespace PluginUtils {
33 const char* PLUGIN_INSTALL_LOCK_FILE = "/tmp/.wrt_plugin_install_lock";
34
35 static int s_plugin_install_lock_fd = -1;
36
37 bool lockPluginInstallation()
38 {
39     int ret = 0;
40
41     LogInfo("Try to lock for plugins installation.");
42
43     s_plugin_install_lock_fd =
44         open(PLUGIN_INSTALL_LOCK_FILE, O_RDONLY | O_CREAT, 0666);
45
46     if (s_plugin_install_lock_fd == -1) {
47         LogError("Lock file open failed!");
48
49         return false;
50     }
51
52     ret = flock(s_plugin_install_lock_fd, LOCK_EX); //lock with waiting
53
54     if (ret == -1) {
55         LogError("Lock failed!");
56
57         close(s_plugin_install_lock_fd);
58         s_plugin_install_lock_fd = -1;
59
60         return false;
61     }
62
63     return true;
64 }
65
66 bool unlockPluginInstallation()
67 {
68     LogInfo("Unlock for plugins installation.");
69
70     if (s_plugin_install_lock_fd != -1) {
71         int ret = 0;
72
73         ret = flock(s_plugin_install_lock_fd, LOCK_UN); //unlock
74
75         if (ret == -1) {
76             LogError("Unlock failed!");
77         }
78
79         close(s_plugin_install_lock_fd);
80         s_plugin_install_lock_fd = -1;
81
82         return true;
83     } else {
84         LogError("Lock file was not created!");
85     }
86
87     return false;
88 }
89
90 bool checkPluginInstallationRequired()
91 {
92     std::string installRequest =
93         std::string(GlobalConfig::GetPluginInstallInitializerName());
94
95     FileState::Type installationRequest =
96         checkFile(installRequest);
97
98     switch (installationRequest) {
99     case FileState::FILE_EXISTS:
100         return true;
101     case FileState::FILE_NOT_EXISTS:
102         return false;
103     default:
104         LogWarning("Opening installation request file failed");
105         return false;
106     }
107 }
108
109 bool removeInstallationRequiredFlag()
110 {
111     std::string installRequest =
112         std::string(GlobalConfig::GetPluginInstallInitializerName());
113
114     return removeFile(installRequest);
115 }
116
117 //checks if file exists and is regular file
118 FileState::Type checkFile(const std::string& filename)
119 {
120     struct stat tmp;
121
122     if (-1 == stat(filename.c_str(), &tmp)) {
123         if (ENOENT == errno) {
124             return FileState::FILE_NOT_EXISTS;
125         }
126         return FileState::FILE_READ_DATA_ERROR;
127     } else if (!S_ISREG(tmp.st_mode)) {
128         return FileState::FILE_EXISTS_NOT_REGULAR;
129     }
130     return FileState::FILE_EXISTS;
131 }
132
133 bool removeFile(const std::string& filename)
134 {
135     if (0 != unlink(filename.c_str())) {
136         return false;
137     }
138
139     return true;
140 }
141 } //namespace PluginUtils