Source file src/internal/syscall/unix/user_darwin.go

     1  // Copyright 2022 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  package unix
     6  
     7  import (
     8  	"internal/abi"
     9  	"syscall"
    10  	"unsafe"
    11  )
    12  
    13  //go:cgo_import_dynamic libc_getgrouplist getgrouplist "/usr/lib/libSystem.B.dylib"
    14  func libc_getgrouplist_trampoline()
    15  
    16  func Getgrouplist(name *byte, gid uint32, gids *uint32, n *int32) error {
    17  	_, _, errno := syscall_syscall6(abi.FuncPCABI0(libc_getgrouplist_trampoline),
    18  		uintptr(unsafe.Pointer(name)), uintptr(gid), uintptr(unsafe.Pointer(gids)),
    19  		uintptr(unsafe.Pointer(n)), 0, 0)
    20  	if errno != 0 {
    21  		return errno
    22  	}
    23  	return nil
    24  }
    25  
    26  const (
    27  	SC_GETGR_R_SIZE_MAX = 0x46
    28  	SC_GETPW_R_SIZE_MAX = 0x47
    29  )
    30  
    31  type Passwd struct {
    32  	Name   *byte
    33  	Passwd *byte
    34  	Uid    uint32 // uid_t
    35  	Gid    uint32 // gid_t
    36  	Change int64  // time_t
    37  	Class  *byte
    38  	Gecos  *byte
    39  	Dir    *byte
    40  	Shell  *byte
    41  	Expire int64 // time_t
    42  }
    43  
    44  type Group struct {
    45  	Name   *byte
    46  	Passwd *byte
    47  	Gid    uint32 // gid_t
    48  	Mem    **byte
    49  }
    50  
    51  //go:cgo_import_dynamic libc_getpwnam_r getpwnam_r  "/usr/lib/libSystem.B.dylib"
    52  func libc_getpwnam_r_trampoline()
    53  
    54  func Getpwnam(name *byte, pwd *Passwd, buf *byte, size uintptr, result **Passwd) syscall.Errno {
    55  	// Note: Returns an errno as its actual result, not in global errno.
    56  	errno, _, _ := syscall_syscall6(abi.FuncPCABI0(libc_getpwnam_r_trampoline),
    57  		uintptr(unsafe.Pointer(name)),
    58  		uintptr(unsafe.Pointer(pwd)),
    59  		uintptr(unsafe.Pointer(buf)),
    60  		size,
    61  		uintptr(unsafe.Pointer(result)),
    62  		0)
    63  	return syscall.Errno(errno)
    64  }
    65  
    66  //go:cgo_import_dynamic libc_getpwuid_r getpwuid_r  "/usr/lib/libSystem.B.dylib"
    67  func libc_getpwuid_r_trampoline()
    68  
    69  func Getpwuid(uid uint32, pwd *Passwd, buf *byte, size uintptr, result **Passwd) syscall.Errno {
    70  	// Note: Returns an errno as its actual result, not in global errno.
    71  	errno, _, _ := syscall_syscall6(abi.FuncPCABI0(libc_getpwuid_r_trampoline),
    72  		uintptr(uid),
    73  		uintptr(unsafe.Pointer(pwd)),
    74  		uintptr(unsafe.Pointer(buf)),
    75  		size,
    76  		uintptr(unsafe.Pointer(result)),
    77  		0)
    78  	return syscall.Errno(errno)
    79  }
    80  
    81  //go:cgo_import_dynamic libc_getgrnam_r getgrnam_r  "/usr/lib/libSystem.B.dylib"
    82  func libc_getgrnam_r_trampoline()
    83  
    84  func Getgrnam(name *byte, grp *Group, buf *byte, size uintptr, result **Group) syscall.Errno {
    85  	// Note: Returns an errno as its actual result, not in global errno.
    86  	errno, _, _ := syscall_syscall6(abi.FuncPCABI0(libc_getgrnam_r_trampoline),
    87  		uintptr(unsafe.Pointer(name)),
    88  		uintptr(unsafe.Pointer(grp)),
    89  		uintptr(unsafe.Pointer(buf)),
    90  		size,
    91  		uintptr(unsafe.Pointer(result)),
    92  		0)
    93  	return syscall.Errno(errno)
    94  }
    95  
    96  //go:cgo_import_dynamic libc_getgrgid_r getgrgid_r  "/usr/lib/libSystem.B.dylib"
    97  func libc_getgrgid_r_trampoline()
    98  
    99  func Getgrgid(gid uint32, grp *Group, buf *byte, size uintptr, result **Group) syscall.Errno {
   100  	// Note: Returns an errno as its actual result, not in global errno.
   101  	errno, _, _ := syscall_syscall6(abi.FuncPCABI0(libc_getgrgid_r_trampoline),
   102  		uintptr(gid),
   103  		uintptr(unsafe.Pointer(grp)),
   104  		uintptr(unsafe.Pointer(buf)),
   105  		size,
   106  		uintptr(unsafe.Pointer(result)),
   107  		0)
   108  	return syscall.Errno(errno)
   109  }
   110  
   111  //go:cgo_import_dynamic libc_sysconf sysconf "/usr/lib/libSystem.B.dylib"
   112  func libc_sysconf_trampoline()
   113  
   114  func Sysconf(key int32) int64 {
   115  	val, _, errno := syscall_syscall6X(abi.FuncPCABI0(libc_sysconf_trampoline),
   116  		uintptr(key), 0, 0, 0, 0, 0)
   117  	if errno != 0 {
   118  		return -1
   119  	}
   120  	return int64(val)
   121  }
   122  

View as plain text