case pp.Have:
me.peerGotPiece(t, c, int(msg.Index))
case pp.Request:
- if me.config.NoUpload {
+ if c.Choked {
break
}
request := newRequest(msg.Index, msg.Begin, msg.Length)
// }
p := make([]byte, msg.Length)
n, err := dataReadAt(t.data, p, int64(t.pieceLength(0))*int64(msg.Index)+int64(msg.Begin))
+ // TODO: Failing to read for a request should not be fatal to the connection.
if err != nil {
return fmt.Errorf("reading t data to serve request %q: %s", request, err)
}
if me.ipBlockRange(p.IP) != nil {
continue
}
+ if p.Port == 0 {
+ log.Printf("got bad peer: %v", p)
+ continue
+ }
t.addPeer(p)
}
me.openNewConns(t)
// Write the chunk out.
err := t.writeChunk(int(msg.Index), int64(msg.Begin), msg.Piece)
if err != nil {
- return fmt.Errorf("error writing chunk: %s", err)
+ log.Printf("error writing chunk: %s", err)
+ return nil
}
// log.Println("got chunk", req)
}
p.EverHashed = true
if correct {
- if sd, ok := t.data.(StatefulData); ok {
- err := sd.PieceCompleted(int(piece))
- if err != nil {
- log.Printf("error completing piece: %s", err)
- correct = false
- }
+ err := t.data.PieceCompleted(int(piece))
+ if err != nil {
+ log.Printf("error completing piece: %s", err)
+ correct = false
}
}
me.pieceChanged(t, int(piece))
}
func (t *torrent) writeChunk(piece int, begin int64, data []byte) (err error) {
- _, err = t.data.WriteAt(data, int64(piece)*t.Info.PieceLength+begin)
+ n, err := t.data.WriteAt(data, int64(piece)*t.Info.PieceLength+begin)
+ if err == nil && n != len(data) {
+ err = io.ErrShortWrite
+ }
return
}