Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
1// Copyright (c) 2021-present The Bitcoin Core developers2// Distributed under the MIT software license, see the accompanying3// file COPYING or http://www.opensource.org/licenses/mit-license.php.5#include <bitcoin-build-config.h> // IWYU pragma: keep7#include <util/tokenpipe.h>9#ifndef WIN3211#include <cerrno>12#include <optional>14#include <fcntl.h>15#include <sys/types.h>16#include <unistd.h>18TokenPipeEnd TokenPipe::TakeReadEnd()19{20TokenPipeEnd res(m_fds[0]);21m_fds[0] = -1;22return res;23}25TokenPipeEnd TokenPipe::TakeWriteEnd()26{27TokenPipeEnd res(m_fds[1]);28m_fds[1] = -1;29return res;30}32TokenPipeEnd::TokenPipeEnd(int fd) : m_fd(fd)33{34}36TokenPipeEnd::~TokenPipeEnd()37{38Close();39}41int TokenPipeEnd::TokenWrite(uint8_t token)42{43while (true) {44ssize_t result = write(m_fd, &token, 1);45if (result < 0) {46// Failure. It's possible that the write was interrupted by a signal,47// in that case retry.48if (errno != EINTR) {49return TS_ERR;50}51} else if (result == 0) {52return TS_EOS;53} else { // ==154return 0;55}56}57}59int TokenPipeEnd::TokenRead()60{61uint8_t token;62while (true) {63ssize_t result = read(m_fd, &token, 1);64if (result < 0) {65// Failure. Check if the read was interrupted by a signal,66// in that case retry.67if (errno != EINTR) {68return TS_ERR;69}70} else if (result == 0) {71return TS_EOS;72} else { // ==173return token;74}75}76return token;77}79void TokenPipeEnd::Close()80{81if (m_fd != -1) close(m_fd);82m_fd = -1;83}85std::optional<TokenPipe> TokenPipe::Make()86{87int fds[2] = {-1, -1};88#if HAVE_O_CLOEXEC && HAVE_DECL_PIPE289if (pipe2(fds, O_CLOEXEC) != 0) {90return std::nullopt;91}92#else93if (pipe(fds) != 0) {94return std::nullopt;95}96#endif97return TokenPipe(fds);98}100TokenPipe::~TokenPipe()101{102Close();103}105void TokenPipe::Close()106{107if (m_fds[0] != -1) close(m_fds[0]);108if (m_fds[1] != -1) close(m_fds[1]);109m_fds[0] = m_fds[1] = -1;110}112#endif // WIN32