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:
parent
816c263760
commit
aefe754698
22
client.go
22
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...)...)
|
||||
var file *os.File
|
||||
file, err = os.Open(fileName)
|
||||
err = os.MkdirAll(filepath.Dir(fileName), 0666)
|
||||
if err != nil {
|
||||
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
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user