// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package unix import ( "internal/abi" "syscall" "unsafe" ) //go:cgo_import_dynamic libc_getgrouplist getgrouplist "/usr/lib/libSystem.B.dylib" func libc_getgrouplist_trampoline() func Getgrouplist(name *byte, gid uint32, gids *uint32, n *int32) error { _, _, errno := syscall_syscall6(abi.FuncPCABI0(libc_getgrouplist_trampoline), uintptr(unsafe.Pointer(name)), uintptr(gid), uintptr(unsafe.Pointer(gids)), uintptr(unsafe.Pointer(n)), 0, 0) if errno != 0 { return errno } return nil } const ( SC_GETGR_R_SIZE_MAX = 0x46 SC_GETPW_R_SIZE_MAX = 0x47 ) type Passwd struct { Name *byte Passwd *byte Uid uint32 // uid_t Gid uint32 // gid_t Change int64 // time_t Class *byte Gecos *byte Dir *byte Shell *byte Expire int64 // time_t } type Group struct { Name *byte Passwd *byte Gid uint32 // gid_t Mem **byte } //go:cgo_import_dynamic libc_getpwnam_r getpwnam_r "/usr/lib/libSystem.B.dylib" func libc_getpwnam_r_trampoline() func Getpwnam(name *byte, pwd *Passwd, buf *byte, size uintptr, result **Passwd) syscall.Errno { // Note: Returns an errno as its actual result, not in global errno. errno, _, _ := syscall_syscall6(abi.FuncPCABI0(libc_getpwnam_r_trampoline), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(pwd)), uintptr(unsafe.Pointer(buf)), size, uintptr(unsafe.Pointer(result)), 0) return syscall.Errno(errno) } //go:cgo_import_dynamic libc_getpwuid_r getpwuid_r "/usr/lib/libSystem.B.dylib" func libc_getpwuid_r_trampoline() func Getpwuid(uid uint32, pwd *Passwd, buf *byte, size uintptr, result **Passwd) syscall.Errno { // Note: Returns an errno as its actual result, not in global errno. errno, _, _ := syscall_syscall6(abi.FuncPCABI0(libc_getpwuid_r_trampoline), uintptr(uid), uintptr(unsafe.Pointer(pwd)), uintptr(unsafe.Pointer(buf)), size, uintptr(unsafe.Pointer(result)), 0) return syscall.Errno(errno) } //go:cgo_import_dynamic libc_getgrnam_r getgrnam_r "/usr/lib/libSystem.B.dylib" func libc_getgrnam_r_trampoline() func Getgrnam(name *byte, grp *Group, buf *byte, size uintptr, result **Group) syscall.Errno { // Note: Returns an errno as its actual result, not in global errno. errno, _, _ := syscall_syscall6(abi.FuncPCABI0(libc_getgrnam_r_trampoline), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(grp)), uintptr(unsafe.Pointer(buf)), size, uintptr(unsafe.Pointer(result)), 0) return syscall.Errno(errno) } //go:cgo_import_dynamic libc_getgrgid_r getgrgid_r "/usr/lib/libSystem.B.dylib" func libc_getgrgid_r_trampoline() func Getgrgid(gid uint32, grp *Group, buf *byte, size uintptr, result **Group) syscall.Errno { // Note: Returns an errno as its actual result, not in global errno. errno, _, _ := syscall_syscall6(abi.FuncPCABI0(libc_getgrgid_r_trampoline), uintptr(gid), uintptr(unsafe.Pointer(grp)), uintptr(unsafe.Pointer(buf)), size, uintptr(unsafe.Pointer(result)), 0) return syscall.Errno(errno) } //go:cgo_import_dynamic libc_sysconf sysconf "/usr/lib/libSystem.B.dylib" func libc_sysconf_trampoline() func Sysconf(key int32) int64 { val, _, errno := syscall_syscall6X(abi.FuncPCABI0(libc_sysconf_trampoline), uintptr(key), 0, 0, 0, 0, 0) if errno != 0 { return -1 } return int64(val) }