- if hasherExists {
- if bytes.Compare(hasherAndOffset.h.Sum(nil), file.Hash[:]) != 0 {
- state.Ctx.LogE(
- "sp-file-bad-checksum", lesp,
- errors.New("checksum mismatch"),
- logMsg,
- )
- continue
- }
- if err = os.Rename(filePathPart, filePath); err != nil {
- state.Ctx.LogE("sp-file-rename", lesp, err, func(les LEs) string {
- return logMsg(les) + ": renaming"
- })
- continue
- }
- if err = DirSync(dirToSync); err != nil {
- state.Ctx.LogE("sp-file-dirsync", lesp, err, func(les LEs) string {
- return logMsg(les) + ": dirsyncing"
- })
- continue
- }
- state.Ctx.LogI("sp-file-done", lesp, func(les LEs) string {
- return logMsg(les) + ": done"
- })
- state.wg.Add(1)
- go func() {
- state.payloads <- MarshalSP(SPTypeDone, SPDone{file.Hash})
- state.wg.Done()
- }()
- state.Lock()
- delete(state.infosTheir, *file.Hash)
- state.Unlock()
- if !state.Ctx.HdrUsage {
- state.closeFd(filePathPart)
- continue
- }
- if _, err = fd.Seek(0, io.SeekStart); err != nil {
- state.Ctx.LogE("sp-file-seek", lesp, err, func(les LEs) string {
- return logMsg(les) + ": seeking"
+ if hasherAndOffset != nil {
+ delete(state.fileHashers, filePath)
+ if hasherAndOffset.mth.PreaddSize() == 0 {
+ if bytes.Compare(hasherAndOffset.mth.Sum(nil), file.Hash[:]) != 0 {
+ state.Ctx.LogE(
+ "sp-file-bad-checksum", lesp,
+ errors.New("checksum mismatch"),
+ logMsg,
+ )
+ state.closeFd(filePathPart)
+ continue
+ }
+ if err = os.Rename(filePathPart, filePath); err != nil {
+ state.Ctx.LogE("sp-file-rename", lesp, err, func(les LEs) string {
+ return logMsg(les) + ": renaming"
+ })
+ state.closeFd(filePathPart)
+ continue
+ }
+ if err = DirSync(dirToSync); err != nil {
+ state.Ctx.LogE("sp-file-dirsync", lesp, err, func(les LEs) string {
+ return logMsg(les) + ": dirsyncing"
+ })
+ state.closeFd(filePathPart)
+ continue
+ }
+ state.Ctx.LogI("sp-file-done", lesp, func(les LEs) string {
+ return logMsg(les) + ": done"