github.com/code-reading/golang@v0.0.0-20220303082512-ba5bc0e589a3/go/src/net/internal/socktest/sys_cloexec.go (about) 1 // Copyright 2015 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 dragonfly || freebsd || illumos || linux || netbsd || openbsd 6 // +build dragonfly freebsd illumos linux netbsd openbsd 7 8 package socktest 9 10 import "syscall" 11 12 // Accept4 wraps syscall.Accept4. 13 func (sw *Switch) Accept4(s, flags int) (ns int, sa syscall.Sockaddr, err error) { 14 so := sw.sockso(s) 15 if so == nil { 16 return syscall.Accept4(s, flags) 17 } 18 sw.fmu.RLock() 19 f := sw.fltab[FilterAccept] 20 sw.fmu.RUnlock() 21 22 af, err := f.apply(so) 23 if err != nil { 24 return -1, nil, err 25 } 26 ns, sa, so.Err = syscall.Accept4(s, flags) 27 if err = af.apply(so); err != nil { 28 if so.Err == nil { 29 syscall.Close(ns) 30 } 31 return -1, nil, err 32 } 33 34 sw.smu.Lock() 35 defer sw.smu.Unlock() 36 if so.Err != nil { 37 sw.stats.getLocked(so.Cookie).AcceptFailed++ 38 return -1, nil, so.Err 39 } 40 nso := sw.addLocked(ns, so.Cookie.Family(), so.Cookie.Type(), so.Cookie.Protocol()) 41 sw.stats.getLocked(nso.Cookie).Accepted++ 42 return ns, sa, nil 43 }