1
2
3
4
5
6
7
8 package socktest
9
10 import "syscall"
11
12
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