Black Lives Matter. Support the Equal Justice Initiative.

Source file src/net/internal/socktest/sys_cloexec.go

Documentation: net/internal/socktest

     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  }
    44  

View as plain text