mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-14 06:59:10 +00:00
Fix fadvise() on Windows
This commit is contained in:
parent
adac64a52b
commit
e1a40783da
5 changed files with 24 additions and 8 deletions
|
@ -21,6 +21,7 @@
|
|||
#include "libc/calls/syscall_support-nt.internal.h"
|
||||
#include "libc/intrin/spinlock.h"
|
||||
#include "libc/nt/createfile.h"
|
||||
#include "libc/nt/enum/fileflagandattributes.h"
|
||||
#include "libc/nt/files.h"
|
||||
#include "libc/nt/runtime.h"
|
||||
#include "libc/sysv/consts/madv.h"
|
||||
|
@ -32,11 +33,13 @@ textwindows int sys_fadvise_nt(int fd, uint64_t offset, uint64_t len,
|
|||
int64_t h1, h2;
|
||||
int rc, flags, mode;
|
||||
uint32_t perm, share, attr;
|
||||
|
||||
if (!__isfdkind(fd, kFdFile)) return ebadf();
|
||||
h1 = g_fds.p[fd].handle;
|
||||
mode = g_fds.p[fd].mode;
|
||||
flags = g_fds.p[fd].flags;
|
||||
flags &= ~(O_SEQUENTIAL | O_RANDOM);
|
||||
|
||||
switch (advice) {
|
||||
case MADV_NORMAL:
|
||||
break;
|
||||
|
@ -50,7 +53,17 @@ textwindows int sys_fadvise_nt(int fd, uint64_t offset, uint64_t len,
|
|||
default:
|
||||
return einval();
|
||||
}
|
||||
if (GetNtOpenFlags(flags, mode, &perm, &share, 0, &attr) == -1) return -1;
|
||||
|
||||
if (GetNtOpenFlags(flags, mode, &perm, &share, 0, &attr) == -1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// MSDN says only these are allowed, otherwise it returns EINVAL.
|
||||
attr &= kNtFileFlagBackupSemantics | kNtFileFlagDeleteOnClose |
|
||||
kNtFileFlagNoBuffering | kNtFileFlagOpenNoRecall |
|
||||
kNtFileFlagOpenReparsePoint | kNtFileFlagOverlapped |
|
||||
kNtFileFlagPosixSemantics | kNtFileFlagRandomAccess |
|
||||
kNtFileFlagSequentialScan | kNtFileFlagWriteThrough;
|
||||
|
||||
__fds_lock();
|
||||
if ((h2 = ReOpenFile(h1, perm, share, attr)) != -1) {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#ifndef COSMOPOLITAN_LIBC_CALLS_STATE_INTERNAL_H_
|
||||
#define COSMOPOLITAN_LIBC_CALLS_STATE_INTERNAL_H_
|
||||
#include "libc/intrin/spinlock.h"
|
||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
|
@ -12,7 +13,7 @@ hidden extern unsigned __sighandflags[NSIG];
|
|||
hidden extern const struct NtSecurityAttributes kNtIsInheritable;
|
||||
|
||||
void __fds_lock(void);
|
||||
void __fds_unlock(void);
|
||||
#define __fds_unlock() _spunlock(&__fds_lock_obj)
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue