File: send_h.go

package info (click to toggle)
golang-github-dennwc-btrfs 0.0~git20221026.3097362-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 312 kB
  • sloc: makefile: 4; sh: 4
file content (225 lines) | stat: -rw-r--r-- 3,133 bytes parent folder | download | duplicates (2)
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
package send

import (
	"encoding/binary"
	"io"
	"strconv"
)

var sendEndianess = binary.LittleEndian

const (
	sendStreamMagic     = "btrfs-stream\x00"
	sendStreamMagicSize = len(sendStreamMagic)
	sendStreamVersion   = 1
)

const (
	sendBufSize  = 64 * 1024
	sendReadSize = 48 * 1024
)

const cmdHeaderSize = 10

type cmdHeader struct {
	Len uint32 // len excluding the header
	Cmd CmdType
	Crc uint32 // crc including the header with zero crc field
}

func (h *cmdHeader) Size() int { return cmdHeaderSize }
func (h *cmdHeader) Unmarshal(p []byte) error {
	if len(p) < cmdHeaderSize {
		return io.ErrUnexpectedEOF
	}
	h.Len = sendEndianess.Uint32(p[0:])
	h.Cmd = CmdType(sendEndianess.Uint16(p[4:]))
	h.Crc = sendEndianess.Uint32(p[6:])
	return nil
}

const tlvHeaderSize = 4

type tlvHeader struct {
	Type uint16
	Len  uint16 // len excluding the header
}

func (h *tlvHeader) Size() int { return tlvHeaderSize }
func (h *tlvHeader) Unmarshal(p []byte) error {
	if len(p) < tlvHeaderSize {
		return io.ErrUnexpectedEOF
	}
	h.Type = sendEndianess.Uint16(p[0:])
	h.Len = sendEndianess.Uint16(p[2:])
	return nil
}

type CmdType uint16

func (c CmdType) String() string {
	var name string
	if int(c) < len(cmdTypeNames) {
		name = cmdTypeNames[int(c)]
	}
	if name != "" {
		return name
	}
	return strconv.FormatInt(int64(c), 16)
}

var cmdTypeNames = []string{
	"<zero>",

	"subvol",
	"snapshot",

	"mkfile",
	"mkdir",
	"mknod",
	"mkfifo",
	"mksock",
	"symlink",

	"rename",
	"link",
	"unlink",
	"rmdir",

	"set_xattr",
	"remove_xattr",

	"write",
	"clone",

	"truncate",
	"chmod",
	"chown",
	"utimes",

	"end",
	"update_extent",
	"<max>",
}

const (
	sendCmdUnspec = CmdType(iota)

	sendCmdSubvol
	sendCmdSnapshot

	sendCmdMkfile
	sendCmdMkdir
	sendCmdMknod
	sendCmdMkfifo
	sendCmdMksock
	sendCmdSymlink

	sendCmdRename
	sendCmdLink
	sendCmdUnlink
	sendCmdRmdir

	sendCmdSetXattr
	sendCmdRemoveXattr

	sendCmdWrite
	sendCmdClone

	sendCmdTruncate
	sendCmdChmod
	sendCmdChown
	sendCmdUtimes

	sendCmdEnd
	sendCmdUpdateExtent
	_sendCmdMax
)

const sendCmdMax = _sendCmdMax - 1

type sendCmdAttr uint16

func (c sendCmdAttr) String() string {
	var name string
	if int(c) < len(sendAttrNames) {
		name = sendAttrNames[int(c)]
	}
	if name != "" {
		return name
	}
	return strconv.FormatInt(int64(c), 16)
}

const (
	sendAttrUnspec = sendCmdAttr(iota)

	sendAttrUuid
	sendAttrCtransid

	sendAttrIno
	sendAttrSize
	sendAttrMode
	sendAttrUid
	sendAttrGid
	sendAttrRdev
	sendAttrCtime
	sendAttrMtime
	sendAttrAtime
	sendAttrOtime

	sendAttrXattrName
	sendAttrXattrData

	sendAttrPath
	sendAttrPathTo
	sendAttrPathLink

	sendAttrFileOffset
	sendAttrData

	sendAttrCloneUuid
	sendAttrCloneCtransid
	sendAttrClonePath
	sendAttrCloneOffset
	sendAttrCloneLen

	_sendAttrMax
)
const sendAttrMax = _sendAttrMax - 1

var sendAttrNames = []string{
	"<zero>",

	"uuid",
	"ctransid",

	"ino",
	"size",
	"mode",
	"uid",
	"gid",
	"rdev",
	"ctime",
	"mtime",
	"atime",
	"otime",

	"xattrname",
	"xattrdata",

	"path",
	"pathto",
	"pathlink",

	"fileoffset",
	"data",

	"cloneuuid",
	"clonectransid",
	"clonepath",
	"cloneoffset",
	"clonelen",

	"<max>",
}