55 if ((Oflag & O_ACCMODE) == O_RDONLY)
57 const auto opt = oss.get_entry_read(path);
61 entry_storage = opt.value();
62 entry = &std::get<XrdOssMirageEntry>(entry_storage);
66 const auto opt = oss.get_entry_write(path);
70 entry_storage = opt.value();
71 entry = &*std::get<XrdOssMirageEntryPtr>(entry_storage);
74 if (entry->open.return_code !=
XrdOssOK)
75 return -entry->open.return_code;
107 if (offset < 0 ||
static_cast<uint64_t
>(offset) > entry->size)
110 if (entry->read.return_code !=
XrdOssOK &&
111 entry->read.return_position >=
static_cast<std::uint64_t
>(offset) &&
112 entry->read.return_position -
static_cast<std::uint64_t
>(offset) <= size)
113 return -entry->read.return_code;
115 const std::size_t num_bytes =
static_cast<std::size_t
>(std::min<std::uint64_t>(size, entry->size - offset));
117 if (entry->pattern.size() == 1)
118 std::fill_n(
static_cast<char *
>(buffer), num_bytes, entry->pattern.front());
120 if (entry->pattern.size() > 1)
122 std::call_once(pattern_buffer_once, [
this, size] () {
123 while (pattern_buffer.size() < size)
124 pattern_buffer.insert(pattern_buffer.end(), entry->pattern.begin(), entry->pattern.end());
127 const std::size_t start = offset % entry->pattern.size();
128 const std::size_t first_chunk = std::min(num_bytes, pattern_buffer.size() - start);
130 char *out =
static_cast<char *
>(buffer);
131 std::copy(pattern_buffer.begin() + start, pattern_buffer.begin() + start + first_chunk, out);
132 if (first_chunk < num_bytes)
133 std::copy(pattern_buffer.begin(), pattern_buffer.begin() + (num_bytes - first_chunk), out + first_chunk);
static constexpr std::uint64_t max_file_size