sys_solaris.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435
  1. // Copyright 2017 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. package socket
  5. import (
  6. "syscall"
  7. "unsafe"
  8. )
  9. //go:cgo_import_dynamic libc___xnet_getsockopt __xnet_getsockopt "libsocket.so"
  10. //go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so"
  11. //go:linkname procGetsockopt libc___xnet_getsockopt
  12. //go:linkname procSetsockopt libc_setsockopt
  13. var (
  14. procGetsockopt uintptr
  15. procSetsockopt uintptr
  16. )
  17. func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno)
  18. func rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno)
  19. func getsockopt(s uintptr, level, name int, b []byte) (int, error) {
  20. l := uint32(len(b))
  21. _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procGetsockopt)), 5, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0)
  22. return int(l), errnoErr(errno)
  23. }
  24. func setsockopt(s uintptr, level, name int, b []byte) error {
  25. _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procSetsockopt)), 5, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0)
  26. return errnoErr(errno)
  27. }