/
sequence.go
53 lines (42 loc) · 1 KB
/
sequence.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
package snmp
import (
"bytes"
"io"
)
// Sequence represents an SNMP SEQUENCE.
type Sequence []DataType
// Encode encodes a Sequence with the proper header.
func (s Sequence) Encode() ([]byte, error) {
buf := &bytes.Buffer{}
for _, entry := range s {
encodedEntry, err := entry.Encode()
if err != nil {
return nil, err
}
_, err = buf.Write(encodedEntry)
if err != nil {
return nil, err
}
}
seqLength := buf.Len()
return append(encodeHeaderSequence(0x30, seqLength), buf.Bytes()...), nil
}
// decodeSequence decodes a sequence up to length bytes from r.
// It returns the SNMP data type, the number of bytes read, and an error.
func decodeSequence(length int, r io.Reader) (Sequence, int, error) {
seq := Sequence{}
seqBytes := 0
bytesRead := 0
for seqBytes < length {
item, read, err := decode(r)
if read > 0 && item != nil {
seq = append(seq, item)
bytesRead += read
seqBytes += read
}
if err != nil {
return nil, bytesRead, err
}
}
return seq, bytesRead, nil
}