1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2020 Dmitry Kozlyuk 3 */ 4 5 #include <sys/file.h> 6 #include <fcntl.h> 7 #include <unistd.h> 8 9 #include <rte_errno.h> 10 11 #include "eal_private.h" 12 13 int 14 eal_file_open(const char *path, int flags) 15 { 16 static const int MODE_MASK = EAL_OPEN_READONLY | EAL_OPEN_READWRITE; 17 18 int ret, sys_flags; 19 20 switch (flags & MODE_MASK) { 21 case EAL_OPEN_READONLY: 22 sys_flags = O_RDONLY; 23 break; 24 case EAL_OPEN_READWRITE: 25 sys_flags = O_RDWR; 26 break; 27 default: 28 rte_errno = ENOTSUP; 29 return -1; 30 } 31 32 if (flags & EAL_OPEN_CREATE) 33 sys_flags |= O_CREAT; 34 35 ret = open(path, sys_flags, 0600); 36 if (ret < 0) 37 rte_errno = errno; 38 39 return ret; 40 } 41 42 int 43 eal_file_truncate(int fd, ssize_t size) 44 { 45 int ret; 46 47 ret = ftruncate(fd, size); 48 if (ret) 49 rte_errno = errno; 50 51 return ret; 52 } 53 54 int 55 eal_file_lock(int fd, enum eal_flock_op op, enum eal_flock_mode mode) 56 { 57 int sys_flags = 0; 58 int ret; 59 60 if (mode == EAL_FLOCK_RETURN) 61 sys_flags |= LOCK_NB; 62 63 switch (op) { 64 case EAL_FLOCK_EXCLUSIVE: 65 sys_flags |= LOCK_EX; 66 break; 67 case EAL_FLOCK_SHARED: 68 sys_flags |= LOCK_SH; 69 break; 70 case EAL_FLOCK_UNLOCK: 71 sys_flags |= LOCK_UN; 72 break; 73 } 74 75 ret = flock(fd, sys_flags); 76 if (ret) 77 rte_errno = errno; 78 79 return ret; 80 } 81