blob: a98331f60f953c855d0edf43b4d58516473bf012 [file] [log] [blame]
// 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