mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 11:37:35 +00:00
Fix F_DUPFD_CLOEXEC on some systems
This commit is contained in:
parent
a5fa90a21f
commit
c64e7eaf7c
1 changed files with 7 additions and 1 deletions
|
@ -20,12 +20,14 @@
|
||||||
#include "libc/calls/syscall-sysv.internal.h"
|
#include "libc/calls/syscall-sysv.internal.h"
|
||||||
#include "libc/calls/syscall_support-sysv.internal.h"
|
#include "libc/calls/syscall_support-sysv.internal.h"
|
||||||
#include "libc/dce.h"
|
#include "libc/dce.h"
|
||||||
|
#include "libc/errno.h"
|
||||||
#include "libc/intrin/asan.internal.h"
|
#include "libc/intrin/asan.internal.h"
|
||||||
#include "libc/sysv/consts/f.h"
|
#include "libc/sysv/consts/f.h"
|
||||||
|
#include "libc/sysv/consts/o.h"
|
||||||
#include "libc/sysv/errfuns.h"
|
#include "libc/sysv/errfuns.h"
|
||||||
|
|
||||||
int sys_fcntl(int fd, int cmd, uintptr_t arg) {
|
int sys_fcntl(int fd, int cmd, uintptr_t arg) {
|
||||||
int rc;
|
int e, rc;
|
||||||
bool islock;
|
bool islock;
|
||||||
if ((islock = cmd == F_GETLK || //
|
if ((islock = cmd == F_GETLK || //
|
||||||
cmd == F_SETLK || //
|
cmd == F_SETLK || //
|
||||||
|
@ -37,9 +39,13 @@ int sys_fcntl(int fd, int cmd, uintptr_t arg) {
|
||||||
}
|
}
|
||||||
cosmo2flock(arg);
|
cosmo2flock(arg);
|
||||||
}
|
}
|
||||||
|
e = errno;
|
||||||
rc = __sys_fcntl(fd, cmd, arg);
|
rc = __sys_fcntl(fd, cmd, arg);
|
||||||
if (islock) {
|
if (islock) {
|
||||||
flock2cosmo(arg);
|
flock2cosmo(arg);
|
||||||
|
} else if (rc == -1 && cmd == F_DUPFD_CLOEXEC && errno == EINVAL) {
|
||||||
|
errno = e;
|
||||||
|
rc = __fixupnewfd(__sys_fcntl(fd, F_DUPFD, arg), O_CLOEXEC);
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue