"time"
)
-// A sockaddr represents a TCP, UDP, IP network endpoint address that
-// can be converted into a syscall.Sockaddr.
+// A sockaddr represents a TCP, UDP, IP or Unix network endpoint
+// address that can be converted into a syscall.Sockaddr.
type sockaddr interface {
Addr
family() int
return a.Name
}
-func (a *UnixAddr) toAddr() Addr {
- if a == nil { // nil *UnixAddr
- return nil // nil interface
- }
- return a
-}
-
// ResolveUnixAddr parses addr as a Unix domain socket address.
// The string net gives the network name, "unix", "unixgram" or
// "unixpacket".
"time"
)
-func (a *UnixAddr) isUnnamed() bool {
- if a == nil || a.Name == "" {
- return true
- }
- return false
-}
-
func unixSocket(net string, laddr, raddr *UnixAddr, mode string, deadline time.Time) (*netFD, error) {
var sotype int
switch net {
var la, ra syscall.Sockaddr
switch mode {
case "dial":
- if !laddr.isUnnamed() {
+ if !laddr.isWildcard() {
la = &syscall.SockaddrUnix{Name: laddr.Name}
}
if raddr != nil {
ra = &syscall.SockaddrUnix{Name: raddr.Name}
- } else if sotype != syscall.SOCK_DGRAM || laddr.isUnnamed() {
+ } else if sotype != syscall.SOCK_DGRAM || laddr.isWildcard() {
return nil, &OpError{Op: mode, Net: net, Err: errMissingAddress}
}
case "listen":
}
}
+func (a *UnixAddr) family() int {
+ return syscall.AF_UNIX
+}
+
+// isWildcard reports whether a is a wildcard address.
+func (a *UnixAddr) isWildcard() bool {
+ return a == nil || a.Name == ""
+}
+
+func (a *UnixAddr) sockaddr(family int) (syscall.Sockaddr, error) {
+ if a == nil {
+ return nil, nil
+ }
+ return &syscall.SockaddrUnix{Name: a.Name}, nil
+}
+
+func (a *UnixAddr) toAddr() sockaddr {
+ if a == nil {
+ return nil
+ }
+ return a
+}
+
// UnixConn is an implementation of the Conn interface for connections
// to Unix domain sockets.
type UnixConn struct {