in sshd-sftp/src/main/java/org/apache/sshd/sftp/common/SftpHelper.java [279:341]
public static <B extends Buffer> B writeAttrsV4(B buffer, int version, Map<String, ?> attributes) {
ValidateUtils.checkTrue(version >= SftpConstants.SFTP_V4, "Illegal version: %d", version);
boolean isReg = getBool((Boolean) attributes.get(IoUtils.REGFILE_VIEW_ATTR));
boolean isDir = getBool((Boolean) attributes.get(IoUtils.DIRECTORY_VIEW_ATTR));
boolean isLnk = getBool((Boolean) attributes.get(IoUtils.SYMLINK_VIEW_ATTR));
@SuppressWarnings("unchecked")
Collection<PosixFilePermission> perms = (Collection<PosixFilePermission>) attributes.get(IoUtils.PERMISSIONS_VIEW_ATTR);
Number size = (Number) attributes.get(IoUtils.SIZE_VIEW_ATTR);
FileTime lastModifiedTime = (FileTime) attributes.get(IoUtils.LASTMOD_TIME_VIEW_ATTR);
FileTime lastAccessTime = (FileTime) attributes.get(IoUtils.LASTACC_TIME_VIEW_ATTR);
FileTime creationTime = (FileTime) attributes.get(IoUtils.CREATE_TIME_VIEW_ATTR);
@SuppressWarnings("unchecked")
Collection<AclEntry> acl = (Collection<AclEntry>) attributes.get(IoUtils.ACL_VIEW_ATTR);
Map<?, ?> extensions = (Map<?, ?>) attributes.get(IoUtils.EXTENDED_VIEW_ATTR);
int flags = (((isReg || isLnk) && (size != null)) ? SftpConstants.SSH_FILEXFER_ATTR_SIZE : 0)
| ((attributes.containsKey(IoUtils.OWNER_VIEW_ATTR) && attributes.containsKey(IoUtils.GROUP_VIEW_ATTR))
? SftpConstants.SSH_FILEXFER_ATTR_OWNERGROUP : 0)
| ((perms != null) ? SftpConstants.SSH_FILEXFER_ATTR_PERMISSIONS : 0)
| ((lastModifiedTime != null) ? SftpConstants.SSH_FILEXFER_ATTR_MODIFYTIME : 0)
| ((creationTime != null) ? SftpConstants.SSH_FILEXFER_ATTR_CREATETIME : 0)
| ((lastAccessTime != null) ? SftpConstants.SSH_FILEXFER_ATTR_ACCESSTIME : 0)
| ((acl != null) ? SftpConstants.SSH_FILEXFER_ATTR_ACL : 0)
| ((extensions != null) ? SftpConstants.SSH_FILEXFER_ATTR_EXTENDED : 0);
buffer.putInt(flags);
buffer.putByte((byte) (isReg ? SftpConstants.SSH_FILEXFER_TYPE_REGULAR
: isDir ? SftpConstants.SSH_FILEXFER_TYPE_DIRECTORY
: isLnk ? SftpConstants.SSH_FILEXFER_TYPE_SYMLINK
: SftpConstants.SSH_FILEXFER_TYPE_UNKNOWN));
if ((flags & SftpConstants.SSH_FILEXFER_ATTR_SIZE) != 0) {
buffer.putLong(size.longValue());
}
if ((flags & SftpConstants.SSH_FILEXFER_ATTR_OWNERGROUP) != 0) {
buffer.putString(
Objects.toString(attributes.get(IoUtils.OWNER_VIEW_ATTR), SftpUniversalOwnerAndGroup.Owner.getName()));
buffer.putString(
Objects.toString(attributes.get(IoUtils.GROUP_VIEW_ATTR), SftpUniversalOwnerAndGroup.Group.getName()));
}
if ((flags & SftpConstants.SSH_FILEXFER_ATTR_PERMISSIONS) != 0) {
buffer.putInt(attributesToPermissions(isReg, isDir, isLnk, perms));
}
if ((flags & SftpConstants.SSH_FILEXFER_ATTR_ACCESSTIME) != 0) {
buffer = writeTime(buffer, version, flags, lastAccessTime);
}
if ((flags & SftpConstants.SSH_FILEXFER_ATTR_CREATETIME) != 0) {
buffer = writeTime(buffer, version, flags, creationTime);
}
if ((flags & SftpConstants.SSH_FILEXFER_ATTR_MODIFYTIME) != 0) {
buffer = writeTime(buffer, version, flags, lastModifiedTime);
}
if ((flags & SftpConstants.SSH_FILEXFER_ATTR_ACL) != 0) {
buffer = writeACLs(buffer, version, acl);
}
// TODO: ctime
// TODO: bits
if ((flags & SftpConstants.SSH_FILEXFER_ATTR_EXTENDED) != 0) {
buffer = writeExtensions(buffer, extensions);
}
return buffer;
}