From: Matt Joiner Date: Sat, 28 Sep 2013 18:03:04 +0000 (+1000) Subject: Create torrent data files with at least the required size X-Git-Tag: v1.0.0~1820 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=aefe75469830ba40debe0eebfe43ebe11705fc7b;p=btrtrc.git Create torrent data files with at least the required size Truncate is required or use of mmap'd region beyond file length raises SIGBUS. --- diff --git a/client.go b/client.go index a3706ae4..7793a0e5 100644 --- 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