/
ioutil.go
111 lines (96 loc) · 2.78 KB
/
ioutil.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package agent
import (
"encoding/binary"
"errors"
"io"
"github.com/amitbet/teleporter/logger"
)
func ReadUint32(r io.Reader) (uint32, error) {
var myUint uint32
if err := binary.Read(r, binary.BigEndian, &myUint); err != nil {
return 0, err
}
return myUint, nil
}
func ReadUint8(r io.Reader) (uint8, error) {
var myUint uint8
if err := binary.Read(r, binary.BigEndian, &myUint); err != nil {
return 0, err
}
return myUint, nil
}
func ReadBytes(r io.Reader, count int) ([]byte, error) {
buff := make([]byte, count)
lengthRead, err := io.ReadFull(r, buff)
if lengthRead != count {
logger.Errorf("util.ReadBytes unable to read bytes: lengthRead=%d, countExpected=%d", lengthRead, count)
return nil, errors.New("util.ReadBytes unable to read bytes")
}
if err != nil {
logger.Errorf("util.ReadBytes error while reading bytes: ", err)
return nil, err
}
return buff, nil
}
func ReadString(r io.Reader) (string, error) {
size, err := ReadUint32(r)
if err != nil {
logger.Errorf("util.ReadString error while reading string size: ", err)
return "", err
}
bytes, err := ReadBytes(r, int(size))
if err != nil {
logger.Errorf("util.ReadString error while reading string: ", err)
return "", err
}
return string(bytes), nil
}
func WriteString(w io.Writer, str string) error {
length := uint32(len(str))
err := binary.Write(w, binary.BigEndian, length)
if err != nil {
logger.Errorf("util.WriteString error while writeing string length: ", err)
return err
}
written, err := w.Write([]byte(str))
if err != nil {
logger.Errorf("util.WriteString error while writeing string: ", err)
return err
}
if written != int(length) {
logger.Errorf("util.WriteString error while writeing string: ", err)
return errors.New("util.WriteString error while writeing string: written size too small")
}
return nil
}
func ReadShortString(r io.Reader) (string, error) {
size, err := ReadUint8(r)
if err != nil {
logger.Errorf("util.ReadShortString error while reading string size: ", err)
return "", err
}
bytes, err := ReadBytes(r, int(size))
if err != nil {
logger.Errorf("util.ReadShortString error while reading string: ", err)
return "", err
}
return string(bytes), nil
}
func WriteShortString(w io.Writer, str string) error {
length := uint8(len(str))
err := binary.Write(w, binary.BigEndian, length)
if err != nil {
logger.Errorf("util.WriteShortString error while writeing string length: ", err)
return err
}
written, err := w.Write([]byte(str))
if err != nil {
logger.Errorf("util.WriteShortString error while writeing string: ", err)
return err
}
if written != int(length) {
logger.Errorf("util.WriteShortString error while writeing string: ", err)
return errors.New("util.WriteShortString error while writeing string: written size too small")
}
return nil
}