diff options
author | Andreas Rogge <andreas.rogge@bareos.com> | 2022-10-11 14:02:36 +0300 |
---|---|---|
committer | Andreas Rogge <andreas.rogge@bareos.com> | 2022-11-07 19:40:27 +0300 |
commit | 3ee0e4b23c3f5f3b4f3c23c337b62895dcf71126 (patch) | |
tree | 44bf788eedab2bc87f0400fb97189850c2229471 | |
parent | 2c452e1690cec884668ca2f454a8ed72528868f3 (diff) |
stored: remove Device::IsFifo()
This is now implemented via SeekType. The refactored code also catches
some cases when a backend does not override a required method.
-rw-r--r-- | core/src/stored/dev.cc | 110 | ||||
-rw-r--r-- | core/src/stored/dev.h | 3 |
2 files changed, 70 insertions, 43 deletions
diff --git a/core/src/stored/dev.cc b/core/src/stored/dev.cc index a545b5f94..bb989634e 100644 --- a/core/src/stored/dev.cc +++ b/core/src/stored/dev.cc @@ -184,7 +184,7 @@ static void InitiateDevice(JobControlRecord* jcr, Device* dev) dev->vol_poll_interval = 60; } - if (dev->IsFifo()) { dev->SetCap(CAP_STREAM); } + if (dev->GetSeekMode() == SeekMode::NOSEEK) { dev->SetCap(CAP_STREAM); } /* * If the device requires mount : @@ -633,15 +633,25 @@ bool Device::rewind(DeviceControlRecord* dcr) if (fd < 0) { return false; } - if (IsFifo()) { return true; } - - if (d_lseek(dcr, (boffset_t)0, SEEK_SET) < 0) { - BErrNo be; - dev_errno = errno; - Mmsg2(errmsg, _("lseek error on %s. ERR=%s"), print_name(), be.bstrerror()); - return false; + switch (GetSeekMode()) { + case SeekMode::NOSEEK: { + return true; + } break; + case SeekMode::BYTES: { + if (d_lseek(dcr, (boffset_t)0, SEEK_SET) < 0) { + BErrNo be; + dev_errno = errno; + Mmsg2(errmsg, _("lseek error on %s. ERR=%s"), print_name(), + be.bstrerror()); + return false; + } + } break; + case SeekMode::FILE_BLOCK: { + dev_errno = EINVAL; + Mmsg(errmsg, "Block addressed backends must override rewind()."); + return false; + } break; } - return true; } @@ -719,7 +729,6 @@ bool Device::eod(DeviceControlRecord* dcr) bool Device::UpdatePos(DeviceControlRecord* dcr) { boffset_t pos; - bool ok = true; if (!IsOpen()) { dev_errno = EBADF; @@ -728,25 +737,34 @@ bool Device::UpdatePos(DeviceControlRecord* dcr) return false; } - if (IsFifo()) { return true; } - - file = 0; - file_addr = 0; - pos = d_lseek(dcr, (boffset_t)0, SEEK_CUR); - if (pos < 0) { - BErrNo be; - dev_errno = errno; - Pmsg1(000, _("Seek error: ERR=%s\n"), be.bstrerror()); - Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"), print_name(), - be.bstrerror()); - ok = false; - } else { - file_addr = pos; - block_num = (uint32_t)pos; - file = (uint32_t)(pos >> 32); + switch (GetSeekMode()) { + case SeekMode::NOSEEK: { + return true; + } break; + case SeekMode::BYTES: { + file = 0; + file_addr = 0; + pos = d_lseek(dcr, (boffset_t)0, SEEK_CUR); + if (pos < 0) { + BErrNo be; + dev_errno = errno; + Pmsg1(000, _("Seek error: ERR=%s\n"), be.bstrerror()); + Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"), print_name(), + be.bstrerror()); + return false; + } else { + file_addr = pos; + block_num = (uint32_t)pos; + file = (uint32_t)(pos >> 32); + } + } break; + case SeekMode::FILE_BLOCK: { + dev_errno = EINVAL; + Mmsg(errmsg, "Block addressed backends must override UpdatePos()."); + return false; + } break; } - - return ok; + return true; } char* Device::StatusDev() @@ -819,20 +837,30 @@ bool Device::Reposition(DeviceControlRecord* dcr, return false; } - if (IsFifo()) { return true; } - - boffset_t pos = (((boffset_t)rfile) << 32) | rblock; - Dmsg1(100, "===== lseek to %d\n", (int)pos); - if (d_lseek(dcr, pos, SEEK_SET) == (boffset_t)-1) { - BErrNo be; - dev_errno = errno; - Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"), print_name(), - be.bstrerror()); - return false; + switch (GetSeekMode()) { + case SeekMode::NOSEEK: { + return true; + } break; + case SeekMode::BYTES: { + boffset_t pos = (((boffset_t)rfile) << 32) | rblock; + Dmsg1(100, "===== lseek to %d\n", (int)pos); + if (d_lseek(dcr, pos, SEEK_SET) == (boffset_t)-1) { + BErrNo be; + dev_errno = errno; + Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"), print_name(), + be.bstrerror()); + return false; + } + file = rfile; + block_num = rblock; + file_addr = pos; + } break; + case SeekMode::FILE_BLOCK: { + dev_errno = EINVAL; + Mmsg(errmsg, "Block addressed backends must override Reposition()."); + return false; + } break; } - file = rfile; - block_num = rblock; - file_addr = pos; return true; } diff --git a/core/src/stored/dev.h b/core/src/stored/dev.h index 4a47788e6..613caee49 100644 --- a/core/src/stored/dev.h +++ b/core/src/stored/dev.h @@ -177,11 +177,11 @@ enum class SeekMode BYTES // device uses byte offsets (like a plain file) }; +// incomplete list of device types for GuessMissingDeviceTypes() struct DeviceType { static constexpr std::string_view B_DROPLET_DEV = "droplet"; static constexpr std::string_view B_FIFO_DEV = "fifo"; static constexpr std::string_view B_FILE_DEV = "file"; - static constexpr std::string_view B_GFAPI_DEV = "gfapi"; static constexpr std::string_view B_TAPE_DEV = "tape"; static constexpr std::string_view B_UNKNOWN_DEV = ""; }; @@ -299,7 +299,6 @@ class Device { bool RequiresMount() const { return BitIsSet(CAP_REQMOUNT, capabilities); } bool IsRemovable() const { return BitIsSet(CAP_REM, capabilities); } bool IsTape() const { return (dev_type == DeviceType::B_TAPE_DEV); } - bool IsFifo() const { return dev_type == DeviceType::B_FIFO_DEV; } bool IsOpen() const { return fd >= 0; } bool IsOffline() const { return BitIsSet(ST_OFFLINE, state); } bool IsLabeled() const { return BitIsSet(ST_LABEL, state); } |