| // 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 "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 |