From f61d49c98fcc4574b01dca3bca45a3a6372545b9 Mon Sep 17 00:00:00 2001 From: folkert van heusden Date: Wed, 22 Mar 2023 07:33:08 +0100 Subject: [PATCH] connect --- ESP32/disk_backend_nbd.cpp | 1 + ESP32/disk_backend_nbd.h | 1 + disk_backend_nbd.cpp | 79 +++++++++++++++++++++++++++++++------- disk_backend_nbd.h | 6 +-- 4 files changed, 70 insertions(+), 17 deletions(-) create mode 120000 ESP32/disk_backend_nbd.cpp create mode 120000 ESP32/disk_backend_nbd.h diff --git a/ESP32/disk_backend_nbd.cpp b/ESP32/disk_backend_nbd.cpp new file mode 120000 index 0000000..2a6ef58 --- /dev/null +++ b/ESP32/disk_backend_nbd.cpp @@ -0,0 +1 @@ +../disk_backend_nbd.cpp \ No newline at end of file diff --git a/ESP32/disk_backend_nbd.h b/ESP32/disk_backend_nbd.h new file mode 120000 index 0000000..722191b --- /dev/null +++ b/ESP32/disk_backend_nbd.h @@ -0,0 +1 @@ +../disk_backend_nbd.h \ No newline at end of file diff --git a/disk_backend_nbd.cpp b/disk_backend_nbd.cpp index 2ad6e30..0210ca8 100644 --- a/disk_backend_nbd.cpp +++ b/disk_backend_nbd.cpp @@ -1,12 +1,15 @@ #include #include +#include #include "disk_backend_nbd.h" #include "log.h" #ifdef ESP32 +#include #include #else +#include #include #endif @@ -24,30 +27,73 @@ disk_backend_nbd::~disk_backend_nbd() bool disk_backend_nbd::begin() { - addrinfo *res = nullptr; - - addrinfo hints { 0 }; - hints.ai_family = AF_INET; - hints.ai_socktype = SOCK_STREAM; - - char port_str[8] { 0 }; - snprintf(port_str, sizeof port_str, "%d", port); - - int rc = getaddrinfo(host.c_str(), port_str, &hints, &res); - - if (rc != 0) { - DOLOG(ll_error, true, "disk_backend_nbd: cannot resolve \"%s\":%s: %s", host.c_str(), port_str, gai_strerror(rc)); - + if (!connect(false)) { + DOLOG(ll_error, true, "disk_backend_nbd: cannot connect to NBD server"); return false; } + DOLOG(info, true, "disk_backend_nbd: connected to NBD server"); + return true; } +bool disk_backend_nbd::connect(const bool retry) +{ + do { + // LOOP until connected, logging message, exponential backoff? + addrinfo *res = nullptr; + + addrinfo hints { 0 }; + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + + char port_str[8] { 0 }; + snprintf(port_str, sizeof port_str, "%d", port); + + int rc = getaddrinfo(host.c_str(), port_str, &hints, &res); + + if (rc != 0) { +#ifdef ESP32 + DOLOG(ll_error, true, "disk_backend_nbd: cannot resolve \"%s\":%s", host.c_str(), port_str); +#else + DOLOG(ll_error, true, "disk_backend_nbd: cannot resolve \"%s\":%s: %s", host.c_str(), port_str, gai_strerror(rc)); +#endif + + sleep(1); + + continue; + } + + for(addrinfo *p = res; p != NULL; p = p->ai_next) { + if ((fd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { + continue; + } + + if (::connect(fd, p->ai_addr, p->ai_addrlen) == -1) { + close(fd); + fd = -1; + DOLOG(ll_error, true, "disk_backend_nbd: cannot connect"); + continue; + } + + break; + } + + freeaddrinfo(res); + } + while(fd == -1 && retry); + + return fd != -1; +} + bool disk_backend_nbd::read(const off_t offset, const size_t n, uint8_t *const target) { DOLOG(debug, false, "disk_backend_nbd::read: read %zu bytes from offset %zu", n, offset); + connect(true); + + // TODO: loop dat als read() aangeeft dat de peer weg is, dat er dan gereconnect wordt + // anders return false return pread(fd, target, n, offset) == ssize_t(n); } @@ -55,5 +101,10 @@ bool disk_backend_nbd::write(const off_t offset, const size_t n, const uint8_t * { DOLOG(debug, false, "disk_backend_nbd::write: write %zu bytes to offset %zu", n, offset); + connect(true); + + // TODO: loop dat als write() aangeeft dat de peer weg is, dat er dan gereconnect wordt + // anders return false + return pwrite(fd, from, n, offset) == ssize_t(n); } diff --git a/disk_backend_nbd.h b/disk_backend_nbd.h index a86b89f..b5d4129 100644 --- a/disk_backend_nbd.h +++ b/disk_backend_nbd.h @@ -1,6 +1,4 @@ -#include #include -#include #include #include "disk_backend.h" @@ -10,9 +8,11 @@ class disk_backend_nbd : public disk_backend { private: const std::string host; - const int port; + const int port { 0 }; int fd { -1 }; + bool connect(const bool retry); + public: disk_backend_nbd(const std::string & host, const int port); virtual ~disk_backend_nbd();