- state.RUnlock()
- spWorkersGroup.Wait()
- spWorkersGroup.Add(1)
- go func() {
- if err := fd.Sync(); err != nil {
- state.Ctx.LogE("sp-file", sdsp, err, "sync")
- fd.Close()
- return
- }
- state.wg.Add(1)
- defer state.wg.Done()
- fd.Seek(0, io.SeekStart)
- state.Ctx.LogD("sp-file", sdsp, "checking")
- gut, err := Check(fd, file.Hash[:], sdsp, state.Ctx.ShowPrgrs)
- fd.Close()
- if err != nil || !gut {
- state.Ctx.LogE("sp-file", sdsp, errors.New("checksum mismatch"), "")
- return
+ if state.Ctx.ShowPrgrs {
+ delete(state.progressBars, pktName)
+ }
+ logMsg = func(les LEs) string {
+ return fmt.Sprintf(
+ "Got packet %s %d%% (%s / %s)",
+ pktName, 100*ourSize/fullsize,
+ humanize.IBytes(uint64(ourSize)),
+ humanize.IBytes(uint64(fullsize)),
+ )
+ }
+ err = fd.Sync()
+ if err != nil {
+ state.Ctx.LogE("sp-file-sync", lesp, err, func(les LEs) string {
+ return logMsg(les) + ": syncing"
+ })
+ state.closeFd(filePathPart)
+ continue
+ }
+ 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"
+ })
+ 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 {
+ 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"
+ })
+ state.closeFd(filePathPart)
+ continue
+ }
+ _, pktEncRaw, err := state.Ctx.HdrRead(fd)
+ state.closeFd(filePathPart)
+ if err != nil {
+ state.Ctx.LogE("sp-file-hdr-read", lesp, err, func(les LEs) string {
+ return logMsg(les) + ": HdrReading"
+ })
+ continue
+ }
+ state.Ctx.HdrWrite(pktEncRaw, filePath)
+ continue