Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/bareos/bareos.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Rogge <andreas.rogge@bareos.com>2022-10-11 14:02:36 +0300
committerAndreas Rogge <andreas.rogge@bareos.com>2022-11-07 19:40:27 +0300
commit3ee0e4b23c3f5f3b4f3c23c337b62895dcf71126 (patch)
tree44bf788eedab2bc87f0400fb97189850c2229471
parent2c452e1690cec884668ca2f454a8ed72528868f3 (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.cc110
-rw-r--r--core/src/stored/dev.h3
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); }