sys_cloexec.go 1.0 KB

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