1 /*
2  * Copyright (c) 2021-2023 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 "softbus_adapter_file.h"
17 
18 #include <errno.h>
19 #include <fcntl.h>
20 #include <securec.h>
21 #include <sys/stat.h>
22 #include <sys/types.h>
23 #include <unistd.h>
24 
25 #include "comm_log.h"
26 #include "softbus_adapter_errcode.h"
27 #include "softbus_errcode.h"
28 
SoftBusCreateFile(const char * fileName)29 static int32_t SoftBusCreateFile(const char *fileName)
30 {
31     if (fileName == NULL) {
32         return SOFTBUS_FILE_ERR;
33     }
34     char dirPath[SOFTBUS_MAX_PATH_LEN] = {0};
35 
36     char *dir = (char *)fileName;
37     while ((dir = strchr(dir, SOFTBUS_PATH_SEPRATOR)) != NULL) {
38         uint32_t len = (uint32_t)(dir - fileName);
39         if (len == 0) { // skip root
40             dir++;
41             continue;
42         }
43         if (memcpy_s(dirPath, sizeof(dirPath), fileName, len) != EOK) {
44             COMM_LOGE(COMM_ADAPTER, "memory copy dir name failed");
45             return SOFTBUS_ERR;
46         }
47         dirPath[len] = 0;
48         if (access(dirPath, F_OK) != 0) {
49             int32_t ret = mkdir(dirPath, S_IRWXU);
50             if (ret != 0) {
51                 COMM_LOGE(COMM_ADAPTER, "make dir failed, ret=%{public}d", ret);
52                 return SOFTBUS_ERR;
53             }
54         }
55         dir++;
56     }
57     int32_t fd = open(fileName, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
58     if (fd < 0) {
59         COMM_LOGE(COMM_ADAPTER, "create file failed, errno=%{public}d", errno);
60         return SOFTBUS_ERR;
61     }
62     close(fd);
63     return SOFTBUS_OK;
64 }
65 
SoftBusReadFile(int32_t fd,void * readBuf,uint32_t maxLen)66 int32_t SoftBusReadFile(int32_t fd, void *readBuf, uint32_t maxLen)
67 {
68     if (readBuf == NULL) {
69         COMM_LOGE(COMM_ADAPTER, "softbus read file [buff is null]");
70         return SOFTBUS_INVALID_PARAM;
71     }
72     int64_t len = read(fd, readBuf, maxLen);
73     if (len < 0) {
74         COMM_LOGE(COMM_ADAPTER, "softbus read file fail. errno=%{public}s", strerror(errno));
75     }
76     return len;
77 }
78 
ReadFullFile(const char * fileName,char * readBuf,uint32_t maxLen,int32_t * size)79 static int32_t ReadFullFile(const char *fileName, char *readBuf, uint32_t maxLen, int32_t *size)
80 {
81     if (fileName == NULL || readBuf == NULL || maxLen == 0 || size == NULL) {
82         COMM_LOGE(COMM_ADAPTER, "ReadFile fail param is invalid");
83         return SOFTBUS_FILE_ERR;
84     }
85 
86     int32_t fd = open(fileName, O_RDONLY, S_IRUSR | S_IWUSR);
87     if (fd < 0) {
88         COMM_LOGE(COMM_ADAPTER, "ReadFile open file fail, errno=%{public}s", strerror(errno));
89         return SOFTBUS_FILE_ERR;
90     }
91     int32_t fileLen = lseek(fd, 0, SEEK_END);
92     if (fileLen <= 0) {
93         COMM_LOGE(COMM_ADAPTER, "ReadFile len error, fileLen=%{public}d, errno=%{public}s", fileLen, strerror(errno));
94         close(fd);
95         return SOFTBUS_FILE_ERR;
96     }
97     if (fileLen > (int32_t)maxLen) {
98         COMM_LOGE(COMM_ADAPTER, "ReadFile over max len, fileLen=%{public}d, maxLen=%{public}d", fileLen, maxLen);
99         close(fd);
100         return SOFTBUS_FILE_ERR;
101     }
102     int32_t ret = lseek(fd, 0, SEEK_SET);
103     if (ret < 0) {
104         COMM_LOGE(COMM_ADAPTER, "ReadFile lseek file fail, ret=%{public}d, errno=%{public}s", ret, strerror(errno));
105         close(fd);
106         return SOFTBUS_FILE_ERR;
107     }
108     ret = read(fd, readBuf, fileLen);
109     if (ret < 0) {
110         COMM_LOGE(COMM_ADAPTER, "ReadFile read fail, ret=%{public}d, errno=%{public}s", ret, strerror(errno));
111         close(fd);
112         return SOFTBUS_FILE_ERR;
113     }
114     close(fd);
115     *size = fileLen;
116     return SOFTBUS_OK;
117 }
118 
SoftBusReadFullFileAndSize(const char * fileName,char * readBuf,uint32_t maxLen,int32_t * size)119 int32_t SoftBusReadFullFileAndSize(const char *fileName, char *readBuf, uint32_t maxLen, int32_t *size)
120 {
121     return ReadFullFile(fileName, readBuf, maxLen, size);
122 }
123 
SoftBusReadFullFile(const char * fileName,char * readBuf,uint32_t maxLen)124 int32_t SoftBusReadFullFile(const char *fileName, char *readBuf, uint32_t maxLen)
125 {
126     int32_t size = 0;
127     return ReadFullFile(fileName, readBuf, maxLen, &size);
128 }
129 
SoftBusWriteFile(const char * fileName,const char * writeBuf,uint32_t len)130 int32_t SoftBusWriteFile(const char *fileName, const char *writeBuf, uint32_t len)
131 {
132     if (fileName == NULL || writeBuf == NULL || len == 0) {
133         COMM_LOGE(COMM_ADAPTER, "softbus write file para is invalid");
134         return SOFTBUS_FILE_ERR;
135     }
136     if (access(fileName, F_OK) != 0 && SoftBusCreateFile(fileName) != SOFTBUS_OK) {
137         COMM_LOGE(COMM_ADAPTER, "create file fail");
138         return SOFTBUS_FILE_ERR;
139     }
140     int32_t fd = open(fileName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
141     if (fd < 0) {
142         COMM_LOGE(COMM_ADAPTER, "WriteFile open file fail errno=%{public}s", strerror(errno));
143         return SOFTBUS_FILE_ERR;
144     }
145     int32_t ret = write(fd, writeBuf, len);
146     if (len > INT32_MAX || ret != (int32_t)len) {
147         COMM_LOGE(COMM_ADAPTER, "WriteFile write fail, len=%{public}u, ret=%{public}d, errno=%{public}s",
148             len, ret, strerror(errno));
149         close(fd);
150         return SOFTBUS_FILE_ERR;
151     }
152     fsync(fd);
153     close(fd);
154     return SOFTBUS_OK;
155 }
156 
SoftBusWriteFileFd(int32_t fd,const char * writeBuf,uint32_t len)157 int32_t SoftBusWriteFileFd(int32_t fd, const char *writeBuf, uint32_t len)
158 {
159     if (writeBuf == NULL || len == 0) {
160         COMM_LOGE(COMM_ADAPTER, "softbus write file fd para is invalid");
161         return SOFTBUS_FILE_ERR;
162     }
163     int32_t ret = write(fd, writeBuf, len);
164     if (ret != (int32_t)len) {
165         COMM_LOGE(COMM_ADAPTER, "WriteFileFd write fail, len=%{public}u, ret=%{public}d, errno=%{public}s",
166             len, ret, strerror(errno));
167     }
168     return ret;
169 }
170 
SoftBusOpenFile(const char * fileName,int32_t flags)171 int32_t SoftBusOpenFile(const char *fileName, int32_t flags)
172 {
173     if (fileName == NULL) {
174         COMM_LOGE(COMM_ADAPTER, "softbus open file [fileName is null]");
175         return SOFTBUS_INVALID_FD;
176     }
177     int32_t fd = open(fileName, flags);
178     if (fd < 0) {
179         COMM_LOGE(COMM_ADAPTER, "softbus open file [open fail], errno=%{public}s", strerror(errno));
180         return SOFTBUS_INVALID_FD;
181     }
182     return fd;
183 }
184 
SoftBusOpenFileWithPerms(const char * fileName,int32_t flags,int32_t perms)185 int32_t SoftBusOpenFileWithPerms(const char *fileName, int32_t flags, int32_t perms)
186 {
187     if (fileName == NULL) {
188         COMM_LOGE(COMM_ADAPTER, "softbus open with perms file [fileName is null]");
189         return SOFTBUS_INVALID_FD;
190     }
191     int32_t fd = open(fileName, flags, perms);
192     if (fd < 0) {
193         COMM_LOGE(COMM_ADAPTER, "softbus open with perms file [open fail], errno=%{public}s", strerror(errno));
194         return SOFTBUS_INVALID_FD;
195     }
196     return fd;
197 }
198 
SoftBusRemoveFile(const char * fileName)199 void SoftBusRemoveFile(const char *fileName)
200 {
201     if (fileName == NULL) {
202         COMM_LOGE(COMM_ADAPTER, "softbus remove file [fileName is null]");
203         return;
204     }
205     if (remove(fileName) != 0) {
206         COMM_LOGE(COMM_ADAPTER, "softbus remove file fail. errno=%{public}s", strerror(errno));
207         return;
208     }
209 }
210 
SoftBusCloseFile(int32_t fd)211 void SoftBusCloseFile(int32_t fd)
212 {
213     if (fd <= SOFTBUS_INVALID_FD) {
214         COMM_LOGE(COMM_ADAPTER, "softbus close file [fd is invalid]");
215         return;
216     }
217     if (close(fd) != 0) {
218         COMM_LOGE(COMM_ADAPTER, "softbus close file fail. errno=%{public}s", strerror(errno));
219         return;
220     }
221 }
222 
SoftBusPreadFile(int32_t fd,void * buf,uint64_t readBytes,uint64_t offset)223 int64_t SoftBusPreadFile(int32_t fd, void *buf, uint64_t readBytes, uint64_t offset)
224 {
225     if (buf == NULL) {
226         COMM_LOGE(COMM_ADAPTER, "softbus pread file [buff is null]");
227         return SOFTBUS_ERR;
228     }
229     int64_t len = pread(fd, buf, readBytes, offset);
230     if (len < 0) {
231         COMM_LOGE(COMM_ADAPTER, "softbus pread file fail. errno=%{public}s", strerror(errno));
232     }
233     return len;
234 }
235 
SoftBusPwriteFile(int32_t fd,const void * buf,uint64_t writeBytes,uint64_t offset)236 int64_t SoftBusPwriteFile(int32_t fd, const void *buf, uint64_t writeBytes, uint64_t offset)
237 {
238     if (buf == NULL) {
239         COMM_LOGE(COMM_ADAPTER, "softbus pwrite file [buff is null]");
240         return SOFTBUS_ERR;
241     }
242     int64_t len = pwrite(fd, buf, writeBytes, offset);
243     if (len < 0) {
244         COMM_LOGE(COMM_ADAPTER, "softbus pwrite file fail. errno=%{public}s", strerror(errno));
245     }
246     return len;
247 }
248 
SoftBusAccessFile(const char * pathName,int32_t mode)249 int32_t SoftBusAccessFile(const char *pathName, int32_t mode)
250 {
251     if (pathName == NULL) {
252         COMM_LOGE(COMM_ADAPTER, "softbus access path [pathName is null]");
253         return SOFTBUS_ERR;
254     }
255 
256     int32_t ret = access(pathName, mode);
257     if (ret != 0) {
258         COMM_LOGE(COMM_ADAPTER, "softbus access path fail. errno=%{public}s", strerror(errno));
259         return SOFTBUS_ERR;
260     }
261     return SOFTBUS_OK;
262 }
263 
SoftBusMakeDir(const char * pathName,int32_t mode)264 int32_t SoftBusMakeDir(const char *pathName, int32_t mode)
265 {
266     if (pathName == NULL) {
267         COMM_LOGE(COMM_ADAPTER, "softbus mkdir file [pathName is null]");
268         return SOFTBUS_ERR;
269     }
270 
271     int32_t ret = mkdir(pathName, mode);
272     if (ret == 0) {
273         return SOFTBUS_ADAPTER_OK;
274     } else if ((ret == -1) && (errno == EEXIST)) {
275         return SOFTBUS_ADAPTER_FILE_EXIST;
276     } else {
277         return SOFTBUS_ADAPTER_ERR;
278     }
279 }
SoftBusGetFileSize(const char * fileName,uint64_t * fileSize)280 int32_t SoftBusGetFileSize(const char *fileName, uint64_t *fileSize)
281 {
282     if ((fileName == NULL) || (fileSize == NULL)) {
283         COMM_LOGE(COMM_ADAPTER, "softbus mkdir file [fileName or fileSize is null]");
284         return SOFTBUS_ERR;
285     }
286 
287     struct stat statBuff;
288     if (stat(fileName, &statBuff) < 0) {
289         COMM_LOGE(COMM_ADAPTER, "stat file fail");
290         return SOFTBUS_ERR;
291     } else {
292         *fileSize = statBuff.st_size;
293     }
294 
295     return SOFTBUS_OK;
296 }
297 
SoftBusRealPath(const char * path,char * absPath)298 char *SoftBusRealPath(const char *path, char *absPath)
299 {
300     if ((path == NULL) || (absPath == NULL)) {
301         COMM_LOGE(COMM_ADAPTER, "softbus realpath [path or absPath is null]");
302         return NULL;
303     }
304 
305     char *realPath = NULL;
306     if (realpath(path, absPath) == NULL) {
307         COMM_LOGE(COMM_ADAPTER, "realpath failed, errno=%{public}s", strerror(errno));
308         return NULL;
309     } else {
310         realPath = absPath;
311     }
312     return realPath;
313 }
314