|
@@ -4,19 +4,45 @@
|
|
|
package internet
|
|
package internet
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
|
|
+ "fmt"
|
|
|
"os"
|
|
"os"
|
|
|
|
|
+ "path"
|
|
|
"strconv"
|
|
"strconv"
|
|
|
"syscall"
|
|
"syscall"
|
|
|
|
|
|
|
|
"github.com/v2fly/v2ray-core/v5/common/net"
|
|
"github.com/v2fly/v2ray-core/v5/common/net"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
-func activate_socket(address string) (net.Listener, error) {
|
|
|
|
|
- fd, err := strconv.Atoi(address[8:])
|
|
|
|
|
|
|
+func activateSocket(address string) (net.Listener, error) {
|
|
|
|
|
+ fd, err := strconv.Atoi(path.Base(address))
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return nil, err
|
|
return nil, err
|
|
|
}
|
|
}
|
|
|
- // Ignore the fail of SetNonblock: it's merely an optimization so that Go can poll this fd.
|
|
|
|
|
- _ = syscall.SetNonblock(fd, true)
|
|
|
|
|
- return net.FileListener(os.NewFile(uintptr(fd), address))
|
|
|
|
|
|
|
+
|
|
|
|
|
+ err = syscall.SetNonblock(fd, true)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return nil, err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ acceptConn, err := syscall.GetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_ACCEPTCONN)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return nil, err
|
|
|
|
|
+ }
|
|
|
|
|
+ if acceptConn == 0 {
|
|
|
|
|
+ return nil, fmt.Errorf("socket '%s' has not been marked to accept connections", address)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ sockType, err := syscall.GetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_TYPE)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return nil, err
|
|
|
|
|
+ }
|
|
|
|
|
+ if sockType != syscall.SOCK_STREAM {
|
|
|
|
|
+ // XXX: currently only stream socks are supported
|
|
|
|
|
+ return nil, fmt.Errorf("socket '%s' is not a stream socket", address)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ file := os.NewFile(uintptr(fd), address)
|
|
|
|
|
+ defer file.Close()
|
|
|
|
|
+
|
|
|
|
|
+ return net.FileListener(file)
|
|
|
}
|
|
}
|