+freebsd.ha (1352B)
1 // SPDX-License-Identifier: MPL-2.0 2 // (c) Hare authors <https://harelang.org> 3 4 use endian; 5 use rt; 6 7 export fn to_native(a: addr, port: u16) rt::sockaddr = { 8 match (a) { 9 case let v4: addr4 => 10 const addr = rt::in_addr { 11 s_addr = endian::host.getu32(v4), 12 }; 13 return rt::sockaddr { 14 in = rt::sockaddr_in { 15 sin_len = size(rt::in_addr): u8, 16 sin_family = rt::AF_INET, 17 sin_port = endian::htonu16(port), 18 sin_addr = addr, 19 ... 20 }, 21 ... 22 }; 23 case let v6: addr6 => 24 return rt::sockaddr { 25 in6 = rt::sockaddr_in6 { 26 sin6_len = size(rt::in6_addr): u8, 27 sin6_family = rt::AF_INET6, 28 sin6_port = endian::htonu16(port), 29 sin6_addr = rt::in6_addr { s6_addr = v6 }, 30 ... 31 }, 32 ... 33 }; 34 }; 35 }; 36 37 export fn from_native(a: rt::sockaddr) (addr, u16) = { 38 let family = a.in.sin_family; 39 switch (family) { 40 case rt::AF_INET => 41 let addr = a.in.sin_addr.s_addr; 42 return ( 43 [addr: u8, (addr >> 8): u8, (addr >> 16): u8, 44 (addr >> 24): u8]: addr4, 45 endian::ntohu16(a.in.sin_port) 46 ); 47 case rt::AF_INET6 => 48 return ( 49 a.in6.sin6_addr.s6_addr: addr6, 50 endian::ntohu16(a.in6.sin6_port) 51 ); 52 case => 53 abort("Wrong address family!"); 54 }; 55 }; 56 57 export fn native_addrlen(a: addr) u32 = { 58 match (a) { 59 case addr4 => 60 return size(rt::sockaddr_in): u32; 61 case addr6 => 62 return size(rt::sockaddr_in6): u32; 63 }; 64 };