1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2020 Dmitry Kozlyuk
10 #include "eal_private.h"
11 #include "eal_windows.h"
14 eal_file_open(const char *path, int flags)
16 static const int MODE_MASK = EAL_OPEN_READONLY | EAL_OPEN_READWRITE;
18 int fd, ret, sys_flags;
20 switch (flags & MODE_MASK) {
21 case EAL_OPEN_READONLY:
22 sys_flags = _O_RDONLY;
24 case EAL_OPEN_READWRITE:
32 if (flags & EAL_OPEN_CREATE)
33 sys_flags |= _O_CREAT;
35 ret = _sopen_s(&fd, path, sys_flags, _SH_DENYNO, _S_IWRITE);
45 eal_file_truncate(int fd, ssize_t size)
49 LONG low = (LONG)((size_t)size);
50 LONG high = (LONG)((size_t)size >> 32);
52 handle = (HANDLE)_get_osfhandle(fd);
53 if (handle == INVALID_HANDLE_VALUE) {
58 ret = SetFilePointer(handle, low, &high, FILE_BEGIN);
59 if (ret == INVALID_SET_FILE_POINTER) {
60 RTE_LOG_WIN32_ERR("SetFilePointer()");
69 lock_file(HANDLE handle, enum eal_flock_op op, enum eal_flock_mode mode)
72 OVERLAPPED overlapped;
74 if (op == EAL_FLOCK_EXCLUSIVE)
75 sys_flags |= LOCKFILE_EXCLUSIVE_LOCK;
76 if (mode == EAL_FLOCK_RETURN)
77 sys_flags |= LOCKFILE_FAIL_IMMEDIATELY;
79 memset(&overlapped, 0, sizeof(overlapped));
80 if (!LockFileEx(handle, sys_flags, 0, 0, 0, &overlapped)) {
81 if ((sys_flags & LOCKFILE_FAIL_IMMEDIATELY) &&
82 (GetLastError() == ERROR_IO_PENDING)) {
83 rte_errno = EWOULDBLOCK;
85 RTE_LOG_WIN32_ERR("LockFileEx()");
95 unlock_file(HANDLE handle)
97 if (!UnlockFileEx(handle, 0, 0, 0, NULL)) {
98 RTE_LOG_WIN32_ERR("UnlockFileEx()");
106 eal_file_lock(int fd, enum eal_flock_op op, enum eal_flock_mode mode)
108 HANDLE handle = (HANDLE)_get_osfhandle(fd);
110 if (handle == INVALID_HANDLE_VALUE) {
116 case EAL_FLOCK_EXCLUSIVE:
117 case EAL_FLOCK_SHARED:
118 return lock_file(handle, op, mode);
119 case EAL_FLOCK_UNLOCK:
120 return unlock_file(handle);