a geicko-2 based round robin ranking system designed to test c++ battleship submissions
battleship.dunkirk.sh
1package sftp
2
3import (
4 "io"
5 "os"
6)
7
8// WriterAtReaderAt defines the interface to return when a file is to
9// be opened for reading and writing
10type WriterAtReaderAt interface {
11 io.WriterAt
12 io.ReaderAt
13}
14
15// Interfaces are differentiated based on required returned values.
16// All input arguments are to be pulled from Request (the only arg).
17
18// The Handler interfaces all take the Request object as its only argument.
19// All the data you should need to handle the call are in the Request object.
20// The request.Method attribute is initially the most important one as it
21// determines which Handler gets called.
22
23// FileReader should return an io.ReaderAt for the filepath
24// Note in cases of an error, the error text will be sent to the client.
25// Called for Methods: Get
26type FileReader interface {
27 Fileread(*Request) (io.ReaderAt, error)
28}
29
30// FileWriter should return an io.WriterAt for the filepath.
31//
32// The request server code will call Close() on the returned io.WriterAt
33// object if an io.Closer type assertion succeeds.
34// Note in cases of an error, the error text will be sent to the client.
35// Note when receiving an Append flag it is important to not open files using
36// O_APPEND if you plan to use WriteAt, as they conflict.
37// Called for Methods: Put, Open
38type FileWriter interface {
39 Filewrite(*Request) (io.WriterAt, error)
40}
41
42// OpenFileWriter is a FileWriter that implements the generic OpenFile method.
43// You need to implement this optional interface if you want to be able
44// to read and write from/to the same handle.
45// Called for Methods: Open
46type OpenFileWriter interface {
47 FileWriter
48 OpenFile(*Request) (WriterAtReaderAt, error)
49}
50
51// FileCmder should return an error
52// Note in cases of an error, the error text will be sent to the client.
53// Called for Methods: Setstat, Rename, Rmdir, Mkdir, Link, Symlink, Remove
54type FileCmder interface {
55 Filecmd(*Request) error
56}
57
58// PosixRenameFileCmder is a FileCmder that implements the PosixRename method.
59// If this interface is implemented PosixRename requests will call it
60// otherwise they will be handled in the same way as Rename
61type PosixRenameFileCmder interface {
62 FileCmder
63 PosixRename(*Request) error
64}
65
66// StatVFSFileCmder is a FileCmder that implements the StatVFS method.
67// You need to implement this interface if you want to handle statvfs requests.
68// Please also be sure that the statvfs@openssh.com extension is enabled
69type StatVFSFileCmder interface {
70 FileCmder
71 StatVFS(*Request) (*StatVFS, error)
72}
73
74// FileLister should return an object that fulfils the ListerAt interface
75// Note in cases of an error, the error text will be sent to the client.
76// Called for Methods: List, Stat, Readlink
77//
78// Since Filelist returns an os.FileInfo, this can make it non-ideal for implementing Readlink.
79// This is because the Name receiver method defined by that interface defines that it should only return the base name.
80// However, Readlink is required to be capable of returning essentially any arbitrary valid path relative or absolute.
81// In order to implement this more expressive requirement, implement [ReadlinkFileLister] which will then be used instead.
82type FileLister interface {
83 Filelist(*Request) (ListerAt, error)
84}
85
86// LstatFileLister is a FileLister that implements the Lstat method.
87// If this interface is implemented Lstat requests will call it
88// otherwise they will be handled in the same way as Stat
89type LstatFileLister interface {
90 FileLister
91 Lstat(*Request) (ListerAt, error)
92}
93
94// RealPathFileLister is a FileLister that implements the Realpath method.
95// The built-in RealPath implementation does not resolve symbolic links.
96// By implementing this interface you can customize the returned path
97// and, for example, resolve symbolinc links if needed for your use case.
98// You have to return an absolute POSIX path.
99//
100// Up to v1.13.5 the signature for the RealPath method was:
101//
102// # RealPath(string) string
103//
104// we have added a legacyRealPathFileLister that implements the old method
105// to ensure that your code does not break.
106// You should use the new method signature to avoid future issues
107type RealPathFileLister interface {
108 FileLister
109 RealPath(string) (string, error)
110}
111
112// ReadlinkFileLister is a FileLister that implements the Readlink method.
113// By implementing the Readlink method, it is possible to return any arbitrary valid path relative or absolute.
114// This allows giving a better response than via the default FileLister (which is limited to os.FileInfo, whose Name method should only return the base name of a file)
115type ReadlinkFileLister interface {
116 FileLister
117 Readlink(string) (string, error)
118}
119
120// This interface is here for backward compatibility only
121type legacyRealPathFileLister interface {
122 FileLister
123 RealPath(string) string
124}
125
126// NameLookupFileLister is a FileLister that implmeents the LookupUsername and LookupGroupName methods.
127// If this interface is implemented, then longname ls formatting will use these to convert usernames and groupnames.
128type NameLookupFileLister interface {
129 FileLister
130 LookupUserName(string) string
131 LookupGroupName(string) string
132}
133
134// ListerAt does for file lists what io.ReaderAt does for files, i.e. a []os.FileInfo buffer is passed to the ListAt function
135// and the entries that are populated in the buffer will be passed to the client.
136//
137// ListAt should return the number of entries copied and an io.EOF error if at end of list.
138// This is testable by comparing how many you copied to how many could be copied (eg. n < len(ls) below).
139// The copy() builtin is best for the copying.
140//
141// Uid and gid information will on unix systems be retrieved from [os.FileInfo.Sys]
142// if this function returns a [syscall.Stat_t] when called on a populated entry.
143// Alternatively, if the entry implements [FileInfoUidGid], it will be used for uid and gid information.
144//
145// If a populated entry implements [FileInfoExtendedData], extended attributes will also be returned to the client.
146//
147// The request server code will call Close() on ListerAt if an io.Closer type assertion succeeds.
148//
149// Note in cases of an error, the error text will be sent to the client.
150type ListerAt interface {
151 ListAt([]os.FileInfo, int64) (int, error)
152}
153
154// TransferError is an optional interface that readerAt and writerAt
155// can implement to be notified about the error causing Serve() to exit
156// with the request still open
157type TransferError interface {
158 TransferError(err error)
159}