2
0
mirror of synced 2025-02-24 06:38:14 +00:00

Create torrent data files with at least the required size

Truncate is required or use of mmap'd region beyond file length raises SIGBUS.
This commit is contained in:
Matt Joiner 2013-09-29 04:03:04 +10:00
parent 816c263760
commit aefe754698

View File

@ -111,16 +111,34 @@ func mmapTorrentData(metaInfo *metainfo.MetaInfo, location string) (mms MMapSpan
}() }()
for _, miFile := range metaInfo.Files { for _, miFile := range metaInfo.Files {
fileName := filepath.Join(append([]string{location, metaInfo.Name}, miFile.Path...)...) fileName := filepath.Join(append([]string{location, metaInfo.Name}, miFile.Path...)...)
var file *os.File err = os.MkdirAll(filepath.Dir(fileName), 0666)
file, err = os.Open(fileName)
if err != nil { if err != nil {
return return
} }
var file *os.File
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 var mMap gommap.MMap
mMap, err = gommap.MapRegion(file.Fd(), 0, miFile.Length, gommap.PROT_READ|gommap.PROT_WRITE, gommap.MAP_SHARED) mMap, err = gommap.MapRegion(file.Fd(), 0, miFile.Length, gommap.PROT_READ|gommap.PROT_WRITE, gommap.MAP_SHARED)
if err != nil { if err != nil {
return return
} }
if int64(len(mMap)) != miFile.Length {
panic("mmap has wrong length")
}
mms = append(mms, MMap{mMap}) mms = append(mms, MMap{mMap})
} }
return return