diff --git a/ESP32/disk_backend_esp32.cpp b/ESP32/disk_backend_esp32.cpp index b207d24..fdc33c5 100644 --- a/ESP32/disk_backend_esp32.cpp +++ b/ESP32/disk_backend_esp32.cpp @@ -1,4 +1,4 @@ -// (C) 2018-2023 by Folkert van Heusden +// (C) 2018-2024 by Folkert van Heusden // Released under MIT license #include @@ -9,6 +9,8 @@ #include "log.h" +static SdFat sd; + disk_backend_esp32::disk_backend_esp32(const std::string & filename) : filename(filename), fh(new File32()) @@ -22,10 +24,16 @@ disk_backend_esp32::~disk_backend_esp32() delete fh; } +void disk_backend_esp32::emit_error() +{ + DOLOG(ll_error, true, "SdFat error: %d/%d", sd.sdErrorCode(), sd.sdErrorData()); +} + bool disk_backend_esp32::begin() { if (!fh->open(filename.c_str(), O_RDWR)) { DOLOG(ll_error, true, "rk05: cannot open \"%s\"", filename.c_str()); + emit_error(); return false; } @@ -41,13 +49,18 @@ bool disk_backend_esp32::read(const off_t offset, const size_t n, uint8_t *const digitalWrite(LED_BUILTIN, LOW); #endif - if (!fh->seek(offset)) + if (!fh->seek(offset)) { DOLOG(ll_error, true, "seek error %s", strerror(errno)); + emit_error(); + return false; + } yield(); - if (fh->read(target, n) != size_t(n)) { - DOLOG(debug, true, "fread error: %s", strerror(errno)); + ssize_t rc = fh->read(target, n); + if (size_t(rc) != n) { + DOLOG(ll_error, true, "fread error: %s (%zd/%zu)", strerror(errno), rc, n); + emit_error(); #if defined(ESP32) && !defined(SHA2017) digitalWrite(LED_BUILTIN, HIGH); @@ -72,13 +85,18 @@ bool disk_backend_esp32::write(const off_t offset, const size_t n, const uint8_t digitalWrite(LED_BUILTIN, LOW); #endif - if (!fh->seek(offset)) + if (!fh->seek(offset)) { DOLOG(ll_error, true, "seek error %s", strerror(errno)); + emit_error(); + return false; + } yield(); - if (fh->write(from, n) != n) { - DOLOG(ll_error, true, "RK05 fwrite error %s", strerror(errno)); + ssize_t rc = fh->write(from, n); + if (size_t(rc) != n) { + DOLOG(ll_error, true, "RK05 fwrite error %s (%zd/%zu)", strerror(errno), rc, n); + emit_error(); #if defined(ESP32) && !defined(SHA2017) digitalWrite(LED_BUILTIN, HIGH); diff --git a/ESP32/disk_backend_esp32.h b/ESP32/disk_backend_esp32.h index 6313665..c24ae51 100644 --- a/ESP32/disk_backend_esp32.h +++ b/ESP32/disk_backend_esp32.h @@ -1,4 +1,4 @@ -// (C) 2018-2023 by Folkert van Heusden +// (C) 2018-2024 by Folkert van Heusden // Released under MIT license #include @@ -17,6 +17,8 @@ private: const std::string filename; File32 *const fh { nullptr }; + void emit_error(); + public: disk_backend_esp32(const std::string & filename); virtual ~disk_backend_esp32(); diff --git a/disk_backend_file.cpp b/disk_backend_file.cpp index 2b6e625..328075a 100644 --- a/disk_backend_file.cpp +++ b/disk_backend_file.cpp @@ -1,4 +1,4 @@ -// (C) 2018-2023 by Folkert van Heusden +// (C) 2018-2024 by Folkert van Heusden // Released under MIT license #include @@ -44,7 +44,7 @@ bool disk_backend_file::read(const off_t offset, const size_t n, uint8_t *const #else ssize_t rc = pread(fd, target, n, offset); if (rc != ssize_t(n)) { - DOLOG(debug, false, "disk_backend_file::read: read failure. expected %zu bytes, got %zd", n, rc); + DOLOG(warning, false, "disk_backend_file::read: read failure. expected %zu bytes, got %zd", n, rc); return false; } @@ -62,6 +62,12 @@ bool disk_backend_file::write(const off_t offset, const size_t n, const uint8_t return ::write(fd, from, n) == ssize_t(n); #else - return pwrite(fd, from, n, offset) == ssize_t(n); + ssize_t rc = pwrite(fd, from, n, offset); + if (rc != ssize_t(n)) { + DOLOG(warning, false, "disk_backend_file::write: write failure. expected %zu bytes, got %zd", n, rc); + return false; + } + + return true; #endif } diff --git a/disk_backend_nbd.cpp b/disk_backend_nbd.cpp index 56c7799..3067bc7 100644 --- a/disk_backend_nbd.cpp +++ b/disk_backend_nbd.cpp @@ -1,4 +1,4 @@ -// (C) 2018-2023 by Folkert van Heusden +// (C) 2018-2024 by Folkert van Heusden // Released under MIT license #include @@ -115,14 +115,14 @@ bool disk_backend_nbd::connect(const bool retry) if (READ(fd, reinterpret_cast(&nbd_hello), sizeof nbd_hello) != sizeof nbd_hello) { close(fd); fd = -1; - DOLOG(debug, false, "disk_backend_nbd::connect: connect short read"); + DOLOG(warning, true, "disk_backend_nbd::connect: connect short read"); } } if (memcmp(nbd_hello.magic1, "NBDMAGIC", 8) != 0) { close(fd); fd = -1; - DOLOG(debug, false, "disk_backend_nbd::connect: magic invalid"); + DOLOG(warning, true, "disk_backend_nbd::connect: magic invalid"); } DOLOG(info, false, "NBD size: %u", NTOHLL(nbd_hello.size)); @@ -141,7 +141,7 @@ bool disk_backend_nbd::read(const off_t offset, const size_t n, uint8_t *const t do { if (fd == -1 && !connect(true)) { - DOLOG(debug, false, "disk_backend_nbd::read: (re-)connect"); + DOLOG(warning, true, "disk_backend_nbd::read: (re-)connect"); sleep(1); continue; } @@ -160,7 +160,7 @@ bool disk_backend_nbd::read(const off_t offset, const size_t n, uint8_t *const t nbd_request.length = htonl(n); if (WRITE(fd, reinterpret_cast(&nbd_request), sizeof nbd_request) != sizeof nbd_request) { - DOLOG(debug, false, "disk_backend_nbd::read: problem sending request"); + DOLOG(warning, true, "disk_backend_nbd::read: problem sending request"); close(fd); fd = -1; sleep(1); @@ -174,7 +174,7 @@ bool disk_backend_nbd::read(const off_t offset, const size_t n, uint8_t *const t } nbd_reply; if (READ(fd, reinterpret_cast(&nbd_reply), sizeof nbd_reply) != sizeof nbd_reply) { - DOLOG(debug, false, "disk_backend_nbd::read: problem receiving reply header"); + DOLOG(warning, true, "disk_backend_nbd::read: problem receiving reply header"); close(fd); fd = -1; sleep(1); @@ -182,7 +182,7 @@ bool disk_backend_nbd::read(const off_t offset, const size_t n, uint8_t *const t } if (ntohl(nbd_reply.magic) != 0x67446698) { - DOLOG(debug, false, "disk_backend_nbd::read: bad reply header %08x", nbd_reply.magic); + DOLOG(warning, true, "disk_backend_nbd::read: bad reply header %08x", nbd_reply.magic); close(fd); fd = -1; sleep(1); @@ -191,12 +191,12 @@ bool disk_backend_nbd::read(const off_t offset, const size_t n, uint8_t *const t int error = ntohl(nbd_reply.error); if (error) { - DOLOG(debug, false, "disk_backend_nbd::read: NBD server indicated error: %d", error); + DOLOG(warning, true, "disk_backend_nbd::read: NBD server indicated error: %d", error); return false; } if (READ(fd, reinterpret_cast(target), n) != ssize_t(n)) { - DOLOG(debug, false, "disk_backend_nbd::read: problem receiving payload"); + DOLOG(warning, true, "disk_backend_nbd::read: problem receiving payload"); close(fd); fd = -1; sleep(1); @@ -217,7 +217,7 @@ bool disk_backend_nbd::write(const off_t offset, const size_t n, const uint8_t * do { if (!connect(true)) { - DOLOG(debug, false, "disk_backend_nbd::write: (re-)connect"); + DOLOG(warning, true, "disk_backend_nbd::write: (re-)connect"); sleep(1); continue; } @@ -236,7 +236,7 @@ bool disk_backend_nbd::write(const off_t offset, const size_t n, const uint8_t * nbd_request.length = htonl(n); if (WRITE(fd, reinterpret_cast(&nbd_request), sizeof nbd_request) != sizeof nbd_request) { - DOLOG(debug, false, "disk_backend_nbd::write: problem sending request"); + DOLOG(warning, true, "disk_backend_nbd::write: problem sending request"); close(fd); fd = -1; sleep(1); @@ -244,7 +244,7 @@ bool disk_backend_nbd::write(const off_t offset, const size_t n, const uint8_t * } if (WRITE(fd, reinterpret_cast(from), n) != ssize_t(n)) { - DOLOG(debug, false, "disk_backend_nbd::write: problem sending payload"); + DOLOG(warning, true, "disk_backend_nbd::write: problem sending payload"); close(fd); fd = -1; sleep(1); @@ -258,7 +258,7 @@ bool disk_backend_nbd::write(const off_t offset, const size_t n, const uint8_t * } nbd_reply; if (READ(fd, reinterpret_cast(&nbd_reply), sizeof nbd_reply) != sizeof nbd_reply) { - DOLOG(debug, false, "disk_backend_nbd::write: problem receiving reply header"); + DOLOG(warning, true, "disk_backend_nbd::write: problem receiving reply header"); close(fd); fd = -1; sleep(1); @@ -266,7 +266,7 @@ bool disk_backend_nbd::write(const off_t offset, const size_t n, const uint8_t * } if (ntohl(nbd_reply.magic) != 0x67446698) { - DOLOG(debug, false, "disk_backend_nbd::write: bad reply header %08x", nbd_reply.magic); + DOLOG(warning, true, "disk_backend_nbd::write: bad reply header %08x", nbd_reply.magic); close(fd); fd = -1; sleep(1); @@ -275,7 +275,7 @@ bool disk_backend_nbd::write(const off_t offset, const size_t n, const uint8_t * int error = ntohl(nbd_reply.error); if (error) { - DOLOG(debug, false, "disk_backend_nbd::write: NBD server indicated error: %d", error); + DOLOG(warning, true, "disk_backend_nbd::write: NBD server indicated error: %d", error); return false; } }