12 #include <sys/types.h>
26 std::unique_ptr<ioHandle::attrDataType> attrData,
27 std::unique_ptr<acl::list> aclData ) {
28 return std::unique_ptr<base::writer>(
new writerGpfs(path, mightAppend,
29 sourceSize, readBlockSize,
37 std::unique_ptr<ioHandle::attrDataType> attrData,
38 std::unique_ptr<acl::list> aclData) {
39 return std::unique_ptr<base::writer>(
new writerGpfs(path,
56 if (truncatedSize > 0) {
59 "can't gpfs_prealloc ", truncatedSize,
" bytes for ",
path);
64 auto& range = fcntl.
buffer.add<gpfsAccessRange_t>(GPFS_ACCESS_RANGE);
66 range.length = sourceSize;
80 std::unique_ptr<ioHandle::attrDataType> aAttrData,
81 std::unique_ptr<acl::list> aAclData):
84 writerPosixFile(aPath, mightAppend, sourceSize, readBlockSize, state, noWrite,
86 std::move(aAclData)) {
93 std::unique_ptr<ioHandle::attrDataType> aAttrData,
94 std::unique_ptr<acl::list> aAclData,
98 writerPosixFile(aPath, noWrite, std::move(aAttrData), std::move(aAclData),handler) {
112 fcntl.
buffer.add<gpfsClearFileCache_t>(GPFS_CLEAR_FILE_CACHE);
114 fcntl.
call(fd, path);
121 leastRecentlyAccessedBlock = b.
offset();
137 auto gpfs_ace = aclHandler.
begin();
138 for (
const auto& rich_ace : aclData->entries) {
139 gpfs_ace->aceType = rich_ace.isAllowedType() ? ACE4_TYPE_ALLOW : ACE4_TYPE_DENY;
140 gpfs_ace->aceFlags = rich_ace.getFlagBits() & (ACE4_FLAG_FILE_INHERIT |
141 ACE4_FLAG_DIR_INHERIT |
142 ACE4_FLAG_NO_PROPAGATE |
143 ACE4_FLAG_INHERIT_ONLY |
145 ACE4_FLAG_INHERITED);
146 gpfs_ace->aceIFlags = 0;
147 gpfs_ace->aceMask = rich_ace.getMaskBits();
149 gpfs_ace->aceIFlags = ACE4_IFLAG_SPECIAL_ID;
150 switch (rich_ace.e_id) {
151 case acl::list::entryType::specialIdType::owner_special_id:
152 gpfs_ace->aceWho = ACE4_SPECIAL_OWNER;
154 case acl::list::entryType::specialIdType::group_special_id:
155 gpfs_ace->aceWho = ACE4_SPECIAL_GROUP;
157 case acl::list::entryType::specialIdType::everyone_special_id:
158 gpfs_ace->aceWho = ACE4_SPECIAL_EVERYONE;
161 throw std::runtime_error(
"illegal special id");
164 gpfs_ace->aceWho = rich_ace.e_id;
168 aclHandler.
set(fd, path);
172 const std::unique_ptr<const genericStat>& readInitialStat,
173 const std::string& toPath,
177 auto lastSlash = fromPath.find_last_of(
'/');
178 auto fromDir = lastSlash == std::string::npos ?
"." : fromPath.substr(0, lastSlash);
179 lastSlash = toPath.find_last_of(
'/');
180 auto toDir = lastSlash == std::string::npos ?
"." : toPath.substr(0, lastSlash);
181 if (fromDir != toDir) {
182 char aclBufferSpace[0x10000];
183 auto aclBuffer =
reinterpret_cast<gpfs_opaque_acl_t*
>(aclBufferSpace);
184 aclBuffer->acl_buffer_len =
sizeof(aclBufferSpace);
186 aclBuffer->acl_type = GPFS_ACL_TYPE_ACCESS;
187 static const std::string pattern(
"/.aclgetXXXXXX");
188 std::vector<char> tmpName;
189 tmpName.reserve(toDir.size() + pattern.size());
190 tmpName.insert(tmpName.end(), toDir.cbegin(), toDir.cend());
191 tmpName.insert(tmpName.end(), pattern.cbegin(), pattern.cend());
192 tmpName.push_back(
'\0');
193 if (readInitialStat->
isDir()) {
195 throwcall::badval(mkdtemp(tmpName.data()),
nullptr,
"can't create tmp dir '", tmpName.data(),
"'");
199 auto fd =
throwcall::badval(mkstemp(tmpName.data()), -1,
"can't create tmp file '", tmpName.data(),
"'");
208 if (readInitialStat->
isDir()) {
210 throwcall::good0(rmdir(tmpName.data()),
"can't remove '", tmpName.data(),
"'");
213 throwcall::good0(unlink(tmpName.data()),
"can't remove '", tmpName.data(),
"'");