* Copyright 2005-2009, Ingo Weinhold, ingo_weinhold@gmx.de.
* Copyright 2016, Axel DΓΆrfler, axeld@pinc-software.de.
* Distributed under the terms of the MIT License.
*/
#include "AttributeUtilities.h"
#include <fs_attr.h>
#include <Node.h>
#include <StorageDefs.h>
static const int kCopyBufferSize = 64 * 1024;
namespace BPrivate {
status_t
CopyAttributes(BNode& source, BNode& destination)
{
char attrName[B_ATTR_NAME_LENGTH];
while (source.GetNextAttrName(attrName) == B_OK) {
attr_info attrInfo;
status_t status = source.GetAttrInfo(attrName, &attrInfo);
if (status != B_OK)
return status;
char buffer[kCopyBufferSize];
off_t offset = 0;
off_t bytesLeft = attrInfo.size;
do {
size_t toRead = kCopyBufferSize;
if ((off_t)toRead > bytesLeft)
toRead = bytesLeft;
ssize_t bytesRead = source.ReadAttr(attrName, attrInfo.type,
offset, buffer, toRead);
if (bytesRead < 0)
return bytesRead;
ssize_t bytesWritten = destination.WriteAttr(attrName,
attrInfo.type, offset, buffer, bytesRead);
if (bytesWritten < 0)
return bytesWritten;
bytesLeft -= bytesRead;
offset += bytesRead;
} while (bytesLeft > 0);
}
return B_OK;
}
}