package net
import (
)
func ( context.Context, string, , sockaddr, string, func(string, string, syscall.RawConn) error) (*netFD, error) {
var int
switch {
case "unix":
= syscall.SOCK_STREAM
case "unixgram":
= syscall.SOCK_DGRAM
case "unixpacket":
= syscall.SOCK_SEQPACKET
default:
return nil, UnknownNetworkError()
}
switch {
case "dial":
if != nil && .isWildcard() {
= nil
}
if != nil && .isWildcard() {
= nil
}
if == nil && ( != syscall.SOCK_DGRAM || == nil) {
return nil, errMissingAddress
}
case "listen":
default:
return nil, errors.New("unknown mode: " + )
}
, := socket(, , syscall.AF_UNIX, , 0, false, , , )
if != nil {
return nil,
}
return , nil
}
func ( syscall.Sockaddr) Addr {
if , := .(*syscall.SockaddrUnix); {
return &UnixAddr{Name: .Name, Net: "unix"}
}
return nil
}
func ( syscall.Sockaddr) Addr {
if , := .(*syscall.SockaddrUnix); {
return &UnixAddr{Name: .Name, Net: "unixgram"}
}
return nil
}
func ( syscall.Sockaddr) Addr {
if , := .(*syscall.SockaddrUnix); {
return &UnixAddr{Name: .Name, Net: "unixpacket"}
}
return nil
}
func ( int) string {
switch {
case syscall.SOCK_STREAM:
return "unix"
case syscall.SOCK_DGRAM:
return "unixgram"
case syscall.SOCK_SEQPACKET:
return "unixpacket"
default:
panic("sotypeToNet unknown socket type")
}
}
func ( *UnixAddr) () int {
return syscall.AF_UNIX
}
func ( *UnixAddr) ( int) (syscall.Sockaddr, error) {
if == nil {
return nil, nil
}
return &syscall.SockaddrUnix{Name: .Name}, nil
}
func ( *UnixAddr) ( string) sockaddr {
return
}
func ( *UnixConn) ( []byte) (int, *UnixAddr, error) {
var *UnixAddr
, , := .fd.readFrom()
switch sa := .(type) {
case *syscall.SockaddrUnix:
if .Name != "" {
= &UnixAddr{Name: .Name, Net: sotypeToNet(.fd.sotype)}
}
}
return , ,
}
func ( *UnixConn) (, []byte) (, , int, *UnixAddr, error) {
var syscall.Sockaddr
, , , , = .fd.readMsg(, )
switch sa := .(type) {
case *syscall.SockaddrUnix:
if .Name != "" {
= &UnixAddr{Name: .Name, Net: sotypeToNet(.fd.sotype)}
}
}
return
}
func ( *UnixConn) ( []byte, *UnixAddr) (int, error) {
if .fd.isConnected {
return 0, ErrWriteToConnected
}
if == nil {
return 0, errMissingAddress
}
if .Net != sotypeToNet(.fd.sotype) {
return 0, syscall.EAFNOSUPPORT
}
:= &syscall.SockaddrUnix{Name: .Name}
return .fd.writeTo(, )
}
func ( *UnixConn) (, []byte, *UnixAddr) (, int, error) {
if .fd.sotype == syscall.SOCK_DGRAM && .fd.isConnected {
return 0, 0, ErrWriteToConnected
}
var syscall.Sockaddr
if != nil {
if .Net != sotypeToNet(.fd.sotype) {
return 0, 0, syscall.EAFNOSUPPORT
}
= &syscall.SockaddrUnix{Name: .Name}
}
return .fd.writeMsg(, , )
}
func ( *sysDialer) ( context.Context, , *UnixAddr) (*UnixConn, error) {
, := unixSocket(, .network, , , "dial", .Dialer.Control)
if != nil {
return nil,
}
return newUnixConn(), nil
}
func ( *UnixListener) () (*UnixConn, error) {
, := .fd.accept()
if != nil {
return nil,
}
return newUnixConn(), nil
}
func ( *UnixListener) () error {
.unlinkOnce.Do(func() {
if .path[0] != '@' && .unlink {
syscall.Unlink(.path)
}
})
return .fd.Close()
}
func ( *UnixListener) () (*os.File, error) {
, := .fd.dup()
if != nil {
return nil,
}
return , nil
}
func ( *UnixListener) ( bool) {
.unlink =
}
func ( *sysListener) ( context.Context, *UnixAddr) (*UnixListener, error) {
, := unixSocket(, .network, , nil, "listen", .ListenConfig.Control)
if != nil {
return nil,
}
return &UnixListener{fd: , path: .laddr.String(), unlink: true}, nil
}
func ( *sysListener) ( context.Context, *UnixAddr) (*UnixConn, error) {
, := unixSocket(, .network, , nil, "listen", .ListenConfig.Control)
if != nil {
return nil,
}
return newUnixConn(), nil
}