1// Copyright 2018 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5//go:build aix || solaris 6 7package unix 8 9import ( 10 "syscall" 11 "unsafe" 12) 13 14//go:linkname procFstatat libc_fstatat 15//go:linkname procOpenat libc_openat 16//go:linkname procUnlinkat libc_unlinkat 17 18var ( 19 procFstatat, 20 procOpenat, 21 procUnlinkat uintptr 22) 23 24func Unlinkat(dirfd int, path string, flags int) error { 25 p, err := syscall.BytePtrFromString(path) 26 if err != nil { 27 return err 28 } 29 30 _, _, errno := syscall6(uintptr(unsafe.Pointer(&procUnlinkat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(p)), uintptr(flags), 0, 0, 0) 31 if errno != 0 { 32 return errno 33 } 34 35 return nil 36} 37 38func Openat(dirfd int, path string, flags int, perm uint32) (int, error) { 39 p, err := syscall.BytePtrFromString(path) 40 if err != nil { 41 return 0, err 42 } 43 44 fd, _, errno := syscall6(uintptr(unsafe.Pointer(&procOpenat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(p)), uintptr(flags), uintptr(perm), 0, 0) 45 if errno != 0 { 46 return 0, errno 47 } 48 49 return int(fd), nil 50} 51 52func Fstatat(dirfd int, path string, stat *syscall.Stat_t, flags int) error { 53 p, err := syscall.BytePtrFromString(path) 54 if err != nil { 55 return err 56 } 57 58 _, _, errno := syscall6(uintptr(unsafe.Pointer(&procFstatat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(p)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) 59 if errno != 0 { 60 return errno 61 } 62 63 return nil 64} 65