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