aboutsummaryrefslogblamecommitdiff
path: root/misc/openat2.go
blob: 2b6363423baf0ca83257e4acb4c998965366cda8 (plain) (tree)























                                    
                                                                                



                                                 
                                                                                                                                                                                        





                           
package misc

import (
	"syscall"
	"unsafe"
)

const SYS_OPENAT2 = 437

type Open_how_t struct {
	Flags   uint64
	Mode    uint64
	Resolve uint64
}

const (
	RESOLVE_BENEATH       = 0x8
	RESOLVE_IN_ROOT       = 0x10
	RESOLVE_NO_MAGICLINKS = 0x2
	RESOLVE_NO_SYMLINKS   = 0x4
	RESOLVE_NO_XDEV       = 0x1
)

// See openat2(2) on Linux
func Openat2(dirfd int, path string, open_how *Open_how_t) (fd int, err error) {
	path_ptr, err := String_to_byte_ptr(path)
	if err != nil {
		return
	}
	_fd, _, errno := syscall.Syscall6(SYS_OPENAT2, uintptr(dirfd), uintptr(unsafe.Pointer(path_ptr)), uintptr(unsafe.Pointer(open_how)), uintptr(unsafe.Sizeof(Open_how_t{})), 0, 0)
	fd = int(_fd)
	if errno != 0 {
		err = errno
	}
	return
}