a geicko-2 based round robin ranking system designed to test c++ battleship submissions
battleship.dunkirk.sh
1package sshfx
2
3// Attributes related flags.
4const (
5 AttrSize = 1 << iota // SSH_FILEXFER_ATTR_SIZE
6 AttrUIDGID // SSH_FILEXFER_ATTR_UIDGID
7 AttrPermissions // SSH_FILEXFER_ATTR_PERMISSIONS
8 AttrACModTime // SSH_FILEXFER_ACMODTIME
9
10 AttrExtended = 1 << 31 // SSH_FILEXFER_ATTR_EXTENDED
11)
12
13// Attributes defines the file attributes type defined in draft-ietf-secsh-filexfer-02
14//
15// Defined in: https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-02.txt#section-5
16type Attributes struct {
17 Flags uint32
18
19 // AttrSize
20 Size uint64
21
22 // AttrUIDGID
23 UID uint32
24 GID uint32
25
26 // AttrPermissions
27 Permissions FileMode
28
29 // AttrACmodTime
30 ATime uint32
31 MTime uint32
32
33 // AttrExtended
34 ExtendedAttributes []ExtendedAttribute
35}
36
37// GetSize returns the Size field and a bool that is true if and only if the value is valid/defined.
38func (a *Attributes) GetSize() (size uint64, ok bool) {
39 return a.Size, a.Flags&AttrSize != 0
40}
41
42// SetSize is a convenience function that sets the Size field,
43// and marks the field as valid/defined in Flags.
44func (a *Attributes) SetSize(size uint64) {
45 a.Flags |= AttrSize
46 a.Size = size
47}
48
49// GetUIDGID returns the UID and GID fields and a bool that is true if and only if the values are valid/defined.
50func (a *Attributes) GetUIDGID() (uid, gid uint32, ok bool) {
51 return a.UID, a.GID, a.Flags&AttrUIDGID != 0
52}
53
54// SetUIDGID is a convenience function that sets the UID and GID fields,
55// and marks the fields as valid/defined in Flags.
56func (a *Attributes) SetUIDGID(uid, gid uint32) {
57 a.Flags |= AttrUIDGID
58 a.UID = uid
59 a.GID = gid
60}
61
62// GetPermissions returns the Permissions field and a bool that is true if and only if the value is valid/defined.
63func (a *Attributes) GetPermissions() (perms FileMode, ok bool) {
64 return a.Permissions, a.Flags&AttrPermissions != 0
65}
66
67// SetPermissions is a convenience function that sets the Permissions field,
68// and marks the field as valid/defined in Flags.
69func (a *Attributes) SetPermissions(perms FileMode) {
70 a.Flags |= AttrPermissions
71 a.Permissions = perms
72}
73
74// GetACModTime returns the ATime and MTime fields and a bool that is true if and only if the values are valid/defined.
75func (a *Attributes) GetACModTime() (atime, mtime uint32, ok bool) {
76 return a.ATime, a.MTime, a.Flags&AttrACModTime != 0
77}
78
79// SetACModTime is a convenience function that sets the ATime and MTime fields,
80// and marks the fields as valid/defined in Flags.
81func (a *Attributes) SetACModTime(atime, mtime uint32) {
82 a.Flags |= AttrACModTime
83 a.ATime = atime
84 a.MTime = mtime
85}
86
87// Len returns the number of bytes a would marshal into.
88func (a *Attributes) Len() int {
89 length := 4
90
91 if a.Flags&AttrSize != 0 {
92 length += 8
93 }
94
95 if a.Flags&AttrUIDGID != 0 {
96 length += 4 + 4
97 }
98
99 if a.Flags&AttrPermissions != 0 {
100 length += 4
101 }
102
103 if a.Flags&AttrACModTime != 0 {
104 length += 4 + 4
105 }
106
107 if a.Flags&AttrExtended != 0 {
108 length += 4
109
110 for _, ext := range a.ExtendedAttributes {
111 length += ext.Len()
112 }
113 }
114
115 return length
116}
117
118// MarshalInto marshals e onto the end of the given Buffer.
119func (a *Attributes) MarshalInto(buf *Buffer) {
120 buf.AppendUint32(a.Flags)
121
122 if a.Flags&AttrSize != 0 {
123 buf.AppendUint64(a.Size)
124 }
125
126 if a.Flags&AttrUIDGID != 0 {
127 buf.AppendUint32(a.UID)
128 buf.AppendUint32(a.GID)
129 }
130
131 if a.Flags&AttrPermissions != 0 {
132 buf.AppendUint32(uint32(a.Permissions))
133 }
134
135 if a.Flags&AttrACModTime != 0 {
136 buf.AppendUint32(a.ATime)
137 buf.AppendUint32(a.MTime)
138 }
139
140 if a.Flags&AttrExtended != 0 {
141 buf.AppendUint32(uint32(len(a.ExtendedAttributes)))
142
143 for _, ext := range a.ExtendedAttributes {
144 ext.MarshalInto(buf)
145 }
146 }
147}
148
149// MarshalBinary returns a as the binary encoding of a.
150func (a *Attributes) MarshalBinary() ([]byte, error) {
151 buf := NewBuffer(make([]byte, 0, a.Len()))
152 a.MarshalInto(buf)
153 return buf.Bytes(), nil
154}
155
156// UnmarshalFrom unmarshals an Attributes from the given Buffer into e.
157//
158// NOTE: The values of fields not covered in the a.Flags are explicitly undefined.
159func (a *Attributes) UnmarshalFrom(buf *Buffer) (err error) {
160 flags := buf.ConsumeUint32()
161
162 return a.XXX_UnmarshalByFlags(flags, buf)
163}
164
165// XXX_UnmarshalByFlags uses the pre-existing a.Flags field to determine which fields to decode.
166// DO NOT USE THIS: it is an anti-corruption function to implement existing internal usage in pkg/sftp.
167// This function is not a part of any compatibility promise.
168func (a *Attributes) XXX_UnmarshalByFlags(flags uint32, buf *Buffer) (err error) {
169 a.Flags = flags
170
171 // Short-circuit dummy attributes.
172 if a.Flags == 0 {
173 return buf.Err
174 }
175
176 if a.Flags&AttrSize != 0 {
177 a.Size = buf.ConsumeUint64()
178 }
179
180 if a.Flags&AttrUIDGID != 0 {
181 a.UID = buf.ConsumeUint32()
182 a.GID = buf.ConsumeUint32()
183 }
184
185 if a.Flags&AttrPermissions != 0 {
186 a.Permissions = FileMode(buf.ConsumeUint32())
187 }
188
189 if a.Flags&AttrACModTime != 0 {
190 a.ATime = buf.ConsumeUint32()
191 a.MTime = buf.ConsumeUint32()
192 }
193
194 if a.Flags&AttrExtended != 0 {
195 count := buf.ConsumeCount()
196
197 a.ExtendedAttributes = make([]ExtendedAttribute, count)
198 for i := range a.ExtendedAttributes {
199 a.ExtendedAttributes[i].UnmarshalFrom(buf)
200 }
201 }
202
203 return buf.Err
204}
205
206// UnmarshalBinary decodes the binary encoding of Attributes into e.
207func (a *Attributes) UnmarshalBinary(data []byte) error {
208 return a.UnmarshalFrom(NewBuffer(data))
209}
210
211// ExtendedAttribute defines the extended file attribute type defined in draft-ietf-secsh-filexfer-02
212//
213// Defined in: https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-02.txt#section-5
214type ExtendedAttribute struct {
215 Type string
216 Data string
217}
218
219// Len returns the number of bytes e would marshal into.
220func (e *ExtendedAttribute) Len() int {
221 return 4 + len(e.Type) + 4 + len(e.Data)
222}
223
224// MarshalInto marshals e onto the end of the given Buffer.
225func (e *ExtendedAttribute) MarshalInto(buf *Buffer) {
226 buf.AppendString(e.Type)
227 buf.AppendString(e.Data)
228}
229
230// MarshalBinary returns e as the binary encoding of e.
231func (e *ExtendedAttribute) MarshalBinary() ([]byte, error) {
232 buf := NewBuffer(make([]byte, 0, e.Len()))
233 e.MarshalInto(buf)
234 return buf.Bytes(), nil
235}
236
237// UnmarshalFrom unmarshals an ExtendedAattribute from the given Buffer into e.
238func (e *ExtendedAttribute) UnmarshalFrom(buf *Buffer) (err error) {
239 *e = ExtendedAttribute{
240 Type: buf.ConsumeString(),
241 Data: buf.ConsumeString(),
242 }
243
244 return buf.Err
245}
246
247// UnmarshalBinary decodes the binary encoding of ExtendedAttribute into e.
248func (e *ExtendedAttribute) UnmarshalBinary(data []byte) error {
249 return e.UnmarshalFrom(NewBuffer(data))
250}
251
252// NameEntry implements the SSH_FXP_NAME repeated data type from draft-ietf-secsh-filexfer-02
253//
254// This type is incompatible with versions 4 or higher.
255type NameEntry struct {
256 Filename string
257 Longname string
258 Attrs Attributes
259}
260
261// Len returns the number of bytes e would marshal into.
262func (e *NameEntry) Len() int {
263 return 4 + len(e.Filename) + 4 + len(e.Longname) + e.Attrs.Len()
264}
265
266// MarshalInto marshals e onto the end of the given Buffer.
267func (e *NameEntry) MarshalInto(buf *Buffer) {
268 buf.AppendString(e.Filename)
269 buf.AppendString(e.Longname)
270
271 e.Attrs.MarshalInto(buf)
272}
273
274// MarshalBinary returns e as the binary encoding of e.
275func (e *NameEntry) MarshalBinary() ([]byte, error) {
276 buf := NewBuffer(make([]byte, 0, e.Len()))
277 e.MarshalInto(buf)
278 return buf.Bytes(), nil
279}
280
281// UnmarshalFrom unmarshals an NameEntry from the given Buffer into e.
282//
283// NOTE: The values of fields not covered in the a.Flags are explicitly undefined.
284func (e *NameEntry) UnmarshalFrom(buf *Buffer) (err error) {
285 *e = NameEntry{
286 Filename: buf.ConsumeString(),
287 Longname: buf.ConsumeString(),
288 }
289
290 return e.Attrs.UnmarshalFrom(buf)
291}
292
293// UnmarshalBinary decodes the binary encoding of NameEntry into e.
294func (e *NameEntry) UnmarshalBinary(data []byte) error {
295 return e.UnmarshalFrom(NewBuffer(data))
296}