Add NCDB startup hook support.
[platform/core/dotnet/launcher.git] / NativeLauncher / inc / utils.h
1 /*
2  * Copyright (c) 2016 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 #ifndef __UTILS_H__
18 #define __UTILS_H__
19
20 #include <algorithm>
21 #include <string>
22 #include <vector>
23 #include <functional>
24 #include <boost/filesystem.hpp>
25 #include <pkgmgr-info.h>
26
27 #include <launcher_env.h>
28
29 #include <sys/prctl.h>
30
31 #ifndef PATH_SEPARATOR
32 #define PATH_SEPARATOR '/'
33 #endif
34
35 #ifndef PROFILE_BASENAME
36 #define PROFILE_BASENAME ".__tizen_specific_profile_data"
37 #endif
38
39 namespace bf = boost::filesystem;
40 namespace bs = boost::system;
41
42 enum FSFlag : int {
43   FS_NONE              = 0,
44   FS_MERGE_SKIP        = (1 << 0),
45   FS_MERGE_OVERWRITE   = (1 << 1),
46   FS_COMMIT_COPY_FILE  = (1 << 2),
47   FS_PRESERVE_OWNERSHIP_AND_PERMISSIONS = (1 << 3)
48 };
49
50 #ifndef PR_TASK_PERF_USER_TRACE
51 #define PR_TASK_PERF_USER_TRACE 666
52 #endif
53
54 /**
55  * @brief concat path with PATH_SEPARATOR
56  * @param[in] destination path
57  * @param[in] source path
58  * @return std::string result path
59  */
60 std::string concatPath(const std::string& path1, const std::string& path2);
61
62 /**
63  * @brief get canonicalized absolute Path
64  * @param[in] source path
65  * @return std::string result path
66  */
67 std::string getAbsolutePath(const std::string& path);
68
69 /**
70  * @brief get the directory of file
71  * @param[in] source path
72  * @return std::string result path
73  */
74 std::string getBaseName(const std::string& path);
75
76 /**
77  * @brief replaces all matching substrings of the regular expression with a given replacement
78  * @param[in] original string
79  * @param[in] pattern to match
80  * @param[in] replacement string
81  * @return std::string the modified string
82  */
83 std::string replaceAll(const std::string& str, const std::string& pattern, const std::string& replace);
84
85 /**
86  * @brief get root path
87  * @param[in] package id
88  * @return std::string root path
89  */
90 std::string getRootPath(const std::string& pkgId);
91
92 /**
93  * @brief get exec name
94  * @param[in] package id
95  * @return std::string exec name
96  */
97 std::string getExecName(const std::string& pkgId);
98
99 /**
100  * @brief get app type
101  * @param[in] package id
102  * @return std::string app type
103  */
104 std::string getAppType(const std::string& pkgId);
105
106 /**
107  * @brief get metadata value
108  * @param[in] package id
109  * @param[in] metadata key
110  * @return std::string metadata value
111  */
112 std::string getMetadataValue(const std::string& pkgId, const std::string& key);
113
114 /**
115  * @brief change the extension of a path or file
116  * @param[in] source path or file
117  * @param[in] from extension
118  * @param[in] to extension
119  * @return std::string path or file with changed extension
120  */
121 std::string changeExtension(const std::string& path, const std::string& from, const std::string& to);
122
123 /**
124  * @brief check the path is 'readonly' or not
125  * @param[in] path
126  * @return bool package readonly value
127  */
128 bool isReadOnlyArea(const std::string& path);
129
130 /**
131  * @brief split path with ":" delimiter and put that in the vector
132  * @param[in] source path
133  * @param[out] string vector
134  */
135 void splitPath(const std::string& path, std::vector<std::string>& out);
136
137 /**
138  * @brief check file exists
139  *        in case of symlink file, check both input file and link reference file.
140  * @param[in] source path
141  * @return bool
142  */
143 bool isFile(const std::string& path);
144
145 /**
146  * @brief check symlink file
147  * @param[in] source path
148  * @return bool
149  */
150 bool isSymlinkFile(const std::string& path);
151
152 /**
153  * @brief check directory exists
154  * @param[in] source path
155  * @return bool
156  */
157 bool isDirectory(const std::string& path);
158
159 /**
160  * @brief check the file is managed assembly or not.
161  * @param[in] file path
162  * @return return true when the file is managed assembly.
163  *         otherwise return false including native image case.
164  */
165 bool isManagedAssembly(const std::string& filePath);
166
167 /**
168  * @brief check the file is native image or not.
169  * @param[in] file path
170  * @return return true when the file is native image.
171  */
172 bool isNativeImage(const std::string& filePath);
173
174 /**
175  * @brief Resolve assembly files from directories and append their paths to the given list.
176  * @remark If a native image exists for an assembly in the same directory, it will be used.
177  *         If multiple assemblies of the same name exist, the first one will be used.
178  * @param[in]  directories  list of directories
179  * @param[out] list         colon-separated string of assembly paths
180  */
181 void addAssembliesFromDirectories(const std::vector<std::string>& directories, std::string& list);
182
183 /**
184  * @brief File search callback
185  * @param[in] path      full path to a resolved file
186  * @param[in] filename  file name
187  */
188 typedef std::function<void (const std::string& path, const std::string& filename)> FileReader;
189
190 /**
191  * @brief Scan all files in the given directory.
192  * @param[in] directory path to a root directory
193  * @param[in] reader    callback for iteration
194  * @param[in] depth     recursive search depth
195  */
196 void scanFilesInDirectory(const std::string& directory, FileReader reader, unsigned int depth);
197
198 /**
199  * @brief copy smack and ownership.
200  * @param[in] get path
201  * @param[in] set path
202  * @param[in] symbolic link
203  */
204 void copySmackAndOwnership(const std::string& fromPath, const std::string& toPath, bool isSymlink = false);
205
206 /**
207  * @brief check whether the path exists or not.
208  * @param[in] source path
209  * @return return true when the path exist.
210  */
211 bool exist(const bf::path& path);
212
213 /**
214  * @brief create the new directory.
215  * @param[in] source path
216  * @return return true when the directory was created.
217  */
218 bool createDir(const bf::path& path);
219
220 /**
221  * @brief copy the directory.
222  * @param[in] path to the source directory
223  * @param[in] path to the target directory
224  * @param[in] filesystem flag
225  * @return return true when the directory was copied.
226  */
227 bool copyDir(const bf::path& path1, const bf::path& path2, FSFlag flags = FS_NONE);
228
229 /**
230  * @brief copy the file.
231  * @param[in] path to the source file
232  * @param[in] path to the target file
233  * @return return true when the file was copied.
234  */
235 bool copyFile(const bf::path& path1, const bf::path& path2);
236
237 /**
238  * @brief moves of renames the file or directory.
239  * @param[in] path to the source file
240  * @param[in] path to the target file
241  * @return return true when the file was moved.
242  */
243 bool moveFile(const bf::path& path1, const bf::path& path2);
244
245 /**
246  * @brief removes the file or empty directory.
247  * @param[in] source path
248  * @return return true when the file was deleted.
249  */
250 bool removeFile(const bf::path& path);
251
252 /**
253  * @brief removes the file or directory and all its contents.
254  * @param[in] source path
255  * @return return true when the file or directory was deleted.
256  */
257 bool removeAll(const bf::path& path);
258
259 /**
260  * @brief change command name of the current process for access via ps command
261  * @param[in] name
262  */
263 void setCmdName(const std::string& name);
264
265 /**
266  * @brief Get the file name from the specified path.
267  * @remark An empty string will be returned if the path string ends with a path separator character.
268  * @param[in] path  path to a file
269  * @return a substring after the path separator character
270  */
271 std::string getFileName(const std::string& path);
272
273 /**
274  * @brief Generates a representation called a message digest
275  * @param[in] file path
276  * @return message digest
277  */
278 std::string SHA256(const std::string& path);
279
280 /**
281  * @brief Creates the package information handle from db which is not disabled.
282  *        This function is a wrapper of pkgmgrinfo_pkginfo_get_pkginfo() to handle multi-user case
283  * @param[in] pkg id
284  * @param[out] pkginfo handle
285  * @return 0 if success, otherwise -1
286  */
287 int pkgmgrGetPkgInfo(const std::string& pkgId, pkgmgrinfo_pkginfo_h* handle);
288
289 /**
290  * @brief Creates the application information handle from db.
291  *        This function is a wrapper of pkgmgrinfo_appinfo_get_appinfo() to handle multi-user case
292  * @param[in] app id
293  * @param[out] appinfo handle
294  * @return 0 if success, otherwise -1
295  */
296 int pkgmgrGetAppInfo(const std::string& appId, pkgmgrinfo_appinfo_h* handle);
297
298 /**
299  * @brief Executes the metadata filter query for all the installed packages.
300  *        This function is a wrapper of pkgmgrinfo_appinfo_metadata_filter_foreach() to handle multi-user case
301  * @param[in] metadata filter handle
302  * @param[in] callback function
303  * @param[in] user data
304  * @return 0 if success, otherwise -1
305  */
306 int pkgmgrMDFilterForeach(pkgmgrinfo_appinfo_metadata_filter_h handle,
307                                          pkgmgrinfo_app_list_cb app_cb,
308                                          void *user_data);
309
310 /**
311  * @brief Prints HW Clock log
312  * @param[in] format `printf`-like format string
313  * @param[in] ... `printf`-like variadic list of arguments corresponding to the format string
314  */
315 void printHWClockLog(const char* format, ...);
316
317 /**
318  * @brief Return NCDB startup hook
319  * @return NCDB startup hook
320  */
321 const char* getNCDBStartupHook();
322
323 /**
324  * @brief Check is NCDB startup hook provided in DOTNET_STARTUP_HOOKS env
325  * @return `true` if provided, otherwise `false`
326  */
327 bool isNCDBStartupHookProvided();
328
329 #endif /* __UTILS_H__ */