package net
import (
)
type UnixAddr struct {
Name string
Net string
}
func ( *UnixAddr) () string {
return .Net
}
func ( *UnixAddr) () string {
if == nil {
return "<nil>"
}
return .Name
}
func ( *UnixAddr) () bool {
return == nil || .Name == ""
}
func ( *UnixAddr) () Addr {
if == nil {
return nil
}
return
}
func (, string) (*UnixAddr, error) {
switch {
case "unix", "unixgram", "unixpacket":
return &UnixAddr{Name: , Net: }, nil
default:
return nil, UnknownNetworkError()
}
}
type UnixConn struct {
conn
}
func ( *UnixConn) () (syscall.RawConn, error) {
if !.ok() {
return nil, syscall.EINVAL
}
return newRawConn(.fd)
}
func ( *UnixConn) () error {
if !.ok() {
return syscall.EINVAL
}
if := .fd.closeRead(); != nil {
return &OpError{Op: "close", Net: .fd.net, Source: .fd.laddr, Addr: .fd.raddr, Err: }
}
return nil
}
func ( *UnixConn) () error {
if !.ok() {
return syscall.EINVAL
}
if := .fd.closeWrite(); != nil {
return &OpError{Op: "close", Net: .fd.net, Source: .fd.laddr, Addr: .fd.raddr, Err: }
}
return nil
}
func ( *UnixConn) ( []byte) (int, *UnixAddr, error) {
if !.ok() {
return 0, nil, syscall.EINVAL
}
, , := .readFrom()
if != nil {
= &OpError{Op: "read", Net: .fd.net, Source: .fd.laddr, Addr: .fd.raddr, Err: }
}
return , ,
}
func ( *UnixConn) ( []byte) (int, Addr, error) {
if !.ok() {
return 0, nil, syscall.EINVAL
}
, , := .readFrom()
if != nil {
= &OpError{Op: "read", Net: .fd.net, Source: .fd.laddr, Addr: .fd.raddr, Err: }
}
if == nil {
return , nil,
}
return , ,
}
func ( *UnixConn) (, []byte) (, , int, *UnixAddr, error) {
if !.ok() {
return 0, 0, 0, nil, syscall.EINVAL
}
, , , , = .readMsg(, )
if != nil {
= &OpError{Op: "read", Net: .fd.net, Source: .fd.laddr, Addr: .fd.raddr, Err: }
}
return
}
func ( *UnixConn) ( []byte, *UnixAddr) (int, error) {
if !.ok() {
return 0, syscall.EINVAL
}
, := .writeTo(, )
if != nil {
= &OpError{Op: "write", Net: .fd.net, Source: .fd.laddr, Addr: .opAddr(), Err: }
}
return ,
}
func ( *UnixConn) ( []byte, Addr) (int, error) {
if !.ok() {
return 0, syscall.EINVAL
}
, := .(*UnixAddr)
if ! {
return 0, &OpError{Op: "write", Net: .fd.net, Source: .fd.laddr, Addr: , Err: syscall.EINVAL}
}
, := .writeTo(, )
if != nil {
= &OpError{Op: "write", Net: .fd.net, Source: .fd.laddr, Addr: .opAddr(), Err: }
}
return ,
}
func ( *UnixConn) (, []byte, *UnixAddr) (, int, error) {
if !.ok() {
return 0, 0, syscall.EINVAL
}
, , = .writeMsg(, , )
if != nil {
= &OpError{Op: "write", Net: .fd.net, Source: .fd.laddr, Addr: .opAddr(), Err: }
}
return
}
func ( *netFD) *UnixConn { return &UnixConn{conn{}} }
func ( string, , *UnixAddr) (*UnixConn, error) {
switch {
case "unix", "unixgram", "unixpacket":
default:
return nil, &OpError{Op: "dial", Net: , Source: .opAddr(), Addr: .opAddr(), Err: UnknownNetworkError()}
}
:= &sysDialer{network: , address: .String()}
, := .dialUnix(context.Background(), , )
if != nil {
return nil, &OpError{Op: "dial", Net: , Source: .opAddr(), Addr: .opAddr(), Err: }
}
return , nil
}
type UnixListener struct {
fd *netFD
path string
unlink bool
unlinkOnce sync.Once
}
func ( *UnixListener) () bool { return != nil && .fd != nil }
func ( *UnixListener) () (syscall.RawConn, error) {
if !.ok() {
return nil, syscall.EINVAL
}
return newRawListener(.fd)
}
func ( *UnixListener) () (*UnixConn, error) {
if !.ok() {
return nil, syscall.EINVAL
}
, := .accept()
if != nil {
return nil, &OpError{Op: "accept", Net: .fd.net, Source: nil, Addr: .fd.laddr, Err: }
}
return , nil
}
func ( *UnixListener) () (Conn, error) {
if !.ok() {
return nil, syscall.EINVAL
}
, := .accept()
if != nil {
return nil, &OpError{Op: "accept", Net: .fd.net, Source: nil, Addr: .fd.laddr, Err: }
}
return , nil
}
func ( *UnixListener) () error {
if !.ok() {
return syscall.EINVAL
}
if := .close(); != nil {
return &OpError{Op: "close", Net: .fd.net, Source: nil, Addr: .fd.laddr, Err: }
}
return nil
}
func ( *UnixListener) () Addr { return .fd.laddr }
func ( *UnixListener) ( time.Time) error {
if !.ok() {
return syscall.EINVAL
}
if := .fd.pfd.SetDeadline(); != nil {
return &OpError{Op: "set", Net: .fd.net, Source: nil, Addr: .fd.laddr, Err: }
}
return nil
}
func ( *UnixListener) () ( *os.File, error) {
if !.ok() {
return nil, syscall.EINVAL
}
, = .file()
if != nil {
= &OpError{Op: "file", Net: .fd.net, Source: nil, Addr: .fd.laddr, Err: }
}
return
}
func ( string, *UnixAddr) (*UnixListener, error) {
switch {
case "unix", "unixpacket":
default:
return nil, &OpError{Op: "listen", Net: , Source: nil, Addr: .opAddr(), Err: UnknownNetworkError()}
}
if == nil {
return nil, &OpError{Op: "listen", Net: , Source: nil, Addr: .opAddr(), Err: errMissingAddress}
}
:= &sysListener{network: , address: .String()}
, := .listenUnix(context.Background(), )
if != nil {
return nil, &OpError{Op: "listen", Net: , Source: nil, Addr: .opAddr(), Err: }
}
return , nil
}
func ( string, *UnixAddr) (*UnixConn, error) {
switch {
case "unixgram":
default:
return nil, &OpError{Op: "listen", Net: , Source: nil, Addr: .opAddr(), Err: UnknownNetworkError()}
}
if == nil {
return nil, &OpError{Op: "listen", Net: , Source: nil, Addr: nil, Err: errMissingAddress}
}
:= &sysListener{network: , address: .String()}
, := .listenUnixgram(context.Background(), )
if != nil {
return nil, &OpError{Op: "listen", Net: , Source: nil, Addr: .opAddr(), Err: }
}
return , nil
}