fd_posix.mx raw

   1  // Copyright 2020 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  //go:build unix || windows
   6  
   7  package net
   8  
   9  import (
  10  	"internal/poll"
  11  	"runtime"
  12  	"syscall"
  13  	"time"
  14  )
  15  
  16  // Network file descriptor.
  17  type netFD struct {
  18  	pfd poll.FD
  19  
  20  	// immutable until Close
  21  	family      int
  22  	sotype      int
  23  	isConnected bool // handshake completed or use of association with peer
  24  	net         []byte
  25  	laddr       Addr
  26  	raddr       Addr
  27  }
  28  
  29  func (fd *netFD) name() []byte {
  30  	var ls, rs []byte
  31  	if fd.laddr != nil {
  32  		ls = fd.laddr.String()
  33  	}
  34  	if fd.raddr != nil {
  35  		rs = fd.raddr.String()
  36  	}
  37  	return fd.net + ":" + ls + "->" + rs
  38  }
  39  
  40  func (fd *netFD) setAddr(laddr, raddr Addr) {
  41  	fd.laddr = laddr
  42  	fd.raddr = raddr
  43  	// TODO Replace with runtime.AddCleanup.
  44  	runtime.SetFinalizer(fd, (*netFD).Close)
  45  }
  46  
  47  func (fd *netFD) Close() error {
  48  	// TODO Replace with runtime.AddCleanup.
  49  	runtime.SetFinalizer(fd, nil)
  50  	return fd.pfd.Close()
  51  }
  52  
  53  func (fd *netFD) shutdown(how int) error {
  54  	err := fd.pfd.Shutdown(how)
  55  	runtime.KeepAlive(fd)
  56  	return wrapSyscallError("shutdown", err)
  57  }
  58  
  59  func (fd *netFD) closeRead() error {
  60  	return fd.shutdown(syscall.SHUT_RD)
  61  }
  62  
  63  func (fd *netFD) closeWrite() error {
  64  	return fd.shutdown(syscall.SHUT_WR)
  65  }
  66  
  67  func (fd *netFD) Read(p []byte) (n int, err error) {
  68  	n, err = fd.pfd.Read(p)
  69  	runtime.KeepAlive(fd)
  70  	return n, wrapSyscallError(readSyscallName, err)
  71  }
  72  
  73  func (fd *netFD) readFrom(p []byte) (n int, sa syscall.Sockaddr, err error) {
  74  	n, sa, err = fd.pfd.ReadFrom(p)
  75  	runtime.KeepAlive(fd)
  76  	return n, sa, wrapSyscallError(readFromSyscallName, err)
  77  }
  78  func (fd *netFD) readFromInet4(p []byte, from *syscall.SockaddrInet4) (n int, err error) {
  79  	n, err = fd.pfd.ReadFromInet4(p, from)
  80  	runtime.KeepAlive(fd)
  81  	return n, wrapSyscallError(readFromSyscallName, err)
  82  }
  83  
  84  func (fd *netFD) readFromInet6(p []byte, from *syscall.SockaddrInet6) (n int, err error) {
  85  	n, err = fd.pfd.ReadFromInet6(p, from)
  86  	runtime.KeepAlive(fd)
  87  	return n, wrapSyscallError(readFromSyscallName, err)
  88  }
  89  
  90  func (fd *netFD) readMsg(p []byte, oob []byte, flags int) (n, oobn, retflags int, sa syscall.Sockaddr, err error) {
  91  	n, oobn, retflags, sa, err = fd.pfd.ReadMsg(p, oob, flags)
  92  	runtime.KeepAlive(fd)
  93  	return n, oobn, retflags, sa, wrapSyscallError(readMsgSyscallName, err)
  94  }
  95  
  96  func (fd *netFD) readMsgInet4(p []byte, oob []byte, flags int, sa *syscall.SockaddrInet4) (n, oobn, retflags int, err error) {
  97  	n, oobn, retflags, err = fd.pfd.ReadMsgInet4(p, oob, flags, sa)
  98  	runtime.KeepAlive(fd)
  99  	return n, oobn, retflags, wrapSyscallError(readMsgSyscallName, err)
 100  }
 101  
 102  func (fd *netFD) readMsgInet6(p []byte, oob []byte, flags int, sa *syscall.SockaddrInet6) (n, oobn, retflags int, err error) {
 103  	n, oobn, retflags, err = fd.pfd.ReadMsgInet6(p, oob, flags, sa)
 104  	runtime.KeepAlive(fd)
 105  	return n, oobn, retflags, wrapSyscallError(readMsgSyscallName, err)
 106  }
 107  
 108  func (fd *netFD) Write(p []byte) (nn int, err error) {
 109  	nn, err = fd.pfd.Write(p)
 110  	runtime.KeepAlive(fd)
 111  	return nn, wrapSyscallError(writeSyscallName, err)
 112  }
 113  
 114  func (fd *netFD) writeTo(p []byte, sa syscall.Sockaddr) (n int, err error) {
 115  	n, err = fd.pfd.WriteTo(p, sa)
 116  	runtime.KeepAlive(fd)
 117  	return n, wrapSyscallError(writeToSyscallName, err)
 118  }
 119  
 120  func (fd *netFD) writeToInet4(p []byte, sa *syscall.SockaddrInet4) (n int, err error) {
 121  	n, err = fd.pfd.WriteToInet4(p, sa)
 122  	runtime.KeepAlive(fd)
 123  	return n, wrapSyscallError(writeToSyscallName, err)
 124  }
 125  
 126  func (fd *netFD) writeToInet6(p []byte, sa *syscall.SockaddrInet6) (n int, err error) {
 127  	n, err = fd.pfd.WriteToInet6(p, sa)
 128  	runtime.KeepAlive(fd)
 129  	return n, wrapSyscallError(writeToSyscallName, err)
 130  }
 131  
 132  func (fd *netFD) writeMsg(p []byte, oob []byte, sa syscall.Sockaddr) (n int, oobn int, err error) {
 133  	n, oobn, err = fd.pfd.WriteMsg(p, oob, sa)
 134  	runtime.KeepAlive(fd)
 135  	return n, oobn, wrapSyscallError(writeMsgSyscallName, err)
 136  }
 137  
 138  func (fd *netFD) writeMsgInet4(p []byte, oob []byte, sa *syscall.SockaddrInet4) (n int, oobn int, err error) {
 139  	n, oobn, err = fd.pfd.WriteMsgInet4(p, oob, sa)
 140  	runtime.KeepAlive(fd)
 141  	return n, oobn, wrapSyscallError(writeMsgSyscallName, err)
 142  }
 143  
 144  func (fd *netFD) writeMsgInet6(p []byte, oob []byte, sa *syscall.SockaddrInet6) (n int, oobn int, err error) {
 145  	n, oobn, err = fd.pfd.WriteMsgInet6(p, oob, sa)
 146  	runtime.KeepAlive(fd)
 147  	return n, oobn, wrapSyscallError(writeMsgSyscallName, err)
 148  }
 149  
 150  func (fd *netFD) SetDeadline(t time.Time) error {
 151  	return fd.pfd.SetDeadline(t)
 152  }
 153  
 154  func (fd *netFD) SetReadDeadline(t time.Time) error {
 155  	return fd.pfd.SetReadDeadline(t)
 156  }
 157  
 158  func (fd *netFD) SetWriteDeadline(t time.Time) error {
 159  	return fd.pfd.SetWriteDeadline(t)
 160  }
 161