xref: /dpdk/lib/eal/unix/eal_file.c (revision 30a1de105a5f40d77b344a891c4a68f79e815c43)
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
eal_file_open(const char * path,int flags)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
eal_file_truncate(int fd,ssize_t size)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
eal_file_lock(int fd,enum eal_flock_op op,enum eal_flock_mode mode)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