at_darwin.mx raw

   1  // Copyright 2024 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 darwin
   6  
   7  package unix
   8  
   9  import (
  10  	"internal/abi"
  11  	"syscall"
  12  	"unsafe"
  13  )
  14  
  15  func libc_readlinkat_trampoline()
  16  
  17  //go:cgo_import_dynamic libc_readlinkat readlinkat "/usr/lib/libSystem.B.dylib"
  18  
  19  func Readlinkat(dirfd int, path string, buf []byte) (int, error) {
  20  	p0, err := syscall.BytePtrFromString(path)
  21  	if err != nil {
  22  		return 0, err
  23  	}
  24  	var p1 unsafe.Pointer
  25  	if len(buf) > 0 {
  26  		p1 = unsafe.Pointer(&buf[0])
  27  	} else {
  28  		p1 = unsafe.Pointer(&_zero)
  29  	}
  30  	n, _, errno := syscall_syscall6(abi.FuncPCABI0(libc_readlinkat_trampoline),
  31  		uintptr(dirfd),
  32  		uintptr(unsafe.Pointer(p0)),
  33  		uintptr(p1),
  34  		uintptr(len(buf)),
  35  		0,
  36  		0)
  37  	if errno != 0 {
  38  		return 0, errno
  39  	}
  40  	return int(n), nil
  41  }
  42  
  43  func libc_mkdirat_trampoline()
  44  
  45  //go:cgo_import_dynamic libc_mkdirat mkdirat "/usr/lib/libSystem.B.dylib"
  46  
  47  func Mkdirat(dirfd int, path string, mode uint32) error {
  48  	p, err := syscall.BytePtrFromString(path)
  49  	if err != nil {
  50  		return err
  51  	}
  52  	_, _, errno := syscall_syscall(abi.FuncPCABI0(libc_mkdirat_trampoline),
  53  		uintptr(dirfd),
  54  		uintptr(unsafe.Pointer(p)),
  55  		uintptr(mode))
  56  	if errno != 0 {
  57  		return errno
  58  	}
  59  	return nil
  60  }
  61  
  62  func libc_fchmodat_trampoline()
  63  
  64  //go:cgo_import_dynamic libc_fchmodat fchmodat "/usr/lib/libSystem.B.dylib"
  65  
  66  func Fchmodat(dirfd int, path string, mode uint32, flags int) error {
  67  	p, err := syscall.BytePtrFromString(path)
  68  	if err != nil {
  69  		return err
  70  	}
  71  	_, _, errno := syscall_syscall6(abi.FuncPCABI0(libc_fchmodat_trampoline),
  72  		uintptr(dirfd),
  73  		uintptr(unsafe.Pointer(p)),
  74  		uintptr(mode),
  75  		uintptr(flags),
  76  		0,
  77  		0)
  78  	if errno != 0 {
  79  		return errno
  80  	}
  81  	return nil
  82  }
  83  
  84  func libc_fchownat_trampoline()
  85  
  86  //go:cgo_import_dynamic libc_fchownat fchownat "/usr/lib/libSystem.B.dylib"
  87  
  88  func Fchownat(dirfd int, path string, uid, gid int, flags int) error {
  89  	p, err := syscall.BytePtrFromString(path)
  90  	if err != nil {
  91  		return err
  92  	}
  93  	_, _, errno := syscall_syscall6(abi.FuncPCABI0(libc_fchownat_trampoline),
  94  		uintptr(dirfd),
  95  		uintptr(unsafe.Pointer(p)),
  96  		uintptr(uid),
  97  		uintptr(gid),
  98  		uintptr(flags),
  99  		0)
 100  	if errno != 0 {
 101  		return errno
 102  	}
 103  	return nil
 104  }
 105  
 106  func libc_renameat_trampoline()
 107  
 108  //go:cgo_import_dynamic libc_renameat renameat "/usr/lib/libSystem.B.dylib"
 109  
 110  func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) error {
 111  	oldp, err := syscall.BytePtrFromString(oldpath)
 112  	if err != nil {
 113  		return err
 114  	}
 115  	newp, err := syscall.BytePtrFromString(newpath)
 116  	if err != nil {
 117  		return err
 118  	}
 119  	_, _, errno := syscall_syscall6(abi.FuncPCABI0(libc_renameat_trampoline),
 120  		uintptr(olddirfd),
 121  		uintptr(unsafe.Pointer(oldp)),
 122  		uintptr(newdirfd),
 123  		uintptr(unsafe.Pointer(newp)),
 124  		0,
 125  		0)
 126  	if errno != 0 {
 127  		return errno
 128  	}
 129  	return nil
 130  }
 131  
 132  func libc_linkat_trampoline()
 133  
 134  //go:cgo_import_dynamic libc_linkat linkat "/usr/lib/libSystem.B.dylib"
 135  
 136  func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flag int) error {
 137  	oldp, err := syscall.BytePtrFromString(oldpath)
 138  	if err != nil {
 139  		return err
 140  	}
 141  	newp, err := syscall.BytePtrFromString(newpath)
 142  	if err != nil {
 143  		return err
 144  	}
 145  	_, _, errno := syscall_syscall6(abi.FuncPCABI0(libc_linkat_trampoline),
 146  		uintptr(olddirfd),
 147  		uintptr(unsafe.Pointer(oldp)),
 148  		uintptr(newdirfd),
 149  		uintptr(unsafe.Pointer(newp)),
 150  		uintptr(flag),
 151  		0)
 152  	if errno != 0 {
 153  		return errno
 154  	}
 155  	return nil
 156  }
 157  
 158  func libc_symlinkat_trampoline()
 159  
 160  //go:cgo_import_dynamic libc_symlinkat symlinkat "/usr/lib/libSystem.B.dylib"
 161  
 162  func Symlinkat(oldpath string, newdirfd int, newpath string) error {
 163  	oldp, err := syscall.BytePtrFromString(oldpath)
 164  	if err != nil {
 165  		return err
 166  	}
 167  	newp, err := syscall.BytePtrFromString(newpath)
 168  	if err != nil {
 169  		return err
 170  	}
 171  	_, _, errno := syscall_syscall6(abi.FuncPCABI0(libc_symlinkat_trampoline),
 172  		uintptr(unsafe.Pointer(oldp)),
 173  		uintptr(newdirfd),
 174  		uintptr(unsafe.Pointer(newp)),
 175  		0,
 176  		0,
 177  		0)
 178  	if errno != 0 {
 179  		return errno
 180  	}
 181  	return nil
 182  }
 183