github.com/pkg/sftp@v1.13.6/request-attrs.go (about) 1 package sftp 2 3 // Methods on the Request object to make working with the Flags bitmasks and 4 // Attr(ibutes) byte blob easier. Use Pflags() when working with an Open/Write 5 // request and AttrFlags() and Attributes() when working with SetStat requests. 6 import "os" 7 8 // FileOpenFlags defines Open and Write Flags. Correlate directly with with os.OpenFile flags 9 // (https://golang.org/pkg/os/#pkg-constants). 10 type FileOpenFlags struct { 11 Read, Write, Append, Creat, Trunc, Excl bool 12 } 13 14 func newFileOpenFlags(flags uint32) FileOpenFlags { 15 return FileOpenFlags{ 16 Read: flags&sshFxfRead != 0, 17 Write: flags&sshFxfWrite != 0, 18 Append: flags&sshFxfAppend != 0, 19 Creat: flags&sshFxfCreat != 0, 20 Trunc: flags&sshFxfTrunc != 0, 21 Excl: flags&sshFxfExcl != 0, 22 } 23 } 24 25 // Pflags converts the bitmap/uint32 from SFTP Open packet pflag values, 26 // into a FileOpenFlags struct with booleans set for flags set in bitmap. 27 func (r *Request) Pflags() FileOpenFlags { 28 return newFileOpenFlags(r.Flags) 29 } 30 31 // FileAttrFlags that indicate whether SFTP file attributes were passed. When a flag is 32 // true the corresponding attribute should be available from the FileStat 33 // object returned by Attributes method. Used with SetStat. 34 type FileAttrFlags struct { 35 Size, UidGid, Permissions, Acmodtime bool 36 } 37 38 func newFileAttrFlags(flags uint32) FileAttrFlags { 39 return FileAttrFlags{ 40 Size: (flags & sshFileXferAttrSize) != 0, 41 UidGid: (flags & sshFileXferAttrUIDGID) != 0, 42 Permissions: (flags & sshFileXferAttrPermissions) != 0, 43 Acmodtime: (flags & sshFileXferAttrACmodTime) != 0, 44 } 45 } 46 47 // AttrFlags returns a FileAttrFlags boolean struct based on the 48 // bitmap/uint32 file attribute flags from the SFTP packaet. 49 func (r *Request) AttrFlags() FileAttrFlags { 50 return newFileAttrFlags(r.Flags) 51 } 52 53 // FileMode returns the Mode SFTP file attributes wrapped as os.FileMode 54 func (a FileStat) FileMode() os.FileMode { 55 return os.FileMode(a.Mode) 56 } 57 58 // Attributes parses file attributes byte blob and return them in a 59 // FileStat object. 60 func (r *Request) Attributes() *FileStat { 61 fs, _ := unmarshalFileStat(r.Flags, r.Attrs) 62 return fs 63 }