/
packetAttrs.go
69 lines (61 loc) · 1.32 KB
/
packetAttrs.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package sftpfs
import "encoding/binary"
const (
attrSize = 0x00000001
attrUidgid = 0x00000002
attrPermissions = 0x00000004
attrAcmodtime = 0x00000008
attrExtended = 0x80000000
)
type attrs struct {
Flags uint32
Size uint64
UID uint32
GID uint32
Permissions uint32
Atime uint32
Mtime uint32
Extended [][]string
}
func parseAttrs(data []byte) (attrs, int) {
// see sftp v3 section 5
n := 4
f := binary.BigEndian.Uint32(data)
a := attrs{
Flags: f,
Extended: [][]string{},
}
if f&attrSize != 0 {
a.Size = binary.BigEndian.Uint64(data[n:])
n += 8
}
if f&attrUidgid != 0 {
a.UID = binary.BigEndian.Uint32(data[n:])
n += 4
a.GID = binary.BigEndian.Uint32(data[n:])
n += 4
}
if f&attrPermissions != 0 {
a.Permissions = binary.BigEndian.Uint32(data[n:])
n += 4
}
if f&attrAcmodtime != 0 {
a.Atime = binary.BigEndian.Uint32(data[n:])
n += 4
a.Mtime = binary.BigEndian.Uint32(data[n:])
n += 4
}
if f&attrExtended != 0 {
extendedCount := binary.BigEndian.Uint32(data[n:])
for i := 0; i < int(extendedCount); i++ {
extendedType, sn := parseString(data[n:])
n += sn
extendedData, sn := parseString(data[n:])
n += sn
a.Extended = append(a.Extended, []string{
extendedType, extendedData,
})
}
}
return a, n
}