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