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