diff --git a/src/ioslaves/file/file_unix.cpp b/src/ioslaves/file/file_unix.cpp --- a/src/ioslaves/file/file_unix.cpp +++ b/src/ioslaves/file/file_unix.cpp @@ -393,6 +393,62 @@ } } + // copy xattrs of file +#if HAVE_SYS_XATTR_H + // get size of key list + #if defined(Q_OS_LINUX) || (defined(__GLIBC__) && !defined(__stub_getxattr)) + ssize_t buflen = listxattr(_src.data(), nullptr, 0); + #elif defined(Q_OS_MAC) + ssize_t buflen = listxattr(_src.data(), NULL, 0, 0); + #elif defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD) + ssize_t buflen = extattr_list_file(_src.data(), EXTATTR_NAMESPACE_USER, NULL, 0); + #endif + // bufflen > 0 if file have xattr + if (buflen > 0) { + QByteArray buf(buflen, Qt::Uninitialized); + // get the key list + #if defined(Q_OS_LINUX) || (defined(__GLIBC__) && !defined(__stub_getxattr)) + buflen = listxattr(_src.data(), buf.data(), buflen); + #elif defined(Q_OS_MAC) + buflen = listxattr(_src.data(), buf.data(), buflen, 0); + #elif defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD) + buflen = extattr_list_file(_src.data(), EXTATTR_NAMESPACE_USER, buf.data(), buflen); + #endif + + QList xattr_keys = buf.split('\0'); + for (int i = 0; i < xattr_keys.size() -1; i++) { // the last item is empty + auto key = xattr_keys[i].data(); + // get the size of value for key + #if defined(Q_OS_LINUX) || (defined(__GLIBC__) && !defined(__stub_getxattr)) + ssize_t vallen = getxattr(_src.data(), key, NULL, 0); + #elif defined(Q_OS_MAC) + ssize_t vallen = listxattr(_src.data(), key, NULL, 0, 0, 0); + #elif defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD) + ssize_t vallen = extattr_get_file(_src.data(), EXTATTR_NAMESPACE_USER, key, NULL, 0); + #endif + QByteArray val(vallen, Qt::Uninitialized); + //get the value of the key + #if defined(Q_OS_LINUX) || (defined(__GLIBC__) && !defined(__stub_getxattr)) + vallen = getxattr(_src.data(), key, val.data(), vallen); + #elif defined(Q_OS_MAC) + vallen = getxattr(_src.data(), key, val.data(), vallen, 0, 0); + #elif defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD) + vallen = extattr_get_file(_src.data(), EXTATTR_NAMESPACE_USER, key, val.data(), vallen); + #endif + + //write key:value pair on dest file + #if defined(Q_OS_LINUX) || (defined(__GLIBC__) && !defined(__stub_getxattr)) + ssize_t destlen = setxattr(_dest.data(), key, val.data(), vallen, 0); + #elif defined(Q_OS_MAC) + ssize_t destlen = setxattr(_dest.data(), key, val.data(), vallen, 0, 0); + #elif defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD) + ssize_t destlen = extattr_set_file(_dest.data(), EXTATTR_NAMESPACE_USER, key, val.data(), vallen); + #endif + //qDebug() << key << val.data(); + } + } +#endif + processedSize(buff_src.st_size); finished(); }