github.com/guyezi/gofrontend@v0.0.0-20200228202240-7a62a49e62c0/libgo/go/internal/syscall/unix/at.go (about) 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 // -build linux openbsd netbsd dragonfly 6 7 package unix 8 9 import ( 10 "syscall" 11 ) 12 13 //extern unlinkat 14 func unlinkat(int32, *byte, int32) int32 15 16 //extern __go_openat 17 func openat(int32, *byte, int32, syscall.Mode_t) int32 18 19 func Unlinkat(dirfd int, path string, flags int) error { 20 var p *byte 21 p, err := syscall.BytePtrFromString(path) 22 if err != nil { 23 return err 24 } 25 26 syscall.Entersyscall() 27 r := unlinkat(int32(dirfd), p, int32(flags)) 28 var errno syscall.Errno 29 if r < 0 { 30 errno = syscall.GetErrno() 31 } 32 syscall.Exitsyscall() 33 if r < 0 { 34 return errno 35 } 36 return nil 37 } 38 39 func Openat(dirfd int, path string, flags int, perm uint32) (int, error) { 40 var p *byte 41 p, err := syscall.BytePtrFromString(path) 42 if err != nil { 43 return 0, err 44 } 45 46 syscall.Entersyscall() 47 fd := openat(int32(dirfd), p, int32(flags), syscall.Mode_t(perm)) 48 var errno syscall.Errno 49 if fd < 0 { 50 errno = syscall.GetErrno() 51 } 52 syscall.Exitsyscall() 53 if fd < 0 { 54 return 0, errno 55 } 56 return int(fd), nil 57 } 58 59 func Fstatat(dirfd int, path string, stat *syscall.Stat_t, flags int) error { 60 var p *byte 61 p, err := syscall.BytePtrFromString(path) 62 if err != nil { 63 return err 64 } 65 66 syscall.Entersyscall() 67 r := fstatat(int32(dirfd), p, stat, int32(flags)) 68 var errno syscall.Errno 69 if r < 0 { 70 errno = syscall.GetErrno() 71 } 72 syscall.Exitsyscall() 73 if r < 0 { 74 return errno 75 } 76 77 return nil 78 }