mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-12-28 13:43:45 +03:00
LibCore: Apply the flags provided to System::pipe2 on all systems
We currently drop the flags on the floor for systems that do not have a pipe2 syscall. Instead, use fcntl to set the flags.
This commit is contained in:
parent
dd271adcf5
commit
40beebca71
Notes:
sideshowbarker
2024-07-17 02:08:15 +09:00
Author: https://github.com/trflynn89 Commit: https://github.com/SerenityOS/serenity/commit/40beebca71 Pull-request: https://github.com/SerenityOS/serenity/pull/23560 Reviewed-by: https://github.com/ADKaster
@ -1563,16 +1563,35 @@ ErrorOr<void> socketpair(int domain, int type, int protocol, int sv[2])
|
||||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<Array<int, 2>> pipe2([[maybe_unused]] int flags)
|
||||
ErrorOr<Array<int, 2>> pipe2(int flags)
|
||||
{
|
||||
Array<int, 2> fds;
|
||||
|
||||
#if defined(__unix__)
|
||||
if (::pipe2(fds.data(), flags) < 0)
|
||||
return Error::from_syscall("pipe2"sv, -errno);
|
||||
#else
|
||||
if (::pipe(fds.data()) < 0)
|
||||
return Error::from_syscall("pipe2"sv, -errno);
|
||||
|
||||
// Ensure we don't leak the fds if any of the system calls below fail.
|
||||
AK::ArmedScopeGuard close_fds { [&]() {
|
||||
MUST(close(fds[0]));
|
||||
MUST(close(fds[1]));
|
||||
} };
|
||||
|
||||
if ((flags & O_CLOEXEC) != 0) {
|
||||
TRY(fcntl(fds[0], F_SETFD, FD_CLOEXEC));
|
||||
TRY(fcntl(fds[1], F_SETFD, FD_CLOEXEC));
|
||||
}
|
||||
if ((flags & O_NONBLOCK) != 0) {
|
||||
TRY(fcntl(fds[0], F_SETFL, TRY(fcntl(fds[0], F_GETFL)) | O_NONBLOCK));
|
||||
TRY(fcntl(fds[1], F_SETFL, TRY(fcntl(fds[1], F_GETFL)) | O_NONBLOCK));
|
||||
}
|
||||
|
||||
close_fds.disarm();
|
||||
#endif
|
||||
|
||||
return fds;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user