gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

syscall_illumos.go (1829B)


      1 // Copyright 2021 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 // illumos system calls not present on Solaris.
      6 
      7 //go:build amd64 && illumos
      8 // +build amd64,illumos
      9 
     10 package unix
     11 
     12 import (
     13 	"unsafe"
     14 )
     15 
     16 func bytes2iovec(bs [][]byte) []Iovec {
     17 	iovecs := make([]Iovec, len(bs))
     18 	for i, b := range bs {
     19 		iovecs[i].SetLen(len(b))
     20 		if len(b) > 0 {
     21 			iovecs[i].Base = &b[0]
     22 		} else {
     23 			iovecs[i].Base = (*byte)(unsafe.Pointer(&_zero))
     24 		}
     25 	}
     26 	return iovecs
     27 }
     28 
     29 //sys	readv(fd int, iovs []Iovec) (n int, err error)
     30 
     31 func Readv(fd int, iovs [][]byte) (n int, err error) {
     32 	iovecs := bytes2iovec(iovs)
     33 	n, err = readv(fd, iovecs)
     34 	return n, err
     35 }
     36 
     37 //sys	preadv(fd int, iovs []Iovec, off int64) (n int, err error)
     38 
     39 func Preadv(fd int, iovs [][]byte, off int64) (n int, err error) {
     40 	iovecs := bytes2iovec(iovs)
     41 	n, err = preadv(fd, iovecs, off)
     42 	return n, err
     43 }
     44 
     45 //sys	writev(fd int, iovs []Iovec) (n int, err error)
     46 
     47 func Writev(fd int, iovs [][]byte) (n int, err error) {
     48 	iovecs := bytes2iovec(iovs)
     49 	n, err = writev(fd, iovecs)
     50 	return n, err
     51 }
     52 
     53 //sys	pwritev(fd int, iovs []Iovec, off int64) (n int, err error)
     54 
     55 func Pwritev(fd int, iovs [][]byte, off int64) (n int, err error) {
     56 	iovecs := bytes2iovec(iovs)
     57 	n, err = pwritev(fd, iovecs, off)
     58 	return n, err
     59 }
     60 
     61 //sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) = libsocket.accept4
     62 
     63 func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) {
     64 	var rsa RawSockaddrAny
     65 	var len _Socklen = SizeofSockaddrAny
     66 	nfd, err = accept4(fd, &rsa, &len, flags)
     67 	if err != nil {
     68 		return
     69 	}
     70 	if len > SizeofSockaddrAny {
     71 		panic("RawSockaddrAny too small")
     72 	}
     73 	sa, err = anyToSockaddr(fd, &rsa)
     74 	if err != nil {
     75 		Close(nfd)
     76 		nfd = 0
     77 	}
     78 	return
     79 }