XRootD
Loading...
Searching...
No Matches
XrdOssMirageXAttr.cc
Go to the documentation of this file.
2#include "XrdVersion.hh"
3
4#include <algorithm>
5#include <stdexcept>
6#include <string_view>
7
8using namespace std::literals;
9
11
12extern "C"
13{
14 XrdSysXAttr* XrdSysGetXAttrObject(XrdSysError *errP, const char *config_fn, const char *parms)
15 {
16 return new XrdOssMirageXAttr();
17 }
18}
19
20int XrdOssMirageXAttr::Del(const char *Aname, const char *Path, int fd)
21{
22 if (this->oss == nullptr)
23 return -ENOTSUP;
24
25 const auto opt = oss->get_entry_write(Path);
26 if (!opt.has_value())
27 return -EINVAL;
28
29 auto entry = opt.value();
30
31 const std::string_view name{Aname};
32
33 if (name == "U.open.return_code"sv)
34 entry->open.return_code = {};
35 else if (name == "U.close.return_code"sv)
36 entry->close.return_code = {};
37 else if (name == "U.read.return_code"sv)
38 entry->read.return_code = {};
39 else if (name == "U.read.return_position"sv)
40 entry->read.return_position = {};
41 else if (name == "U.write.return_code"sv)
42 entry->write.return_code = {};
43 else if (name == "U.write.return_position"sv)
44 entry->write.return_position = {};
45 else if (name == "U.pattern"sv)
46 entry->pattern = {};
47 else
48 return -EINVAL;
49
50 return 0;
51}
52
54{
55}
56
57int XrdOssMirageXAttr::Get(const char *Aname, void *Aval, int Avsz, const char *Path, int fd)
58{
59 if (this->oss == nullptr)
60 return -ENOTSUP;
61
62 const auto opt = oss->get_entry_read(Path);
63 if (!opt.has_value())
64 return -EINVAL;
65
66 const auto entry = opt.value();
67
68 const std::string_view name{Aname};
69 std::string value{};
70
71 if (name == "U.open.return_code"sv)
72 value = std::to_string(entry.open.return_code);
73 else if (name == "U.close.return_code"sv)
74 value = std::to_string(entry.close.return_code);
75 else if (name == "U.read.return_code"sv)
76 value = std::to_string(entry.read.return_code);
77 else if (name == "U.read.return_position"sv)
78 value = std::to_string(entry.read.return_position);
79 else if (name == "U.write.return_code"sv)
80 value = std::to_string(entry.write.return_code);
81 else if (name == "U.write.return_position"sv)
82 value = std::to_string(entry.write.return_position);
83 else if (name == "U.pattern"sv)
84 value = entry.pattern;
85 else
86 return -EINVAL;
87
88 const int num_bytes = std::min(static_cast<std::size_t>(Avsz), value.size());
89 std::copy_n(value.begin(), num_bytes, static_cast<char *>(Aval));
90
91 return num_bytes;
92}
93
94int XrdOssMirageXAttr::List(AList **aPL, const char *Path, int fd, int getSz)
95{
96 return -ENOTSUP;
97}
98
99int XrdOssMirageXAttr::Set(const char *Aname, const void *Aval, int Avsz, const char *Path, int fd, int isNew)
100{
101 if (this->oss == nullptr)
102 return -ENOTSUP;
103
104 const auto opt = oss->get_entry_write(Path);
105 if (!opt.has_value())
106 return -EINVAL;
107
108 auto entry = opt.value();
109
110 const std::string_view name{Aname};
111 const std::string value(static_cast<const char *>(Aval), Avsz);
112
113 try
114 {
115 constexpr static auto parse_return_code = [](auto value) {
116
117 auto code = std::stoi(value);
118 if (code < 0)
119 throw std::invalid_argument("return code is negative");
120
121 return code;
122 };
123
124 constexpr static auto parse_return_position = [](auto value) {
125
126 auto position = std::stoll(value);
127 if (position < 0)
128 throw std::invalid_argument("return position is negative");
129 if (static_cast<std::uint64_t>(position) > XrdOssMirageEntry::max_file_size)
130 throw std::invalid_argument("return position is greater than the max file size");
131
132 return position;
133 };
134
135 if (name == "U.open.return_code"sv)
136 entry->open.return_code = parse_return_code(value);
137 else if (name == "U.close.return_code"sv)
138 entry->close.return_code = parse_return_code(value);
139 else if (name == "U.read.return_code"sv)
140 entry->read.return_code = parse_return_code(value);
141 else if (name == "U.read.return_position"sv)
142 entry->read.return_position = parse_return_position(value);
143 else if (name == "U.write.return_code"sv)
144 entry->write.return_code = parse_return_code(value);
145 else if (name == "U.write.return_position"sv)
146 entry->write.return_position = parse_return_position(value);
147 else if (name == "U.pattern"sv)
148 entry->pattern = value;
149 else
150 return -EINVAL;
151 }
152 catch(std::out_of_range &)
153 {
154 return -ERANGE;
155 }
156 catch(std::invalid_argument &)
157 {
158 return -EINVAL;
159 }
160
161 return 0;
162}
163
165{
166 if (this->oss == nullptr)
167 this->oss = &oss;
168}
XrdVERSIONINFO(XrdClGetPlugIn, XrdClGetPlugIn) extern "C"
XrdSysXAttr * XrdSysGetXAttrObject(XrdSysError *errP, const char *config_fn, const char *parms)
XrdOucString Path
void setOss(XrdOssMirage &oss)
virtual int Get(const char *Aname, void *Aval, int Avsz, const char *Path, int fd=-1) override
virtual int Del(const char *Aname, const char *Path, int fd=-1) override
XrdOssMirageXAttr()=default
virtual void Free(AList *aPL) override
virtual int List(AList **aPL, const char *Path, int fd=-1, int getSz=0) override
virtual int Set(const char *Aname, const void *Aval, int Avsz, const char *Path, int fd=-1, int isNew=0) override
static constexpr std::uint64_t max_file_size