1 // Copyright (c) 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "quiche/quic/core/quic_syscall_wrapper.h"
6
7 #include <atomic>
8 #include <cerrno>
9
10 namespace quic {
11 namespace {
12 std::atomic<QuicSyscallWrapper*> global_syscall_wrapper(new QuicSyscallWrapper);
13 } // namespace
14
Sendmsg(int sockfd,const msghdr * msg,int flags)15 ssize_t QuicSyscallWrapper::Sendmsg(int sockfd, const msghdr* msg, int flags) {
16 return ::sendmsg(sockfd, msg, flags);
17 }
18
Sendmmsg(int sockfd,mmsghdr * msgvec,unsigned int vlen,int flags)19 int QuicSyscallWrapper::Sendmmsg(int sockfd, mmsghdr* msgvec, unsigned int vlen,
20 int flags) {
21 #if defined(__linux__) && !defined(__ANDROID__)
22 return ::sendmmsg(sockfd, msgvec, vlen, flags);
23 #else
24 errno = ENOSYS;
25 return -1;
26 #endif
27 }
28
GetGlobalSyscallWrapper()29 QuicSyscallWrapper* GetGlobalSyscallWrapper() {
30 return global_syscall_wrapper.load();
31 }
32
SetGlobalSyscallWrapper(QuicSyscallWrapper * wrapper)33 void SetGlobalSyscallWrapper(QuicSyscallWrapper* wrapper) {
34 global_syscall_wrapper.store(wrapper);
35 }
36
ScopedGlobalSyscallWrapperOverride(QuicSyscallWrapper * wrapper_in_scope)37 ScopedGlobalSyscallWrapperOverride::ScopedGlobalSyscallWrapperOverride(
38 QuicSyscallWrapper* wrapper_in_scope)
39 : original_wrapper_(GetGlobalSyscallWrapper()) {
40 SetGlobalSyscallWrapper(wrapper_in_scope);
41 }
42
~ScopedGlobalSyscallWrapperOverride()43 ScopedGlobalSyscallWrapperOverride::~ScopedGlobalSyscallWrapperOverride() {
44 SetGlobalSyscallWrapper(original_wrapper_);
45 }
46
47 } // namespace quic
48