Source file src/internal/syscall/unix/net_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  const (
    14  	AI_CANONNAME = 0x2
    15  	AI_ALL       = 0x100
    16  	AI_V4MAPPED  = 0x800
    17  	AI_MASK      = 0x1407
    18  
    19  	EAI_ADDRFAMILY = 1
    20  	EAI_AGAIN      = 2
    21  	EAI_NODATA     = 7
    22  	EAI_NONAME     = 8
    23  	EAI_SERVICE    = 9
    24  	EAI_SYSTEM     = 11
    25  	EAI_OVERFLOW   = 14
    26  
    27  	NI_NAMEREQD = 4
    28  )
    29  
    30  type Addrinfo struct {
    31  	Flags     int32
    32  	Family    int32
    33  	Socktype  int32
    34  	Protocol  int32
    35  	Addrlen   uint32
    36  	Canonname *byte
    37  	Addr      *syscall.RawSockaddr
    38  	Next      *Addrinfo
    39  }
    40  
    41  //go:cgo_ldflag "-lresolv"
    42  
    43  //go:cgo_import_dynamic libc_getaddrinfo getaddrinfo "/usr/lib/libSystem.B.dylib"
    44  func libc_getaddrinfo_trampoline()
    45  
    46  func Getaddrinfo(hostname, servname *byte, hints *Addrinfo, res **Addrinfo) (int, error) {
    47  	gerrno, _, errno := syscall_syscall6(abi.FuncPCABI0(libc_getaddrinfo_trampoline),
    48  		uintptr(unsafe.Pointer(hostname)),
    49  		uintptr(unsafe.Pointer(servname)),
    50  		uintptr(unsafe.Pointer(hints)),
    51  		uintptr(unsafe.Pointer(res)),
    52  		0,
    53  		0)
    54  	var err error
    55  	if errno != 0 {
    56  		err = errno
    57  	}
    58  	return int(gerrno), err
    59  }
    60  
    61  //go:cgo_import_dynamic libc_freeaddrinfo freeaddrinfo "/usr/lib/libSystem.B.dylib"
    62  func libc_freeaddrinfo_trampoline()
    63  
    64  func Freeaddrinfo(ai *Addrinfo) {
    65  	syscall_syscall6(abi.FuncPCABI0(libc_freeaddrinfo_trampoline),
    66  		uintptr(unsafe.Pointer(ai)),
    67  		0, 0, 0, 0, 0)
    68  }
    69  
    70  //go:cgo_import_dynamic libc_getnameinfo getnameinfo "/usr/lib/libSystem.B.dylib"
    71  func libc_getnameinfo_trampoline()
    72  
    73  func Getnameinfo(sa *syscall.RawSockaddr, salen int, host *byte, hostlen int, serv *byte, servlen int, flags int) (int, error) {
    74  	gerrno, _, errno := syscall_syscall9(abi.FuncPCABI0(libc_getnameinfo_trampoline),
    75  		uintptr(unsafe.Pointer(sa)),
    76  		uintptr(salen),
    77  		uintptr(unsafe.Pointer(host)),
    78  		uintptr(hostlen),
    79  		uintptr(unsafe.Pointer(serv)),
    80  		uintptr(servlen),
    81  		uintptr(flags),
    82  		0,
    83  		0)
    84  	var err error
    85  	if errno != 0 {
    86  		err = errno
    87  	}
    88  	return int(gerrno), err
    89  }
    90  
    91  //go:cgo_import_dynamic libc_gai_strerror gai_strerror "/usr/lib/libSystem.B.dylib"
    92  func libc_gai_strerror_trampoline()
    93  
    94  func GaiStrerror(ecode int) string {
    95  	r1, _, _ := syscall_syscall(abi.FuncPCABI0(libc_gai_strerror_trampoline),
    96  		uintptr(ecode),
    97  		0, 0)
    98  	return GoString((*byte)(unsafe.Pointer(r1)))
    99  }
   100  
   101  // Implemented in the runtime package.
   102  func gostring(*byte) string
   103  
   104  func GoString(p *byte) string {
   105  	return gostring(p)
   106  }
   107  
   108  //go:linkname syscall_syscall syscall.syscall
   109  func syscall_syscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)
   110  
   111  //go:linkname syscall_syscallPtr syscall.syscallPtr
   112  func syscall_syscallPtr(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)
   113  
   114  //go:linkname syscall_syscall6 syscall.syscall6
   115  func syscall_syscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
   116  
   117  //go:linkname syscall_syscall6X syscall.syscall6X
   118  func syscall_syscall6X(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
   119  
   120  //go:linkname syscall_syscall9 syscall.syscall9
   121  func syscall_syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
   122  
   123  type ResState struct {
   124  	unexported [69]uintptr
   125  }
   126  
   127  //go:cgo_import_dynamic libresolv_res_9_ninit res_9_ninit "/usr/lib/libresolv.9.dylib"
   128  func libresolv_res_9_ninit_trampoline()
   129  
   130  func ResNinit(state *ResState) error {
   131  	_, _, errno := syscall_syscall(abi.FuncPCABI0(libresolv_res_9_ninit_trampoline),
   132  		uintptr(unsafe.Pointer(state)),
   133  		0, 0)
   134  	if errno != 0 {
   135  		return errno
   136  	}
   137  	return nil
   138  }
   139  
   140  //go:cgo_import_dynamic libresolv_res_9_nclose res_9_nclose "/usr/lib/libresolv.9.dylib"
   141  func libresolv_res_9_nclose_trampoline()
   142  
   143  func ResNclose(state *ResState) {
   144  	syscall_syscall(abi.FuncPCABI0(libresolv_res_9_nclose_trampoline),
   145  		uintptr(unsafe.Pointer(state)),
   146  		0, 0)
   147  }
   148  
   149  //go:cgo_import_dynamic libresolv_res_9_nsearch res_9_nsearch "/usr/lib/libresolv.9.dylib"
   150  func libresolv_res_9_nsearch_trampoline()
   151  
   152  func ResNsearch(state *ResState, dname *byte, class, typ int, ans *byte, anslen int) (int, error) {
   153  	r1, _, errno := syscall_syscall6(abi.FuncPCABI0(libresolv_res_9_nsearch_trampoline),
   154  		uintptr(unsafe.Pointer(state)),
   155  		uintptr(unsafe.Pointer(dname)),
   156  		uintptr(class),
   157  		uintptr(typ),
   158  		uintptr(unsafe.Pointer(ans)),
   159  		uintptr(anslen))
   160  	if errno != 0 {
   161  		return 0, errno
   162  	}
   163  	return int(int32(r1)), nil
   164  }
   165  

View as plain text