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