Allow Stat() for MMap objects

This commit is contained in:
Kovid Goyal
2023-02-20 22:11:27 +05:30
parent 5a8d903a4d
commit 88077fdbcd
3 changed files with 23 additions and 2 deletions

View File

@@ -9,6 +9,7 @@ import (
"errors"
"fmt"
"io"
"io/fs"
not_rand "math/rand"
"os"
"strconv"
@@ -63,6 +64,7 @@ type MMap interface {
Name() string
IsFileSystemBacked() bool
FileSystemName() string
Stat() (fs.FileInfo, error)
}
type AccessFlags int

View File

@@ -39,6 +39,10 @@ func file_mmap(f *os.File, size uint64, access AccessFlags, truncate bool, speci
return &file_based_mmap{f: f, region: region, special_name: special_name}, nil
}
func (self *file_based_mmap) Stat() (fs.FileInfo, error) {
return self.f.Stat()
}
func (self *file_based_mmap) Name() string {
if self.special_name != "" {
return self.special_name
@@ -134,12 +138,18 @@ func Open(name string, size uint64) (MMap, error) {
return file_mmap(ans, size, READ, false, name)
}
func ReadWithSizeAndUnlink(name string) ([]byte, error) {
func ReadWithSizeAndUnlink(name string, file_callback ...func(*os.File) error) ([]byte, error) {
f, err := open(name)
if err != nil {
return nil, err
}
defer f.Close()
defer os.Remove(f.Name())
for _, cb := range file_callback {
err = cb(f)
if err != nil {
return nil, err
}
}
return read_with_size(f)
}

View File

@@ -86,6 +86,9 @@ func syscall_mmap(f *os.File, size uint64, access AccessFlags, truncate bool) (M
func (self *syscall_based_mmap) Name() string {
return self.f.Name()
}
func (self *syscall_based_mmap) Stat() (fs.FileInfo, error) {
return self.f.Stat()
}
func (self *syscall_based_mmap) Slice() []byte {
return self.region
@@ -152,12 +155,18 @@ func Open(name string, size uint64) (MMap, error) {
return syscall_mmap(ans, size, READ, false)
}
func ReadWithSizeAndUnlink(name string) ([]byte, error) {
func ReadWithSizeAndUnlink(name string, file_callback ...func(*os.File) error) ([]byte, error) {
f, err := shm_open(name, os.O_RDONLY, 0)
if err != nil {
return nil, err
}
defer f.Close()
defer shm_unlink(f.Name())
for _, cb := range file_callback {
err = cb(f)
if err != nil {
return nil, err
}
}
return read_with_size(f)
}