arnaucube
arnaucube/mirror-to-giteaPublic Self-hosted repository
mirror-to-gitea/vendor/golang.org/x/sys/unix/syscall_illumos.go
vendor/golang.org/x/sys/unix/syscall_illumos.goRaw
  1// Copyright 2009 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
 10package unix
 11
 12import (
 13	"unsafe"
 14)
 15
 16func 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			// somehow Iovec.Base on illumos is (*int8), not (*byte)
 22			iovecs[i].Base = (*int8)(unsafe.Pointer(&b[0]))
 23		} else {
 24			iovecs[i].Base = (*int8)(unsafe.Pointer(&_zero))
 25		}
 26	}
 27	return iovecs
 28}
 29
 30//sys	readv(fd int, iovs []Iovec) (n int, err error)
 31
 32func Readv(fd int, iovs [][]byte) (n int, err error) {
 33	iovecs := bytes2iovec(iovs)
 34	n, err = readv(fd, iovecs)
 35	return n, err
 36}
 37
 38//sys	preadv(fd int, iovs []Iovec, off int64) (n int, err error)
 39
 40func Preadv(fd int, iovs [][]byte, off int64) (n int, err error) {
 41	iovecs := bytes2iovec(iovs)
 42	n, err = preadv(fd, iovecs, off)
 43	return n, err
 44}
 45
 46//sys	writev(fd int, iovs []Iovec) (n int, err error)
 47
 48func Writev(fd int, iovs [][]byte) (n int, err error) {
 49	iovecs := bytes2iovec(iovs)
 50	n, err = writev(fd, iovecs)
 51	return n, err
 52}
 53
 54//sys	pwritev(fd int, iovs []Iovec, off int64) (n int, err error)
 55
 56func Pwritev(fd int, iovs [][]byte, off int64) (n int, err error) {
 57	iovecs := bytes2iovec(iovs)
 58	n, err = pwritev(fd, iovecs, off)
 59	return n, err
 60}
 61
 62//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) = libsocket.accept4
 63
 64func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) {
 65	var rsa RawSockaddrAny
 66	var len _Socklen = SizeofSockaddrAny
 67	nfd, err = accept4(fd, &rsa, &len, flags)
 68	if err != nil {
 69		return
 70	}
 71	if len > SizeofSockaddrAny {
 72		panic("RawSockaddrAny too small")
 73	}
 74	sa, err = anyToSockaddr(fd, &rsa)
 75	if err != nil {
 76		Close(nfd)
 77		nfd = 0
 78	}
 79	return
 80}
 81
 82//sys	putmsg(fd int, clptr *strbuf, dataptr *strbuf, flags int) (err error)
 83
 84func Putmsg(fd int, cl []byte, data []byte, flags int) (err error) {
 85	var clp, datap *strbuf
 86	if len(cl) > 0 {
 87		clp = &strbuf{
 88			Len: int32(len(cl)),
 89			Buf: (*int8)(unsafe.Pointer(&cl[0])),
 90		}
 91	}
 92	if len(data) > 0 {
 93		datap = &strbuf{
 94			Len: int32(len(data)),
 95			Buf: (*int8)(unsafe.Pointer(&data[0])),
 96		}
 97	}
 98	return putmsg(fd, clp, datap, flags)
 99}
100
101//sys	getmsg(fd int, clptr *strbuf, dataptr *strbuf, flags *int) (err error)
102
103func Getmsg(fd int, cl []byte, data []byte) (retCl []byte, retData []byte, flags int, err error) {
104	var clp, datap *strbuf
105	if len(cl) > 0 {
106		clp = &strbuf{
107			Maxlen: int32(len(cl)),
108			Buf:    (*int8)(unsafe.Pointer(&cl[0])),
109		}
110	}
111	if len(data) > 0 {
112		datap = &strbuf{
113			Maxlen: int32(len(data)),
114			Buf:    (*int8)(unsafe.Pointer(&data[0])),
115		}
116	}
117
118	if err = getmsg(fd, clp, datap, &flags); err != nil {
119		return nil, nil, 0, err
120	}
121
122	if len(cl) > 0 {
123		retCl = cl[:clp.Len]
124	}
125	if len(data) > 0 {
126		retData = data[:datap.Len]
127	}
128	return retCl, retData, flags, nil
129}