Merge pull request #583 from peterverraedt/marshal-extended-client

Add SetExtendedAttrs to Client
This commit is contained in:
Cassondra Foesch 2024-04-26 00:54:39 +00:00 committed by GitHub
commit 06342e8b90
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 36 additions and 0 deletions

View File

@ -593,6 +593,20 @@ func (c *Client) Truncate(path string, size int64) error {
return c.setstat(path, sshFileXferAttrSize, uint64(size)) return c.setstat(path, sshFileXferAttrSize, uint64(size))
} }
// SetExtendedData sets extended attributes of the named file. It uses the
// SSH_FILEXFER_ATTR_EXTENDED flag in the setstat request.
//
// This flag provides a general extension mechanism for vendor-specific extensions.
// Names of the attributes should be a string of the format "name@domain", where "domain"
// is a valid, registered domain name and "name" identifies the method. Server
// implementations SHOULD ignore extended data fields that they do not understand.
func (c *Client) SetExtendedData(path string, extended []StatExtended) error {
attrs := &FileStat{
Extended: extended,
}
return c.setstat(path, sshFileXferAttrExtended, attrs)
}
// Open opens the named file for reading. If successful, methods on the // Open opens the named file for reading. If successful, methods on the
// returned file can be used for reading; the associated file descriptor // returned file can be used for reading; the associated file descriptor
// has mode O_RDONLY. // has mode O_RDONLY.
@ -2044,6 +2058,28 @@ func (f *File) Chmod(mode os.FileMode) error {
return f.c.fsetstat(f.handle, sshFileXferAttrPermissions, toChmodPerm(mode)) return f.c.fsetstat(f.handle, sshFileXferAttrPermissions, toChmodPerm(mode))
} }
// SetExtendedData sets extended attributes of the current file. It uses the
// SSH_FILEXFER_ATTR_EXTENDED flag in the setstat request.
//
// This flag provides a general extension mechanism for vendor-specific extensions.
// Names of the attributes should be a string of the format "name@domain", where "domain"
// is a valid, registered domain name and "name" identifies the method. Server
// implementations SHOULD ignore extended data fields that they do not understand.
func (f *File) SetExtendedData(path string, extended []StatExtended) error {
f.mu.RLock()
defer f.mu.RUnlock()
if f.handle == "" {
return os.ErrClosed
}
attrs := &FileStat{
Extended: extended,
}
return f.c.fsetstat(f.handle, sshFileXferAttrExtended, attrs)
}
// Truncate sets the size of the current file. Although it may be safely assumed // Truncate sets the size of the current file. Although it may be safely assumed
// that if the size is less than its current size it will be truncated to fit, // that if the size is less than its current size it will be truncated to fit,
// the SFTP protocol does not specify what behavior the server should do when setting // the SFTP protocol does not specify what behavior the server should do when setting