eal: introduce internal wrappers for file operations
[dpdk.git] / lib / librte_eal / unix / eal_file.c
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 <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 }