]> Sergey Matveev's repositories - btrtrc.git/blob - storage/file-paths.go
go1.19 compat
[btrtrc.git] / storage / file-paths.go
1 package storage
2
3 import (
4         "os"
5         "path/filepath"
6         "strings"
7
8         "github.com/anacrolix/torrent/metainfo"
9 )
10
11 // Determines the filepath to be used for each file in a torrent.
12 type FilePathMaker func(opts FilePathMakerOpts) string
13
14 // Determines the directory for a given torrent within a storage client.
15 type TorrentDirFilePathMaker func(baseDir string, info *metainfo.Info, infoHash metainfo.Hash) string
16
17 // Info passed to a FilePathMaker.
18 type FilePathMakerOpts struct {
19         Info *metainfo.Info
20         File *metainfo.FileInfo
21 }
22
23 // defaultPathMaker just returns the storage client's base directory.
24 func defaultPathMaker(baseDir string, info *metainfo.Info, infoHash metainfo.Hash) string {
25         return baseDir
26 }
27
28 func infoHashPathMaker(baseDir string, info *metainfo.Info, infoHash metainfo.Hash) string {
29         return filepath.Join(baseDir, infoHash.HexString())
30 }
31
32 func isSubFilepath(base, sub string) bool {
33         rel, err := filepath.Rel(base, sub)
34         if err != nil {
35                 return false
36         }
37         return rel != ".." && !strings.HasPrefix(rel, ".."+string(os.PathSeparator))
38 }