| // Copyright (c) 2019 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "net/third_party/quiche/src/quic/core/quic_syscall_wrapper.h" | |
| #include <atomic> | |
| #include <cerrno> | |
| namespace quic { | |
| namespace { | |
| std::atomic<QuicSyscallWrapper*> global_syscall_wrapper(new QuicSyscallWrapper); | |
| } // namespace | |
| ssize_t QuicSyscallWrapper::Sendmsg(int sockfd, const msghdr* msg, int flags) { | |
| return ::sendmsg(sockfd, msg, flags); | |
| } | |
| int QuicSyscallWrapper::Sendmmsg(int sockfd, | |
| mmsghdr* msgvec, | |
| unsigned int vlen, | |
| int flags) { | |
| #if defined(__linux__) && !defined(__ANDROID__) | |
| return ::sendmmsg(sockfd, msgvec, vlen, flags); | |
| #else | |
| errno = ENOSYS; | |
| return -1; | |
| #endif | |
| } | |
| QuicSyscallWrapper* GetGlobalSyscallWrapper() { | |
| return global_syscall_wrapper.load(); | |
| } | |
| void SetGlobalSyscallWrapper(QuicSyscallWrapper* wrapper) { | |
| global_syscall_wrapper.store(wrapper); | |
| } | |
| ScopedGlobalSyscallWrapperOverride::ScopedGlobalSyscallWrapperOverride( | |
| QuicSyscallWrapper* wrapper_in_scope) | |
| : original_wrapper_(GetGlobalSyscallWrapper()) { | |
| SetGlobalSyscallWrapper(wrapper_in_scope); | |
| } | |
| ScopedGlobalSyscallWrapperOverride::~ScopedGlobalSyscallWrapperOverride() { | |
| SetGlobalSyscallWrapper(original_wrapper_); | |
| } | |
| } // namespace quic |