1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-09-19 18:36:10 -04:00

apply control func to activated sockets

This commit is contained in:
Misaki Kasumi 2024-09-03 01:56:20 +08:00 committed by Xiaokang Wang (Shelikhoo)
parent 9bee648078
commit 3d07f686a5
3 changed files with 40 additions and 19 deletions

View File

@ -8,6 +8,6 @@ import (
"github.com/v2fly/v2ray-core/v5/common/net"
)
func activateSocket(address string) (net.Listener, error) {
func activateSocket(address string, f func(network, address string, fd uintptr)) (net.Listener, error) {
return nil, fmt.Errorf("socket activation is not supported on this platform")
}

View File

@ -13,7 +13,7 @@ import (
"github.com/v2fly/v2ray-core/v5/common/net"
)
func activateSocket(address string) (net.Listener, error) {
func activateSocket(address string, f func(network, address string, fd uintptr)) (net.Listener, error) {
fd, err := strconv.Atoi(path.Base(address))
if err != nil {
return nil, err
@ -41,7 +41,22 @@ func activateSocket(address string) (net.Listener, error) {
return nil, fmt.Errorf("socket '%s' is not a stream socket", address)
}
file := os.NewFile(uintptr(fd), address)
ufd := uintptr(fd)
sa, err := syscall.Getsockname(fd)
if err != nil {
return nil, err
}
switch sa := sa.(type) {
case *syscall.SockaddrInet4:
addr := net.TCPAddr{IP: sa.Addr[:], Port: sa.Port, Zone: ""}
f("tcp4", addr.String(), ufd)
case *syscall.SockaddrInet6:
addr := net.TCPAddr{IP: sa.Addr[:], Port: sa.Port, Zone: strconv.Itoa(int(sa.ZoneId))}
f("tcp6", addr.String(), ufd)
}
file := os.NewFile(ufd, address)
defer file.Close()
return net.FileListener(file)

View File

@ -36,9 +36,8 @@ func (l *combinedListener) Close() error {
return l.Listener.Close()
}
func getControlFunc(ctx context.Context, sockopt *SocketConfig, controllers []controller) func(network, address string, c syscall.RawConn) error {
return func(network, address string, c syscall.RawConn) error {
return c.Control(func(fd uintptr) {
func getRawControlFunc(network, address string, ctx context.Context, sockopt *SocketConfig, controllers []controller) func(fd uintptr) {
return func(fd uintptr) {
if sockopt != nil {
if err := applyInboundSocketOptions(network, fd, sockopt); err != nil {
newError("failed to apply socket options to incoming connection").Base(err).WriteToLog(session.ExportIDToError(ctx))
@ -52,7 +51,12 @@ func getControlFunc(ctx context.Context, sockopt *SocketConfig, controllers []co
newError("failed to apply external controller").Base(err).WriteToLog(session.ExportIDToError(ctx))
}
}
})
}
}
func getControlFunc(ctx context.Context, sockopt *SocketConfig, controllers []controller) func(network, address string, c syscall.RawConn) error {
return func(network, address string, c syscall.RawConn) error {
return c.Control(getRawControlFunc(network, address, ctx, sockopt, controllers))
}
}
@ -97,7 +101,9 @@ func (dl *DefaultListener) Listen(ctx context.Context, addr net.Addr, sockopt *S
}
} else if strings.HasPrefix(address, "/dev/fd/") {
// socket activation
l, err = activateSocket(address)
l, err = activateSocket(address, func(network, address string, fd uintptr) {
getRawControlFunc(network, address, ctx, sockopt, dl.controllers)(fd)
})
if err != nil {
return nil, err
}