1 #ifndef _XRDOSSCSITAGSTOREFILE_H
2 #define _XRDOSSCSITAGSTOREFILE_H
45 XrdOssCsiTagstoreFile(
const std::string &fn, std::unique_ptr<XrdOssDF> fd,
const char *tid) : fn_(fn), fd_(std::move(fd)), trackinglen_(0), isOpen(false), tident_(tid), tident(tident_.c_str()) { }
51 virtual void Flush() ;
54 virtual ssize_t
WriteTags(
const uint32_t *, off_t,
size_t) ;
55 virtual ssize_t
ReadTags(uint32_t *, off_t,
size_t) ;
61 if (!isOpen)
return 0;
67 if (!isOpen)
return 0;
75 if (!isOpen)
return -EBADF;
76 if (size > actualsize_)
80 if (size != trackinglen_)
82 const int wtt = WriteTrackedTagSize(size);
83 if (wtt<0)
return wtt;
90 if (!isOpen)
return false;
97 if (!isOpen)
return -EBADF;
101 return MarshallAndWriteHeader();
108 size_t toread = sz, nread = 0;
109 uint8_t *p = (uint8_t*)buff;
112 const ssize_t rret = fd.
Read(&p[nread], off+nread, toread);
113 if (rret<0)
return rret;
118 if (nread != sz)
return -EDOM;
124 size_t towrite = sz, nwritten = 0;
125 const uint8_t *p = (
const uint8_t*)buff;
128 const ssize_t wret = fd.
Write(&p[nwritten], off+nwritten, towrite);
129 if (wret<0)
return wret;
137 const std::string fn_;
138 std::unique_ptr<XrdOssDF> fd_;
142 const std::string tident_;
149 ssize_t WriteTags_swap(
const uint32_t *, off_t,
size_t);
150 ssize_t ReadTags_swap(uint32_t *, off_t,
size_t);
152 int WriteTrackedTagSize(
const off_t size)
154 if (!isOpen)
return -EBADF;
156 return MarshallAndWriteHeader();
159 int MarshallAndWriteHeader()
161 if (!isOpen)
return -EBADF;
163 uint32_t y = cmagic_;
164 if (fileIsBige_ != machineIsBige_) y = bswap_32(y);
165 memcpy(header_, &y, 4);
167 uint64_t x = trackinglen_;
168 if (fileIsBige_ != machineIsBige_) x = bswap_64(x);
169 memcpy(&header_[4], &x, 8);
172 if (fileIsBige_ != machineIsBige_) y = bswap_32(y);
173 memcpy(&header_[12], &y, 4);
176 if (machineIsBige_ != fileIsBige_) cv = bswap_32(cv);
177 memcpy(&header_[16], &cv, 4);
179 ssize_t wret =
fullwrite(*fd_, header_, 0, 20);
180 if (wret<0)
return wret;
184 static const uint32_t cmagic_ = 0x30544452U;
virtual ssize_t Read(off_t offset, size_t size)
virtual ssize_t Write(const void *buffer, off_t offset, size_t size)
static uint32_t Calc32C(const void *data, size_t count, uint32_t prevcs=0)