This commit is contained in:
ge
2026-05-01 23:03:05 +03:00
parent 04a644869e
commit ed674e41e1
10 changed files with 430 additions and 412 deletions
+22 -12
View File
@@ -30,25 +30,32 @@ pub fn SocketAddr.new_ipv4(addr [4]u8, port u16) SocketAddr {
return sock_addr
}
@[params]
pub struct Inet6SocketAddrParams {
pub:
flow_info u32
scope_id u32
}
// SocketAddr.new_ipv6 creates new AF_INET6 socket address.
// addr must be set in network (big-endian) byte order.
// Use `find_network_interface()` to get an integer scope_id from its string representation.
pub fn SocketAddr.new_ipv6(addr [16]u8, port u16, flow_info u32, scope_id u32) SocketAddr {
pub fn SocketAddr.new_ipv6(addr [16]u8, port u16, params Inet6SocketAddrParams) SocketAddr {
mut sock_addr := unsafe { SocketAddr.new(af_inet6, 28) }
unsafe {
sock_addr.write(binary.big_endian_get_u16(port)) or {}
sock_addr.write(binary.big_endian_get_u32(flow_info)) or {}
sock_addr.write(binary.big_endian_get_u32(params.flow_info)) or {}
sock_addr.write(addr[..]) or {}
sock_addr.write(binary.big_endian_get_u32(scope_id)) or {}
sock_addr.write(binary.big_endian_get_u32(params.scope_id)) or {}
}
return sock_addr
}
// SocketAddr.new_unix creates new AF_UNIX socket address with given path. The path must
// fit in platform dependent const `max_unix_path_len` value.
// fit in platform dependent `max_unix_path_len` const value.
pub fn SocketAddr.new_unix(path string) !SocketAddr {
if path.len > max_unix_path_len {
return error('Too long path to socket')
return error('too long path to socket, max length is ${max_unix_path_len}')
}
mut sock_addr := unsafe { SocketAddr.new(af_unix, usize(max_unix_path_len) + 2) }
unsafe {
@@ -141,7 +148,7 @@ pub fn SocketAddr.from_ptr_copy(ptr voidptr, size isize) !SocketAddr {
}
// SocketAddr.from_ptr creates new socket address from specified pointer.
// Note: The data is reused, not copied. See also SocketAddr.from_ptr_copy().
// Note: Data is reused, not copied.
@[unsafe]
pub fn SocketAddr.from_ptr(ptr voidptr, size isize) !SocketAddr {
if isnil(ptr) {
@@ -164,8 +171,8 @@ pub fn (a SocketAddr) family() AddrFamily {
return f
}
// is_empty returns true if socket address is unspecified the data pointer is nil or
// data contains only zeros. Empty address cannot be used in `bind` and `connect` calls.
// is_empty returns true if socket address is unspecified: the data pointer is nil or socket
// address data is zero. Empty address cannot be used in `bind()` and `connect()` calls.
pub fn (a SocketAddr) is_empty() bool {
if isnil(a.data) {
return true
@@ -216,10 +223,13 @@ pub fn (a SocketAddr) size() u32 {
}
// str returns the string representation of socket address.
// Supported address families are AF_INET, AF_INET6, and AF_UNIX.
// Examples: '172.16.16.132:1080', '[fdf1:72d1:0033:0000:0000:0000:0000:0247]:25535',
// '/run/app.sock'. For others a string like 'SocketAddr(0x00000000)' will be returned.
// See also `translate_name()`.
// Only AF_UNIX, AF_INET, and AF_INET6 are supported. str will return a string
// consisting of the address and port number separated by a colon, or the absolute
// path to the socket file. The IPv6 address will be returned in expanded form and
// enclosed in square brackets. For all other address families, str will return a
// string of the form `SocketAddr(0x00000000)` with the socket address data pointer
// in brackets.
// Note: See also `name_info()`.
pub fn (a SocketAddr) str() string {
match a.family() {
af_inet {