Skip to content
Snippets Groups Projects
user_darwin.go 3.35 KiB
Newer Older
  • Learn to ignore specific revisions
  • // 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)
    }