]> Sergey Matveev's repositories - btrtrc.git/blob - cmd/torrent-verify/main.go
Ditch Data.WriteSectionTo, and fix cmd/torrent-verify
[btrtrc.git] / cmd / torrent-verify / main.go
1 package main
2
3 import (
4         "bytes"
5         "crypto/sha1"
6         "flag"
7         "fmt"
8         "io"
9         "log"
10         "os"
11         "path/filepath"
12
13         "github.com/bradfitz/iter"
14         "github.com/edsrzf/mmap-go"
15
16         "github.com/anacrolix/torrent/metainfo"
17         "github.com/anacrolix/torrent/mmap_span"
18 )
19
20 var (
21         torrentPath = flag.String("torrent", "/path/to/the.torrent", "path of the torrent file")
22         dataPath    = flag.String("path", "/torrent/data", "path of the torrent data")
23 )
24
25 func fileToMmap(filename string, length int64) mmap.MMap {
26         osFile, err := os.Open(filename)
27         if os.IsNotExist(err) {
28                 return nil
29         }
30         if err != nil {
31                 log.Fatal(err)
32         }
33         goMMap, err := mmap.MapRegion(osFile, int(length), mmap.RDONLY, mmap.COPY, 0)
34         if err != nil {
35                 log.Fatal(err)
36         }
37         if int64(len(goMMap)) != length {
38                 log.Printf("file mmap has wrong size: %#v", filename)
39         }
40         osFile.Close()
41
42         return goMMap
43 }
44
45 func main() {
46         log.SetFlags(log.Flags() | log.Lshortfile)
47         flag.Parse()
48         metaInfo, err := metainfo.LoadFromFile(*torrentPath)
49         if err != nil {
50                 log.Fatal(err)
51         }
52         mMapSpan := &mmap_span.MMapSpan{}
53         if len(metaInfo.Info.Files) > 0 {
54                 for _, file := range metaInfo.Info.Files {
55                         filename := filepath.Join(append([]string{*dataPath, metaInfo.Info.Name}, file.Path...)...)
56                         goMMap := fileToMmap(filename, file.Length)
57                         mMapSpan.Append(goMMap)
58                 }
59                 log.Println(len(metaInfo.Info.Files))
60         } else {
61                 goMMap := fileToMmap(*dataPath, metaInfo.Info.Length)
62                 mMapSpan.Append(goMMap)
63         }
64         log.Println(mMapSpan.Size())
65         log.Println(len(metaInfo.Info.Pieces))
66         info := metaInfo.Info
67         for i := range iter.N(metaInfo.Info.NumPieces()) {
68                 p := info.Piece(i)
69                 hash := sha1.New()
70                 _, err := io.Copy(hash, io.NewSectionReader(mMapSpan, p.Offset(), p.Length()))
71                 if err != nil {
72                         log.Fatal(err)
73                 }
74                 fmt.Printf("%d: %x: %v\n", i, p.Hash(), bytes.Equal(hash.Sum(nil), p.Hash()))
75         }
76 }