1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "test_common.h"
17 #include <dirent.h>
18 #include <unistd.h>
19 #include <sys/stat.h>
20
21 namespace OHOS {
22 namespace Security {
23 namespace SelinuxUnitTest {
CreateDirectory(const std::string & path)24 bool CreateDirectory(const std::string &path)
25 {
26 std::string::size_type index = 0;
27 do {
28 std::string subPath;
29 index = path.find('/', index + 1);
30 if (index == std::string::npos) {
31 subPath = path;
32 } else {
33 subPath = path.substr(0, index);
34 }
35
36 if (access(subPath.c_str(), F_OK) != 0) {
37 if (mkdir(subPath.c_str(), S_IRWXU) != 0) {
38 return false;
39 }
40 }
41 } while (index != std::string::npos);
42
43 return access(path.c_str(), F_OK) == 0;
44 }
45
RemoveDirectory(const std::string & path)46 bool RemoveDirectory(const std::string &path)
47 {
48 std::string curDir = ".";
49 std::string upDir = "..";
50 DIR *dirp;
51 struct dirent *dp;
52 struct stat dirStat;
53
54 if (access(path.c_str(), F_OK) != 0) {
55 return true;
56 }
57 int statRet = stat(path.c_str(), &dirStat);
58 if (statRet < 0) {
59 return false;
60 }
61
62 if (S_ISREG(dirStat.st_mode)) {
63 remove(path.c_str());
64 } else if (S_ISDIR(dirStat.st_mode)) {
65 dirp = opendir(path.c_str());
66 while ((dp = readdir(dirp)) != nullptr) {
67 if ((curDir == std::string(dp->d_name)) || (upDir == std::string(dp->d_name))) {
68 continue;
69 }
70 std::string dirName = path + "/" + std::string(dp->d_name);
71 RemoveDirectory(dirName.c_str());
72 }
73 closedir(dirp);
74 rmdir(path.c_str());
75 } else {
76 return false;
77 }
78 return true;
79 }
80
GetDirectory(const std::string & path)81 std::string GetDirectory(const std::string &path)
82 {
83 std::string dir = "";
84 size_t index = path.rfind('/');
85 if (std::string::npos != index) {
86 dir = path.substr(0, index);
87 }
88 return dir;
89 }
90
CreateFile(const std::string & path)91 bool CreateFile(const std::string &path)
92 {
93 std::string dir = GetDirectory(path);
94 if (dir != "") {
95 if (!CreateDirectory(dir)) {
96 return false;
97 }
98 }
99
100 if (access(path.c_str(), F_OK) != 0) {
101 FILE *fp = fopen(path.c_str(), "w");
102 if (fp == nullptr) {
103 return false;
104 }
105 fclose(fp);
106 }
107
108 return access(path.c_str(), F_OK) == 0;
109 }
110
CopyFile(const std::string & src,const std::string & des)111 bool CopyFile(const std::string &src, const std::string &des)
112 {
113 std::ifstream fin(src, std::ifstream::in || std::ifstream::binary);
114 if (!fin) {
115 return false;
116 }
117 std::ofstream fout(des, std::ofstream::out || std::ofstream::binary);
118 if (!fout) {
119 fin.close();
120 return false;
121 }
122 fout << fin.rdbuf();
123 if (!fout) {
124 fin.close();
125 fout.close();
126 return false;
127 }
128 fin.close();
129 fout.close();
130 return true;
131 }
132
WriteFile(const std::string & file,const std::vector<std::string> & info)133 bool WriteFile(const std::string &file, const std::vector<std::string> &info)
134 {
135 std::ofstream fout(file, std::ofstream::out || std::ofstream::app);
136 if (!fout) {
137 return false;
138 }
139 for (auto i : info) {
140 fout << i << std::endl;
141 }
142 if (!fout) {
143 fout.close();
144 return false;
145 }
146 fout.close();
147 return true;
148 }
149
RenameFile(const std::string & src,const std::string & des)150 int RenameFile(const std::string &src, const std::string &des)
151 {
152 return rename(src.c_str(), des.c_str());
153 }
154
RunCommand(const std::string & command)155 std::string RunCommand(const std::string &command)
156 {
157 std::string result = "";
158 FILE *file = popen(command.c_str(), "r");
159
160 if (file != nullptr) {
161 char commandResult[1024] = {0};
162 while ((fgets(commandResult, sizeof(commandResult), file)) != nullptr) {
163 result.append(commandResult);
164 }
165 pclose(file);
166 file = nullptr;
167 }
168 return result;
169 }
170 } // namespace SelinuxUnitTest
171 } // namespace Security
172 } // namespace OHOS
173