github.com/code-reading/golang@v0.0.0-20220303082512-ba5bc0e589a3/go/src/net/fd_posix.go (about) 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 aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows 6 // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows 7 8 package net 9 10 import ( 11 "internal/poll" 12 "runtime" 13 "syscall" 14 "time" 15 ) 16 17 // Network file descriptor. 18 type netFD struct { 19 pfd poll.FD 20 21 // immutable until Close 22 family int 23 sotype int 24 isConnected bool // handshake completed or use of association with peer 25 net string 26 laddr Addr 27 raddr Addr 28 } 29 30 func (fd *netFD) setAddr(laddr, raddr Addr) { 31 fd.laddr = laddr 32 fd.raddr = raddr 33 runtime.SetFinalizer(fd, (*netFD).Close) 34 } 35 36 func (fd *netFD) Close() error { 37 runtime.SetFinalizer(fd, nil) 38 return fd.pfd.Close() 39 } 40 41 func (fd *netFD) shutdown(how int) error { 42 err := fd.pfd.Shutdown(how) 43 runtime.KeepAlive(fd) 44 return wrapSyscallError("shutdown", err) 45 } 46 47 func (fd *netFD) closeRead() error { 48 return fd.shutdown(syscall.SHUT_RD) 49 } 50 51 func (fd *netFD) closeWrite() error { 52 return fd.shutdown(syscall.SHUT_WR) 53 } 54 55 func (fd *netFD) Read(p []byte) (n int, err error) { 56 n, err = fd.pfd.Read(p) 57 runtime.KeepAlive(fd) 58 return n, wrapSyscallError(readSyscallName, err) 59 } 60 61 func (fd *netFD) readFrom(p []byte) (n int, sa syscall.Sockaddr, err error) { 62 n, sa, err = fd.pfd.ReadFrom(p) 63 runtime.KeepAlive(fd) 64 return n, sa, wrapSyscallError(readFromSyscallName, err) 65 } 66 67 func (fd *netFD) readMsg(p []byte, oob []byte, flags int) (n, oobn, retflags int, sa syscall.Sockaddr, err error) { 68 n, oobn, retflags, sa, err = fd.pfd.ReadMsg(p, oob, flags) 69 runtime.KeepAlive(fd) 70 return n, oobn, retflags, sa, wrapSyscallError(readMsgSyscallName, err) 71 } 72 73 func (fd *netFD) Write(p []byte) (nn int, err error) { 74 nn, err = fd.pfd.Write(p) 75 runtime.KeepAlive(fd) 76 return nn, wrapSyscallError(writeSyscallName, err) 77 } 78 79 func (fd *netFD) writeTo(p []byte, sa syscall.Sockaddr) (n int, err error) { 80 n, err = fd.pfd.WriteTo(p, sa) 81 runtime.KeepAlive(fd) 82 return n, wrapSyscallError(writeToSyscallName, err) 83 } 84 85 func (fd *netFD) writeMsg(p []byte, oob []byte, sa syscall.Sockaddr) (n int, oobn int, err error) { 86 n, oobn, err = fd.pfd.WriteMsg(p, oob, sa) 87 runtime.KeepAlive(fd) 88 return n, oobn, wrapSyscallError(writeMsgSyscallName, err) 89 } 90 91 func (fd *netFD) SetDeadline(t time.Time) error { 92 return fd.pfd.SetDeadline(t) 93 } 94 95 func (fd *netFD) SetReadDeadline(t time.Time) error { 96 return fd.pfd.SetReadDeadline(t) 97 } 98 99 func (fd *netFD) SetWriteDeadline(t time.Time) error { 100 return fd.pfd.SetWriteDeadline(t) 101 }