You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

85 lines
1.5 KiB

//go:build unix
package fuse
import (
"syscall"
"unsafe"
)
// Memory mapping support for Unix-like systems
func mmapFile(fd int, offset int64, length int, prot int, flags int) ([]byte, error) {
addr, _, errno := syscall.Syscall6(syscall.SYS_MMAP,
0, // addr (let kernel choose)
uintptr(length),
uintptr(prot),
uintptr(flags),
uintptr(fd),
uintptr(offset))
if errno != 0 {
return nil, errno
}
// Convert the address to a byte slice
return (*[1 << 30]byte)(unsafe.Pointer(addr))[:length:length], nil
}
func munmapFile(data []byte) error {
if len(data) == 0 {
return nil
}
_, _, errno := syscall.Syscall(syscall.SYS_MUNMAP,
uintptr(unsafe.Pointer(&data[0])),
uintptr(len(data)),
0)
if errno != 0 {
return errno
}
return nil
}
func msyncFile(data []byte, flags int) error {
if len(data) == 0 {
return nil
}
_, _, errno := syscall.Syscall(syscall.SYS_MSYNC,
uintptr(unsafe.Pointer(&data[0])),
uintptr(len(data)),
uintptr(flags))
if errno != 0 {
return errno
}
return nil
}
func isMmapSupported() bool {
return true
}
// Memory protection flags
const (
PROT_READ = syscall.PROT_READ
PROT_WRITE = syscall.PROT_WRITE
PROT_EXEC = syscall.PROT_EXEC
PROT_NONE = syscall.PROT_NONE
)
// Memory mapping flags
const (
MAP_SHARED = syscall.MAP_SHARED
MAP_PRIVATE = syscall.MAP_PRIVATE
MAP_ANONYMOUS = syscall.MAP_ANON
)
// Memory sync flags
const (
MS_ASYNC = syscall.MS_ASYNC
MS_SYNC = syscall.MS_SYNC
MS_INVALIDATE = syscall.MS_INVALIDATE
)