137a09cd7Sopenharmony_ci/*
237a09cd7Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
337a09cd7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
437a09cd7Sopenharmony_ci * you may not use this file except in compliance with the License.
537a09cd7Sopenharmony_ci * You may obtain a copy of the License at
637a09cd7Sopenharmony_ci *
737a09cd7Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
837a09cd7Sopenharmony_ci *
937a09cd7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1037a09cd7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1137a09cd7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1237a09cd7Sopenharmony_ci * See the License for the specific language governing permissions and
1337a09cd7Sopenharmony_ci * limitations under the License.
1437a09cd7Sopenharmony_ci */
1537a09cd7Sopenharmony_ci
1637a09cd7Sopenharmony_ci#include "file_operation.h"
1737a09cd7Sopenharmony_ci
1837a09cd7Sopenharmony_ci#include <cstdio>
1937a09cd7Sopenharmony_ci#include <string>
2037a09cd7Sopenharmony_ci#include <fcntl.h>
2137a09cd7Sopenharmony_ci#include <mutex>
2237a09cd7Sopenharmony_ci#include <unistd.h>
2337a09cd7Sopenharmony_ci#include <sys/stat.h>
2437a09cd7Sopenharmony_ci#include "bits/fcntl.h"
2537a09cd7Sopenharmony_ci#include "errors.h"
2637a09cd7Sopenharmony_ci#include "thermal_log.h"
2737a09cd7Sopenharmony_ci
2837a09cd7Sopenharmony_cinamespace OHOS {
2937a09cd7Sopenharmony_cinamespace PowerMgr {
3037a09cd7Sopenharmony_cistatic std::mutex g_mutex;
3137a09cd7Sopenharmony_ciint32_t FileOperation::CreateNodeDir(std::string dir)
3237a09cd7Sopenharmony_ci{
3337a09cd7Sopenharmony_ci    THERMAL_HILOGD(COMP_SVC, "Enter");
3437a09cd7Sopenharmony_ci    if (access(dir.c_str(), 0) != ERR_OK) {
3537a09cd7Sopenharmony_ci        int flag = mkdir(dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH| S_IXOTH);
3637a09cd7Sopenharmony_ci        if (flag == ERR_OK) {
3737a09cd7Sopenharmony_ci            THERMAL_HILOGI(COMP_SVC, "Create directory successfully.");
3837a09cd7Sopenharmony_ci        } else {
3937a09cd7Sopenharmony_ci            THERMAL_HILOGE(COMP_SVC, "Fail to create directory, flag: %{public}d", flag);
4037a09cd7Sopenharmony_ci            return flag;
4137a09cd7Sopenharmony_ci        }
4237a09cd7Sopenharmony_ci    } else {
4337a09cd7Sopenharmony_ci        THERMAL_HILOGE(COMP_SVC, "This directory already exists.");
4437a09cd7Sopenharmony_ci    }
4537a09cd7Sopenharmony_ci    return ERR_OK;
4637a09cd7Sopenharmony_ci}
4737a09cd7Sopenharmony_ci
4837a09cd7Sopenharmony_ciint32_t FileOperation::CreateNodeFile(std::string filePath)
4937a09cd7Sopenharmony_ci{
5037a09cd7Sopenharmony_ci    if (access(filePath.c_str(), 0) != 0) {
5137a09cd7Sopenharmony_ci        int32_t fd = open(filePath.c_str(), O_CREAT | O_RDWR, S_IRUSR | S_IWUSR | S_IRGRP| S_IROTH);
5237a09cd7Sopenharmony_ci        if (fd < ERR_OK) {
5337a09cd7Sopenharmony_ci            THERMAL_HILOGE(COMP_SVC, "open failed to file. path=%{public}s", filePath.c_str());
5437a09cd7Sopenharmony_ci            return fd;
5537a09cd7Sopenharmony_ci        }
5637a09cd7Sopenharmony_ci        close(fd);
5737a09cd7Sopenharmony_ci    } else {
5837a09cd7Sopenharmony_ci        THERMAL_HILOGI(COMP_SVC, "the file already exists. path=%{public}s", filePath.c_str());
5937a09cd7Sopenharmony_ci    }
6037a09cd7Sopenharmony_ci    return ERR_OK;
6137a09cd7Sopenharmony_ci}
6237a09cd7Sopenharmony_ci
6337a09cd7Sopenharmony_ciint32_t FileOperation::WriteFile(std::string path, std::string buf, size_t size)
6437a09cd7Sopenharmony_ci{
6537a09cd7Sopenharmony_ci    FILE *stream = fopen(path.c_str(), "w+");
6637a09cd7Sopenharmony_ci    if (stream == nullptr) {
6737a09cd7Sopenharmony_ci        return ERR_INVALID_VALUE;
6837a09cd7Sopenharmony_ci    }
6937a09cd7Sopenharmony_ci    size_t ret = fwrite(buf.c_str(), strlen(buf.c_str()), 1, stream);
7037a09cd7Sopenharmony_ci    if (ret == ERR_OK) {
7137a09cd7Sopenharmony_ci        THERMAL_HILOGE(COMP_SVC, "ret=%{public}zu", ret);
7237a09cd7Sopenharmony_ci    }
7337a09cd7Sopenharmony_ci    int32_t state = fseek(stream, 0, SEEK_SET);
7437a09cd7Sopenharmony_ci    if (state != ERR_OK) {
7537a09cd7Sopenharmony_ci        fclose(stream);
7637a09cd7Sopenharmony_ci        return state;
7737a09cd7Sopenharmony_ci    }
7837a09cd7Sopenharmony_ci    state = fclose(stream);
7937a09cd7Sopenharmony_ci    if (state != ERR_OK) {
8037a09cd7Sopenharmony_ci        return state;
8137a09cd7Sopenharmony_ci    }
8237a09cd7Sopenharmony_ci    return ERR_OK;
8337a09cd7Sopenharmony_ci}
8437a09cd7Sopenharmony_ci
8537a09cd7Sopenharmony_ciint32_t FileOperation::ReadFile(const char *path, char *buf, size_t size)
8637a09cd7Sopenharmony_ci{
8737a09cd7Sopenharmony_ci    std::lock_guard<std::mutex> lck(g_mutex);
8837a09cd7Sopenharmony_ci    int32_t ret = -1;
8937a09cd7Sopenharmony_ci
9037a09cd7Sopenharmony_ci    int32_t fd = open(path, O_RDONLY, S_IRUSR | S_IRGRP | S_IROTH);
9137a09cd7Sopenharmony_ci    if (fd < ERR_OK) {
9237a09cd7Sopenharmony_ci        THERMAL_HILOGE(COMP_SVC, "open failed to file.");
9337a09cd7Sopenharmony_ci        return fd;
9437a09cd7Sopenharmony_ci    }
9537a09cd7Sopenharmony_ci
9637a09cd7Sopenharmony_ci    ret = read(fd, buf, size);
9737a09cd7Sopenharmony_ci    if (ret < ERR_OK) {
9837a09cd7Sopenharmony_ci        THERMAL_HILOGE(COMP_SVC, "failed to read file.");
9937a09cd7Sopenharmony_ci        close(fd);
10037a09cd7Sopenharmony_ci        return ret;
10137a09cd7Sopenharmony_ci    }
10237a09cd7Sopenharmony_ci
10337a09cd7Sopenharmony_ci    close(fd);
10437a09cd7Sopenharmony_ci    buf[(size > 0) ? (size - 1) : 0] = '\0';
10537a09cd7Sopenharmony_ci    return ERR_OK;
10637a09cd7Sopenharmony_ci}
10737a09cd7Sopenharmony_ci
10837a09cd7Sopenharmony_ciint32_t FileOperation::ConvertInt(const std::string &value)
10937a09cd7Sopenharmony_ci{
11037a09cd7Sopenharmony_ci    return std::stoi(value);
11137a09cd7Sopenharmony_ci}
11237a09cd7Sopenharmony_ci} // namespace PowerMgr
11337a09cd7Sopenharmony_ci} // namespace OHOS