diff options
Diffstat (limited to 'vendor/golang.org/x/net/internal')
| -rw-r--r-- | vendor/golang.org/x/net/internal/socket/rawconn_msg.go | 48 | ||||
| -rw-r--r-- | vendor/golang.org/x/net/internal/socket/sys_stub.go | 6 | ||||
| -rw-r--r-- | vendor/golang.org/x/net/internal/socket/sys_unix.go | 101 | ||||
| -rw-r--r-- | vendor/golang.org/x/net/internal/socket/sys_windows.go | 7 | ||||
| -rw-r--r-- | vendor/golang.org/x/net/internal/socket/sys_zos_s390x.go | 38 | ||||
| -rw-r--r-- | vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go | 30 | ||||
| -rw-r--r-- | vendor/golang.org/x/net/internal/socket/zsys_freebsd_riscv64.go (renamed from vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go) | 8 | 
7 files changed, 151 insertions, 87 deletions
diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_msg.go b/vendor/golang.org/x/net/internal/socket/rawconn_msg.go index ba53f564b..f7d0b0d2b 100644 --- a/vendor/golang.org/x/net/internal/socket/rawconn_msg.go +++ b/vendor/golang.org/x/net/internal/socket/rawconn_msg.go @@ -8,22 +8,21 @@  package socket  import ( +	"net"  	"os"  )  func (c *Conn) recvMsg(m *Message, flags int) error {  	m.raceWrite() -	var h msghdr -	vs := make([]iovec, len(m.Buffers)) -	var sa []byte -	if c.network != "tcp" { -		sa = make([]byte, sizeofSockaddrInet6) -	} -	h.pack(vs, m.Buffers, m.OOB, sa) -	var operr error -	var n int +	var ( +		operr     error +		n         int +		oobn      int +		recvflags int +		from      net.Addr +	)  	fn := func(s uintptr) bool { -		n, operr = recvmsg(s, &h, flags) +		n, oobn, recvflags, from, operr = recvmsg(s, m.Buffers, m.OOB, flags, c.network)  		return ioComplete(flags, operr)  	}  	if err := c.c.Read(fn); err != nil { @@ -32,34 +31,21 @@ func (c *Conn) recvMsg(m *Message, flags int) error {  	if operr != nil {  		return os.NewSyscallError("recvmsg", operr)  	} -	if c.network != "tcp" { -		var err error -		m.Addr, err = parseInetAddr(sa[:], c.network) -		if err != nil { -			return err -		} -	} +	m.Addr = from  	m.N = n -	m.NN = h.controllen() -	m.Flags = h.flags() +	m.NN = oobn +	m.Flags = recvflags  	return nil  }  func (c *Conn) sendMsg(m *Message, flags int) error {  	m.raceRead() -	var h msghdr -	vs := make([]iovec, len(m.Buffers)) -	var sa []byte -	if m.Addr != nil { -		var a [sizeofSockaddrInet6]byte -		n := marshalInetAddr(m.Addr, a[:]) -		sa = a[:n] -	} -	h.pack(vs, m.Buffers, m.OOB, sa) -	var operr error -	var n int +	var ( +		operr error +		n     int +	)  	fn := func(s uintptr) bool { -		n, operr = sendmsg(s, &h, flags) +		n, operr = sendmsg(s, m.Buffers, m.OOB, m.Addr, flags)  		return ioComplete(flags, operr)  	}  	if err := c.c.Write(fn); err != nil { diff --git a/vendor/golang.org/x/net/internal/socket/sys_stub.go b/vendor/golang.org/x/net/internal/socket/sys_stub.go index 381e45e16..7cfb349c0 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_stub.go +++ b/vendor/golang.org/x/net/internal/socket/sys_stub.go @@ -36,11 +36,11 @@ func setsockopt(s uintptr, level, name int, b []byte) error {  	return errNotImplemented  } -func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { -	return 0, errNotImplemented +func recvmsg(s uintptr, buffers [][]byte, oob []byte, flags int, network string) (n, oobn int, recvflags int, from net.Addr, err error) { +	return 0, 0, 0, nil, errNotImplemented  } -func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { +func sendmsg(s uintptr, buffers [][]byte, oob []byte, to net.Addr, flags int) (int, error) {  	return 0, errNotImplemented  } diff --git a/vendor/golang.org/x/net/internal/socket/sys_unix.go b/vendor/golang.org/x/net/internal/socket/sys_unix.go index d203e2984..de823932b 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_unix.go +++ b/vendor/golang.org/x/net/internal/socket/sys_unix.go @@ -8,8 +8,10 @@  package socket  import ( -	"syscall" +	"net"  	"unsafe" + +	"golang.org/x/sys/unix"  )  //go:linkname syscall_getsockopt syscall.getsockopt @@ -18,12 +20,6 @@ func syscall_getsockopt(s, level, name int, val unsafe.Pointer, vallen *uint32)  //go:linkname syscall_setsockopt syscall.setsockopt  func syscall_setsockopt(s, level, name int, val unsafe.Pointer, vallen uintptr) error -//go:linkname syscall_recvmsg syscall.recvmsg -func syscall_recvmsg(s int, msg *syscall.Msghdr, flags int) (int, error) - -//go:linkname syscall_sendmsg syscall.sendmsg -func syscall_sendmsg(s int, msg *syscall.Msghdr, flags int) (int, error) -  func getsockopt(s uintptr, level, name int, b []byte) (int, error) {  	l := uint32(len(b))  	err := syscall_getsockopt(int(s), level, name, unsafe.Pointer(&b[0]), &l) @@ -34,10 +30,93 @@ func setsockopt(s uintptr, level, name int, b []byte) error {  	return syscall_setsockopt(int(s), level, name, unsafe.Pointer(&b[0]), uintptr(len(b)))  } -func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { -	return syscall_recvmsg(int(s), (*syscall.Msghdr)(unsafe.Pointer(h)), flags) +func recvmsg(s uintptr, buffers [][]byte, oob []byte, flags int, network string) (n, oobn int, recvflags int, from net.Addr, err error) { +	var unixFrom unix.Sockaddr +	n, oobn, recvflags, unixFrom, err = unix.RecvmsgBuffers(int(s), buffers, oob, flags) +	if unixFrom != nil { +		from = sockaddrToAddr(unixFrom, network) +	} +	return  } -func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { -	return syscall_sendmsg(int(s), (*syscall.Msghdr)(unsafe.Pointer(h)), flags) +func sendmsg(s uintptr, buffers [][]byte, oob []byte, to net.Addr, flags int) (int, error) { +	var unixTo unix.Sockaddr +	if to != nil { +		unixTo = addrToSockaddr(to) +	} +	return unix.SendmsgBuffers(int(s), buffers, oob, unixTo, flags) +} + +// addrToSockaddr converts a net.Addr to a unix.Sockaddr. +func addrToSockaddr(a net.Addr) unix.Sockaddr { +	var ( +		ip   net.IP +		port int +		zone string +	) +	switch a := a.(type) { +	case *net.TCPAddr: +		ip = a.IP +		port = a.Port +		zone = a.Zone +	case *net.UDPAddr: +		ip = a.IP +		port = a.Port +		zone = a.Zone +	case *net.IPAddr: +		ip = a.IP +		zone = a.Zone +	default: +		return nil +	} + +	if ip4 := ip.To4(); ip4 != nil { +		sa := unix.SockaddrInet4{Port: port} +		copy(sa.Addr[:], ip4) +		return &sa +	} + +	if ip6 := ip.To16(); ip6 != nil && ip.To4() == nil { +		sa := unix.SockaddrInet6{Port: port} +		copy(sa.Addr[:], ip6) +		if zone != "" { +			sa.ZoneId = uint32(zoneCache.index(zone)) +		} +		return &sa +	} + +	return nil +} + +// sockaddrToAddr converts a unix.Sockaddr to a net.Addr. +func sockaddrToAddr(sa unix.Sockaddr, network string) net.Addr { +	var ( +		ip   net.IP +		port int +		zone string +	) +	switch sa := sa.(type) { +	case *unix.SockaddrInet4: +		ip = make(net.IP, net.IPv4len) +		copy(ip, sa.Addr[:]) +		port = sa.Port +	case *unix.SockaddrInet6: +		ip = make(net.IP, net.IPv6len) +		copy(ip, sa.Addr[:]) +		port = sa.Port +		if sa.ZoneId > 0 { +			zone = zoneCache.name(int(sa.ZoneId)) +		} +	default: +		return nil +	} + +	switch network { +	case "tcp", "tcp4", "tcp6": +		return &net.TCPAddr{IP: ip, Port: port, Zone: zone} +	case "udp", "udp4", "udp6": +		return &net.UDPAddr{IP: ip, Port: port, Zone: zone} +	default: +		return &net.IPAddr{IP: ip, Zone: zone} +	}  } diff --git a/vendor/golang.org/x/net/internal/socket/sys_windows.go b/vendor/golang.org/x/net/internal/socket/sys_windows.go index 2de0d68c6..b738b89dd 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_windows.go +++ b/vendor/golang.org/x/net/internal/socket/sys_windows.go @@ -5,6 +5,7 @@  package socket  import ( +	"net"  	"syscall"  	"unsafe" @@ -37,11 +38,11 @@ func setsockopt(s uintptr, level, name int, b []byte) error {  	return syscall.Setsockopt(syscall.Handle(s), int32(level), int32(name), (*byte)(unsafe.Pointer(&b[0])), int32(len(b)))  } -func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { -	return 0, errNotImplemented +func recvmsg(s uintptr, buffers [][]byte, oob []byte, flags int, network string) (n, oobn int, recvflags int, from net.Addr, err error) { +	return 0, 0, 0, nil, errNotImplemented  } -func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { +func sendmsg(s uintptr, buffers [][]byte, oob []byte, to net.Addr, flags int) (int, error) {  	return 0, errNotImplemented  } diff --git a/vendor/golang.org/x/net/internal/socket/sys_zos_s390x.go b/vendor/golang.org/x/net/internal/socket/sys_zos_s390x.go index 1e38b9223..eaa896cb5 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_zos_s390x.go +++ b/vendor/golang.org/x/net/internal/socket/sys_zos_s390x.go @@ -5,6 +5,7 @@  package socket  import ( +	"net"  	"syscall"  	"unsafe"  ) @@ -27,12 +28,39 @@ func setsockopt(s uintptr, level, name int, b []byte) error {  	return errnoErr(errno)  } -func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { -	n, _, errno := syscall_syscall(syscall.SYS___RECVMSG_A, s, uintptr(unsafe.Pointer(h)), uintptr(flags)) -	return int(n), errnoErr(errno) +func recvmsg(s uintptr, buffers [][]byte, oob []byte, flags int, network string) (n, oobn int, recvflags int, from net.Addr, err error) { +	var h msghdr +	vs := make([]iovec, len(buffers)) +	var sa []byte +	if network != "tcp" { +		sa = make([]byte, sizeofSockaddrInet6) +	} +	h.pack(vs, buffers, oob, sa) +	sn, _, errno := syscall_syscall(syscall.SYS___RECVMSG_A, s, uintptr(unsafe.Pointer(&h)), uintptr(flags)) +	n = int(sn) +	oobn = h.controllen() +	recvflags = h.flags() +	err = errnoErr(errno) +	if network != "tcp" { +		var err2 error +		from, err2 = parseInetAddr(sa, network) +		if err2 != nil && err == nil { +			err = err2 +		} +	} +	return  } -func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { -	n, _, errno := syscall_syscall(syscall.SYS___SENDMSG_A, s, uintptr(unsafe.Pointer(h)), uintptr(flags)) +func sendmsg(s uintptr, buffers [][]byte, oob []byte, to net.Addr, flags int) (int, error) { +	var h msghdr +	vs := make([]iovec, len(buffers)) +	var sa []byte +	if to != nil { +		var a [sizeofSockaddrInet6]byte +		n := marshalInetAddr(to, a[:]) +		sa = a[:n] +	} +	h.pack(vs, buffers, oob, sa) +	n, _, errno := syscall_syscall(syscall.SYS___SENDMSG_A, s, uintptr(unsafe.Pointer(&h)), uintptr(flags))  	return int(n), errnoErr(errno)  } diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go deleted file mode 100644 index 5acf6db6e..000000000 --- a/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go +++ /dev/null @@ -1,30 +0,0 @@ -// Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs defs_darwin.go - -package socket - -type iovec struct { -	Base *byte -	Len  uint32 -} - -type msghdr struct { -	Name       *byte -	Namelen    uint32 -	Iov        *iovec -	Iovlen     int32 -	Control    *byte -	Controllen uint32 -	Flags      int32 -} - -type cmsghdr struct { -	Len   uint32 -	Level int32 -	Type  int32 -} - -const ( -	sizeofIovec  = 0x8 -	sizeofMsghdr = 0x1c -) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_riscv64.go index 5acf6db6e..965c0b28b 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_riscv64.go @@ -1,11 +1,11 @@  // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs defs_darwin.go +// cgo -godefs defs_freebsd.go  package socket  type iovec struct {  	Base *byte -	Len  uint32 +	Len  uint64  }  type msghdr struct { @@ -25,6 +25,6 @@ type cmsghdr struct {  }  const ( -	sizeofIovec  = 0x8 -	sizeofMsghdr = 0x1c +	sizeofIovec  = 0x10 +	sizeofMsghdr = 0x30  )  | 
