]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Create torrent data files with at least the required size
authorMatt Joiner <anacrolix@gmail.com>
Sat, 28 Sep 2013 18:03:04 +0000 (04:03 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Sat, 28 Sep 2013 18:03:04 +0000 (04:03 +1000)
Truncate is required or use of mmap'd region beyond file length raises SIGBUS.

client.go

index a3706ae42fd0c8ba626f6e55d3e7166f47cf1ae9..7793a0e519405429010001fbdf70454bd7ccef54 100644 (file)
--- a/client.go
+++ b/client.go
@@ -111,16 +111,34 @@ func mmapTorrentData(metaInfo *metainfo.MetaInfo, location string) (mms MMapSpan
        }()
        for _, miFile := range metaInfo.Files {
                fileName := filepath.Join(append([]string{location, metaInfo.Name}, miFile.Path...)...)
+               err = os.MkdirAll(filepath.Dir(fileName), 0666)
+               if err != nil {
+                       return
+               }
                var file *os.File
-               file, err = os.Open(fileName)
+               file, err = os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, 0666)
                if err != nil {
                        return
                }
+               var fi os.FileInfo
+               fi, err = file.Stat()
+               if err != nil {
+                       return
+               }
+               if fi.Size() < miFile.Length {
+                       err = file.Truncate(miFile.Length)
+                       if err != nil {
+                               return
+                       }
+               }
                var mMap gommap.MMap
                mMap, err = gommap.MapRegion(file.Fd(), 0, miFile.Length, gommap.PROT_READ|gommap.PROT_WRITE, gommap.MAP_SHARED)
                if err != nil {
                        return
                }
+               if int64(len(mMap)) != miFile.Length {
+                       panic("mmap has wrong length")
+               }
                mms = append(mms, MMap{mMap})
        }
        return