1/*
2 * Copyright (c) 2020 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 "utils_file.h"
17#include <securec.h>
18#include "hal_file.h"
19#include "ohos_errno.h"
20#include "ohos_types.h"
21
22#include <stdbool.h>
23
24#define BUFFER_SIZE 128
25
26int UtilsFileOpen(const char* path, int oflag, int mode)
27{
28    return HalFileOpen(path, oflag, mode);
29}
30
31int UtilsFileClose(int fd)
32{
33    return HalFileClose(fd);
34}
35
36int UtilsFileRead(int fd, char* buf, unsigned int len)
37{
38    return HalFileRead(fd, buf, len);
39}
40
41int UtilsFileWrite(int fd, const char* buf, unsigned int len)
42{
43    return HalFileWrite(fd, buf, len);
44}
45
46int UtilsFileDelete(const char* path)
47{
48    return HalFileDelete(path);
49}
50
51int UtilsFileStat(const char* path, unsigned int* fileSize)
52{
53    return HalFileStat(path, fileSize);
54}
55
56int UtilsFileSeek(int fd, int offset, unsigned int whence)
57{
58    return HalFileSeek(fd, offset, whence);
59}
60
61int UtilsFileCopy(const char* src, const char* dest)
62{
63    if ((src == NULL) || (dest == NULL)) {
64        return EC_FAILURE;
65    }
66    int fpSrc = UtilsFileOpen(src, O_RDONLY_FS, 0);
67    if (fpSrc < 0) {
68        return fpSrc;
69    }
70    int fpDest = UtilsFileOpen(dest, O_RDWR_FS | O_CREAT_FS | O_TRUNC_FS, 0);
71    if (fpDest < 0) {
72        UtilsFileClose(fpSrc);
73        return fpDest;
74    }
75    bool copyFailed = true;
76    int nLen;
77    char* dataBuf = (char *)malloc(BUFFER_SIZE);
78    if (dataBuf == NULL) {
79        goto MALLOC_ERROR;
80    }
81    nLen = UtilsFileRead(fpSrc, dataBuf, BUFFER_SIZE);
82    while (nLen > 0) {
83        if (UtilsFileWrite(fpDest, dataBuf, nLen) != nLen) {
84            goto EXIT;
85        }
86        nLen = UtilsFileRead(fpSrc, dataBuf, BUFFER_SIZE);
87    }
88    copyFailed = (nLen < 0);
89
90EXIT:
91    free(dataBuf);
92MALLOC_ERROR:
93    UtilsFileClose(fpSrc);
94    UtilsFileClose(fpDest);
95    if (copyFailed) {
96        UtilsFileDelete(dest);
97        return EC_FAILURE;
98    }
99    return EC_SUCCESS;
100}
101
102int UtilsFileMove(const char* src, const char* dest)
103{
104    int ret = UtilsFileCopy(src, dest);
105    if (ret == EC_SUCCESS) {
106        ret = UtilsFileDelete(src);
107    }
108    return ret;
109}
110