From 0814039fdfe4b6422d41ab59ca1424e56034f5fe Mon Sep 17 00:00:00 2001 From: Peter Verraedt Date: Thu, 13 Jul 2023 17:15:31 +0200 Subject: [PATCH 1/2] Add SetExtendedData to Client Add function to set extended attributes in the sftp client. Signed-off-by: Peter Verraedt Add longer comment Signed-off-by: Peter Verraedt --- client.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/client.go b/client.go index 3a9a8bf1..95413a5c 100644 --- a/client.go +++ b/client.go @@ -593,6 +593,20 @@ func (c *Client) Truncate(path string, size int64) error { 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 // returned file can be used for reading; the associated file descriptor // has mode O_RDONLY. From 478aa2e956f5dcff3611295dd97e05b8fbecd864 Mon Sep 17 00:00:00 2001 From: Peter Verraedt Date: Thu, 25 Apr 2024 16:20:01 +0200 Subject: [PATCH 2/2] Add fsetstat variant of SetExtendedData Signed-off-by: Peter Verraedt --- client.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/client.go b/client.go index 95413a5c..dd037597 100644 --- a/client.go +++ b/client.go @@ -2058,6 +2058,28 @@ func (f *File) Chmod(mode os.FileMode) error { 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 // 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