122736c2fSopenharmony_ci/* 222736c2fSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 322736c2fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 422736c2fSopenharmony_ci * you may not use this file except in compliance with the License. 522736c2fSopenharmony_ci * You may obtain a copy of the License at 622736c2fSopenharmony_ci * 722736c2fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 822736c2fSopenharmony_ci * 922736c2fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1022736c2fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1122736c2fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1222736c2fSopenharmony_ci * See the License for the specific language governing permissions and 1322736c2fSopenharmony_ci * limitations under the License. 1422736c2fSopenharmony_ci */ 1522736c2fSopenharmony_ci 1622736c2fSopenharmony_ci#include "file_operator.h" 1722736c2fSopenharmony_ci 1822736c2fSopenharmony_ci#include <cstring> 1922736c2fSopenharmony_ci#include <fstream> 2022736c2fSopenharmony_ci#include <sys/stat.h> 2122736c2fSopenharmony_ci#include <unistd.h> 2222736c2fSopenharmony_ci#include <climits> 2322736c2fSopenharmony_ci 2422736c2fSopenharmony_ci#include "global.h" 2522736c2fSopenharmony_cinamespace OHOS { 2622736c2fSopenharmony_cinamespace MiscServices { 2722736c2fSopenharmony_cibool FileOperator::Create(const std::string &path, mode_t mode) 2822736c2fSopenharmony_ci{ 2922736c2fSopenharmony_ci auto ret = mkdir(path.c_str(), mode); 3022736c2fSopenharmony_ci if (ret != SUCCESS) { 3122736c2fSopenharmony_ci IMSA_HILOGE("%{public}s mkdir failed, errno:%{public}d!", path.c_str(), errno); 3222736c2fSopenharmony_ci return false; 3322736c2fSopenharmony_ci } 3422736c2fSopenharmony_ci return true; 3522736c2fSopenharmony_ci} 3622736c2fSopenharmony_ci 3722736c2fSopenharmony_cibool FileOperator::IsExist(const std::string &path) 3822736c2fSopenharmony_ci{ 3922736c2fSopenharmony_ci return access(path.c_str(), F_OK) == SUCCESS; 4022736c2fSopenharmony_ci} 4122736c2fSopenharmony_ci 4222736c2fSopenharmony_cibool FileOperator::Read(const std::string &path, std::string &content) 4322736c2fSopenharmony_ci{ 4422736c2fSopenharmony_ci std::ifstream file(path); 4522736c2fSopenharmony_ci if (!file.is_open()) { 4622736c2fSopenharmony_ci IMSA_HILOGE("%{public}s open fail!", path.c_str()); 4722736c2fSopenharmony_ci return false; 4822736c2fSopenharmony_ci } 4922736c2fSopenharmony_ci std::string sLine; 5022736c2fSopenharmony_ci while (getline(file, sLine)) { 5122736c2fSopenharmony_ci content.append(sLine); 5222736c2fSopenharmony_ci } 5322736c2fSopenharmony_ci return true; 5422736c2fSopenharmony_ci} 5522736c2fSopenharmony_ci 5622736c2fSopenharmony_cibool FileOperator::Write(const std::string &path, const std::string &content, int32_t flags, mode_t mode) 5722736c2fSopenharmony_ci{ 5822736c2fSopenharmony_ci IMSA_HILOGD("content: %{public}s.", content.c_str()); 5922736c2fSopenharmony_ci auto fd = open(path.c_str(), flags, mode); 6022736c2fSopenharmony_ci if (fd < 0) { 6122736c2fSopenharmony_ci IMSA_HILOGE("%{public}s open fail, errno: %{public}d", path.c_str(), errno); 6222736c2fSopenharmony_ci return false; 6322736c2fSopenharmony_ci } 6422736c2fSopenharmony_ci auto ret = write(fd, content.c_str(), content.size()); 6522736c2fSopenharmony_ci if (ret <= 0) { 6622736c2fSopenharmony_ci IMSA_HILOGE("%{public}s write fail, ret: %{public}zd, errno: %{public}d", path.c_str(), ret, errno); 6722736c2fSopenharmony_ci close(fd); 6822736c2fSopenharmony_ci return false; 6922736c2fSopenharmony_ci } 7022736c2fSopenharmony_ci close(fd); 7122736c2fSopenharmony_ci return true; 7222736c2fSopenharmony_ci} 7322736c2fSopenharmony_ci 7422736c2fSopenharmony_cibool FileOperator::Read(const std::string &path, const std::string &key, std::string &content) 7522736c2fSopenharmony_ci{ 7622736c2fSopenharmony_ci if (key.empty()) { 7722736c2fSopenharmony_ci IMSA_HILOGE("key is empty!"); 7822736c2fSopenharmony_ci return false; 7922736c2fSopenharmony_ci } 8022736c2fSopenharmony_ci CfgFiles *cfgFiles = GetCfgFiles(path.c_str()); 8122736c2fSopenharmony_ci if (cfgFiles == nullptr) { 8222736c2fSopenharmony_ci IMSA_HILOGE("%{public}s cfgFiles is nullptr!", path.c_str()); 8322736c2fSopenharmony_ci return false; 8422736c2fSopenharmony_ci } 8522736c2fSopenharmony_ci // parse config files, ordered by priority from high to low 8622736c2fSopenharmony_ci for (int32_t i = MAX_CFG_POLICY_DIRS_CNT - 1; i >= 0; i--) { 8722736c2fSopenharmony_ci auto realPath = GetRealPath(cfgFiles->paths[i]); 8822736c2fSopenharmony_ci if (realPath.empty()) { 8922736c2fSopenharmony_ci continue; 9022736c2fSopenharmony_ci } 9122736c2fSopenharmony_ci content = Read(realPath, key); 9222736c2fSopenharmony_ci if (!content.empty()) { 9322736c2fSopenharmony_ci break; 9422736c2fSopenharmony_ci } 9522736c2fSopenharmony_ci } 9622736c2fSopenharmony_ci FreeCfgFiles(cfgFiles); 9722736c2fSopenharmony_ci return !content.empty(); 9822736c2fSopenharmony_ci} 9922736c2fSopenharmony_ci 10022736c2fSopenharmony_cistd::string FileOperator::Read(const std::string &path, const std::string &key) 10122736c2fSopenharmony_ci{ 10222736c2fSopenharmony_ci std::string content; 10322736c2fSopenharmony_ci bool ret = Read(path, content); 10422736c2fSopenharmony_ci if (!ret) { 10522736c2fSopenharmony_ci IMSA_HILOGE("%{public}s read failed!", path.c_str()); 10622736c2fSopenharmony_ci return ""; 10722736c2fSopenharmony_ci } 10822736c2fSopenharmony_ci if (content.find(key) == std::string::npos) { 10922736c2fSopenharmony_ci IMSA_HILOGD("%{public}s not contain %{public}s!", path.c_str(), key.c_str()); 11022736c2fSopenharmony_ci return ""; 11122736c2fSopenharmony_ci } 11222736c2fSopenharmony_ci return content; 11322736c2fSopenharmony_ci} 11422736c2fSopenharmony_ci 11522736c2fSopenharmony_cistd::string FileOperator::GetRealPath(const char *path) 11622736c2fSopenharmony_ci{ 11722736c2fSopenharmony_ci if (path == nullptr) { 11822736c2fSopenharmony_ci return ""; 11922736c2fSopenharmony_ci } 12022736c2fSopenharmony_ci auto size = strnlen(path, PATH_MAX); 12122736c2fSopenharmony_ci if (size == 0 || size == PATH_MAX) { 12222736c2fSopenharmony_ci return ""; 12322736c2fSopenharmony_ci } 12422736c2fSopenharmony_ci char realPath[PATH_MAX] = { 0x00 }; 12522736c2fSopenharmony_ci if (realpath(path, realPath) == nullptr) { 12622736c2fSopenharmony_ci IMSA_HILOGE("failed to get realpath!"); 12722736c2fSopenharmony_ci return ""; 12822736c2fSopenharmony_ci } 12922736c2fSopenharmony_ci return std::string(realPath); 13022736c2fSopenharmony_ci} 13122736c2fSopenharmony_ci} // namespace MiscServices 13222736c2fSopenharmony_ci} // namespace OHOS