lokinet/llarp/bootstrap.cpp

72 lines
1.5 KiB
C++
Raw Normal View History

#include "bootstrap.hpp"
#include "util/bencode.hpp"
#include "util/logging.hpp"
2021-09-20 22:40:29 +00:00
#include "util/logging/buffer.hpp"
#include "util/fs.hpp"
namespace llarp
{
void
BootstrapList::Clear()
{
clear();
}
bool
BootstrapList::BDecode(llarp_buffer_t* buf)
{
return bencode_read_list(
[&](llarp_buffer_t* b, bool more) -> bool {
if (more)
{
2021-09-20 22:40:29 +00:00
RouterContact rc{};
if (not rc.BDecode(b))
2021-09-20 22:40:29 +00:00
{
LogError("invalid rc in bootstrap list: ", llarp::buffer_printer{*b});
return false;
2021-09-20 22:40:29 +00:00
}
emplace(std::move(rc));
}
return true;
},
buf);
}
bool
BootstrapList::BEncode(llarp_buffer_t* buf) const
{
return BEncodeWriteList(begin(), end(), buf);
}
void
BootstrapList::AddFromFile(fs::path fpath)
{
bool isListFile = false;
{
std::ifstream inf(fpath.c_str(), std::ios::binary);
if (inf.is_open())
{
const char ch = inf.get();
isListFile = ch == 'l';
}
}
if (isListFile)
{
if (not BDecodeReadFile(fpath, *this))
{
throw std::runtime_error{fmt::format("failed to read bootstrap list file '{}'", fpath)};
}
}
else
{
RouterContact rc;
if (not rc.Read(fpath))
{
throw std::runtime_error{
fmt::format("failed to decode bootstrap RC, file='{}', rc={}", fpath, rc)};
}
this->insert(rc);
}
}
} // namespace llarp