xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/core/quic_syscall_wrapper.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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