Add UNIX address type support to NetworkAddress.
This commit is contained in:
parent
77eddebe45
commit
1edfc88e63
|
@ -239,10 +239,13 @@ struct NetworkAddress {
|
||||||
version (Windows) import core.sys.windows.winsock2;
|
version (Windows) import core.sys.windows.winsock2;
|
||||||
else import core.sys.posix.netinet.in_;
|
else import core.sys.posix.netinet.in_;
|
||||||
|
|
||||||
|
version(Posix) import core.sys.posix.sys.un : sockaddr_un;
|
||||||
|
|
||||||
@safe:
|
@safe:
|
||||||
|
|
||||||
private union {
|
private union {
|
||||||
sockaddr addr;
|
sockaddr addr;
|
||||||
|
version (Posix) sockaddr_un addr_unix;
|
||||||
sockaddr_in addr_ip4;
|
sockaddr_in addr_ip4;
|
||||||
sockaddr_in6 addr_ip6;
|
sockaddr_in6 addr_ip6;
|
||||||
}
|
}
|
||||||
|
@ -266,6 +269,13 @@ struct NetworkAddress {
|
||||||
assert(addr.nameLen >= sockaddr_in6.sizeof);
|
assert(addr.nameLen >= sockaddr_in6.sizeof);
|
||||||
*this.sockAddrInet6 = *cast(sockaddr_in6*)addr.name;
|
*this.sockAddrInet6 = *cast(sockaddr_in6*)addr.name;
|
||||||
break;
|
break;
|
||||||
|
version (Posix) {
|
||||||
|
case AddressFamily.UNIX:
|
||||||
|
this.family = AddressFamily.UNIX;
|
||||||
|
assert(addr.nameLen >= sockaddr_un.sizeof);
|
||||||
|
this.sockAddrUnix = *cast(sockaddr_un*)addr.name;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,6 +322,9 @@ struct NetworkAddress {
|
||||||
default: assert(false, "sockAddrLen() called for invalid address family.");
|
default: assert(false, "sockAddrLen() called for invalid address family.");
|
||||||
case AF_INET: return addr_ip4.sizeof;
|
case AF_INET: return addr_ip4.sizeof;
|
||||||
case AF_INET6: return addr_ip6.sizeof;
|
case AF_INET6: return addr_ip6.sizeof;
|
||||||
|
version (Posix) {
|
||||||
|
case AF_UNIX: return addr_unix.sizeof;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -323,6 +336,12 @@ struct NetworkAddress {
|
||||||
in { assert (family == AF_INET6); }
|
in { assert (family == AF_INET6); }
|
||||||
body { return &addr_ip6; }
|
body { return &addr_ip6; }
|
||||||
|
|
||||||
|
version (Posix) {
|
||||||
|
@property inout(sockaddr_un)* sockAddrUnix() inout pure nothrow
|
||||||
|
in { assert (family == AddressFamily.UNIX); }
|
||||||
|
body { return &addr_unix; }
|
||||||
|
}
|
||||||
|
|
||||||
/** Returns a string representation of the IP address
|
/** Returns a string representation of the IP address
|
||||||
*/
|
*/
|
||||||
string toAddressString()
|
string toAddressString()
|
||||||
|
@ -356,6 +375,15 @@ struct NetworkAddress {
|
||||||
sink.formattedWrite("%x", bigEndianToNative!ushort(_dummy));
|
sink.formattedWrite("%x", bigEndianToNative!ushort(_dummy));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
version (Posix) {
|
||||||
|
case AddressFamily.UNIX:
|
||||||
|
import std.traits : hasMember;
|
||||||
|
static if (hasMember!(sockaddr_un, "sun_len"))
|
||||||
|
sink.formattedWrite("%s",() @trusted { return cast(char[])addr_unix.sun_path[0..addr_unix.sun_len]; } ());
|
||||||
|
else
|
||||||
|
sink.formattedWrite("%s",() @trusted { return (cast(char*)addr_unix.sun_path.ptr).fromStringz; } ());
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -384,6 +412,9 @@ struct NetworkAddress {
|
||||||
toAddressString(sink);
|
toAddressString(sink);
|
||||||
sink.formattedWrite("]:%s", port);
|
sink.formattedWrite("]:%s", port);
|
||||||
break;
|
break;
|
||||||
|
case AddressFamily.UNIX:
|
||||||
|
toAddressString(sink);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue