github.com/dennwc/btrfs@v0.0.0-20221026161108-3097362dc072/send/send_h.go (about) 1 package send 2 3 import ( 4 "encoding/binary" 5 "io" 6 "strconv" 7 ) 8 9 var sendEndianess = binary.LittleEndian 10 11 const ( 12 sendStreamMagic = "btrfs-stream\x00" 13 sendStreamMagicSize = len(sendStreamMagic) 14 sendStreamVersion = 1 15 ) 16 17 const ( 18 sendBufSize = 64 * 1024 19 sendReadSize = 48 * 1024 20 ) 21 22 const cmdHeaderSize = 10 23 24 type cmdHeader struct { 25 Len uint32 // len excluding the header 26 Cmd CmdType 27 Crc uint32 // crc including the header with zero crc field 28 } 29 30 func (h *cmdHeader) Size() int { return cmdHeaderSize } 31 func (h *cmdHeader) Unmarshal(p []byte) error { 32 if len(p) < cmdHeaderSize { 33 return io.ErrUnexpectedEOF 34 } 35 h.Len = sendEndianess.Uint32(p[0:]) 36 h.Cmd = CmdType(sendEndianess.Uint16(p[4:])) 37 h.Crc = sendEndianess.Uint32(p[6:]) 38 return nil 39 } 40 41 const tlvHeaderSize = 4 42 43 type tlvHeader struct { 44 Type uint16 45 Len uint16 // len excluding the header 46 } 47 48 func (h *tlvHeader) Size() int { return tlvHeaderSize } 49 func (h *tlvHeader) Unmarshal(p []byte) error { 50 if len(p) < tlvHeaderSize { 51 return io.ErrUnexpectedEOF 52 } 53 h.Type = sendEndianess.Uint16(p[0:]) 54 h.Len = sendEndianess.Uint16(p[2:]) 55 return nil 56 } 57 58 type CmdType uint16 59 60 func (c CmdType) String() string { 61 var name string 62 if int(c) < len(cmdTypeNames) { 63 name = cmdTypeNames[int(c)] 64 } 65 if name != "" { 66 return name 67 } 68 return strconv.FormatInt(int64(c), 16) 69 } 70 71 var cmdTypeNames = []string{ 72 "<zero>", 73 74 "subvol", 75 "snapshot", 76 77 "mkfile", 78 "mkdir", 79 "mknod", 80 "mkfifo", 81 "mksock", 82 "symlink", 83 84 "rename", 85 "link", 86 "unlink", 87 "rmdir", 88 89 "set_xattr", 90 "remove_xattr", 91 92 "write", 93 "clone", 94 95 "truncate", 96 "chmod", 97 "chown", 98 "utimes", 99 100 "end", 101 "update_extent", 102 "<max>", 103 } 104 105 const ( 106 sendCmdUnspec = CmdType(iota) 107 108 sendCmdSubvol 109 sendCmdSnapshot 110 111 sendCmdMkfile 112 sendCmdMkdir 113 sendCmdMknod 114 sendCmdMkfifo 115 sendCmdMksock 116 sendCmdSymlink 117 118 sendCmdRename 119 sendCmdLink 120 sendCmdUnlink 121 sendCmdRmdir 122 123 sendCmdSetXattr 124 sendCmdRemoveXattr 125 126 sendCmdWrite 127 sendCmdClone 128 129 sendCmdTruncate 130 sendCmdChmod 131 sendCmdChown 132 sendCmdUtimes 133 134 sendCmdEnd 135 sendCmdUpdateExtent 136 _sendCmdMax 137 ) 138 139 const sendCmdMax = _sendCmdMax - 1 140 141 type sendCmdAttr uint16 142 143 func (c sendCmdAttr) String() string { 144 var name string 145 if int(c) < len(sendAttrNames) { 146 name = sendAttrNames[int(c)] 147 } 148 if name != "" { 149 return name 150 } 151 return strconv.FormatInt(int64(c), 16) 152 } 153 154 const ( 155 sendAttrUnspec = sendCmdAttr(iota) 156 157 sendAttrUuid 158 sendAttrCtransid 159 160 sendAttrIno 161 sendAttrSize 162 sendAttrMode 163 sendAttrUid 164 sendAttrGid 165 sendAttrRdev 166 sendAttrCtime 167 sendAttrMtime 168 sendAttrAtime 169 sendAttrOtime 170 171 sendAttrXattrName 172 sendAttrXattrData 173 174 sendAttrPath 175 sendAttrPathTo 176 sendAttrPathLink 177 178 sendAttrFileOffset 179 sendAttrData 180 181 sendAttrCloneUuid 182 sendAttrCloneCtransid 183 sendAttrClonePath 184 sendAttrCloneOffset 185 sendAttrCloneLen 186 187 _sendAttrMax 188 ) 189 const sendAttrMax = _sendAttrMax - 1 190 191 var sendAttrNames = []string{ 192 "<zero>", 193 194 "uuid", 195 "ctransid", 196 197 "ino", 198 "size", 199 "mode", 200 "uid", 201 "gid", 202 "rdev", 203 "ctime", 204 "mtime", 205 "atime", 206 "otime", 207 208 "xattrname", 209 "xattrdata", 210 211 "path", 212 "pathto", 213 "pathlink", 214 215 "fileoffset", 216 "data", 217 218 "cloneuuid", 219 "clonectransid", 220 "clonepath", 221 "cloneoffset", 222 "clonelen", 223 224 "<max>", 225 }