metainfo/info.go | 25 +++---------------------- metainfo/pieces.go | 22 ++++++++++++++++++++++ diff --git a/metainfo/info.go b/metainfo/info.go index 3190dfb018c971d431e4aece486ae83ea71b107a..1c2d0b85b9abef37b32b662fc189c504108b957d 100644 --- a/metainfo/info.go +++ b/metainfo/info.go @@ -1,7 +1,6 @@ package metainfo import ( - "crypto/sha1" "errors" "fmt" "io" @@ -85,7 +84,7 @@ } // Sets Pieces (the block of piece hashes in the Info) by using the passed // function to get at the torrent data. -func (info *Info) GeneratePieces(open func(fi FileInfo) (io.ReadCloser, error)) error { +func (info *Info) GeneratePieces(open func(fi FileInfo) (io.ReadCloser, error)) (err error) { if info.PieceLength == 0 { return errors.New("piece length must be non-zero") } @@ -95,26 +94,8 @@ err := info.writeFiles(pw, open) pw.CloseWithError(err) }() defer pr.Close() - var pieces []byte - for { - hasher := sha1.New() - wn, err := io.CopyN(hasher, pr, info.PieceLength) - if err == io.EOF { - err = nil - } - if err != nil { - return err - } - if wn == 0 { - break - } - pieces = hasher.Sum(pieces) - if wn < info.PieceLength { - break - } - } - info.Pieces = pieces - return nil + info.Pieces, err = GeneratePieces(pr, info.PieceLength, nil) + return } func (info *Info) TotalLength() (ret int64) { diff --git a/metainfo/pieces.go b/metainfo/pieces.go new file mode 100644 index 0000000000000000000000000000000000000000..812f3f4f516da5ba09be438d35ce483165d9d637 --- /dev/null +++ b/metainfo/pieces.go @@ -0,0 +1,22 @@ +package metainfo + +import ( + "crypto/sha1" + "io" +) + +func GeneratePieces(r io.Reader, pieceLength int64, b []byte) ([]byte, error) { + for { + h := sha1.New() + written, err := io.CopyN(h, r, pieceLength) + if written > 0 { + b = h.Sum(b) + } + if err == io.EOF { + return b, nil + } + if err != nil { + return b, err + } + } +}