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  }