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