Source file src/net/fd_posix.go

     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         string
    25  	laddr       Addr
    26  	raddr       Addr
    27  }
    28  
    29  func (fd *netFD) name() string {
    30  	var ls, rs string
    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  

View as plain text