]>
Commit | Line | Data |
---|---|---|
6988a057 JH |
1 | package hotline |
2 | ||
3 | import ( | |
4 | "bytes" | |
5 | "encoding/binary" | |
6 | "errors" | |
85767504 | 7 | "io" |
9067f234 JH |
8 | "os" |
9 | "path/filepath" | |
6988a057 JH |
10 | ) |
11 | ||
df2735b2 | 12 | type transfer struct { |
6988a057 JH |
13 | Protocol [4]byte // "HTXF" 0x48545846 |
14 | ReferenceNumber [4]byte // Unique ID generated for the transfer | |
15 | DataSize [4]byte // File size | |
16 | RSVD [4]byte // Not implemented in Hotline Protocol | |
17 | } | |
18 | ||
df2735b2 | 19 | var HTXF = [4]byte{0x48, 0x54, 0x58, 0x46} // (HTXF) is the only supported transfer protocol |
6988a057 | 20 | |
df2735b2 JH |
21 | func (tf *transfer) Write(b []byte) (int, error) { |
22 | if err := binary.Read(bytes.NewReader(b), binary.BigEndian, tf); err != nil { | |
23 | return 0, err | |
6988a057 JH |
24 | } |
25 | ||
df2735b2 JH |
26 | if tf.Protocol != HTXF { |
27 | return 0, errors.New("invalid protocol") | |
6988a057 JH |
28 | } |
29 | ||
df2735b2 | 30 | return len(b), nil |
6988a057 | 31 | } |
85767504 | 32 | |
df1ade54 | 33 | func receiveFile(r io.Reader, targetFile, resForkFile, infoFork, counterWriter io.Writer) error { |
7cd900d6 JH |
34 | var ffo flattenedFileObject |
35 | if _, err := ffo.ReadFrom(r); err != nil { | |
85767504 JH |
36 | return err |
37 | } | |
38 | ||
7cd900d6 JH |
39 | // Write the information fork |
40 | _, err := infoFork.Write(ffo.FlatFileInformationFork.MarshalBinary()) | |
85767504 JH |
41 | if err != nil { |
42 | return err | |
43 | } | |
44 | ||
df1ade54 | 45 | if _, err = io.Copy(targetFile, io.TeeReader(r, counterWriter)); err != nil { |
165b7ac9 JH |
46 | return err |
47 | } | |
85767504 | 48 | |
7cd900d6 JH |
49 | if ffo.FlatFileHeader.ForkCount == [2]byte{0, 3} { |
50 | if err := binary.Read(r, binary.BigEndian, &ffo.FlatFileResForkHeader); err != nil { | |
85767504 JH |
51 | return err |
52 | } | |
ba29c43b | 53 | |
df1ade54 | 54 | if _, err = io.Copy(resForkFile, io.TeeReader(r, counterWriter)); err != nil { |
ba29c43b JH |
55 | return err |
56 | } | |
7cd900d6 JH |
57 | } |
58 | return nil | |
59 | } | |
ba29c43b | 60 | |
9067f234 JH |
61 | func (s *Server) bannerDownload(w io.Writer) error { |
62 | bannerBytes, err := os.ReadFile(filepath.Join(s.ConfigDir, s.Config.BannerFile)) | |
63 | if err != nil { | |
64 | return err | |
65 | } | |
66 | _, err = w.Write(bannerBytes) | |
7cd900d6 | 67 | |
9067f234 | 68 | return err |
85767504 | 69 | } |