xref: /dpdk/lib/eal/unix/eal_file.c (revision daa02b5cddbb8e11b31d41e2bf7bb1ae64dcae2f)
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