+linux.ha (1108B)
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_family = rt::AF_INET, 16 sin_port = endian::htonu16(port), 17 sin_addr = addr, 18 ... 19 }, 20 ... 21 }; 22 case let v6: addr6 => 23 return rt::sockaddr { 24 in6 = rt::sockaddr_in6 { 25 sin6_family = rt::AF_INET6, 26 sin6_port = endian::htonu16(port), 27 sin6_addr = rt::in6_addr { s6_addr = v6 }, 28 ... 29 }, 30 ... 31 }; 32 }; 33 }; 34 35 export fn from_native(a: rt::sockaddr) (addr, u16) = { 36 let family = a.in.sin_family; 37 switch (family) { 38 case rt::AF_INET => 39 let addr = a.in.sin_addr.s_addr; 40 return ( 41 [addr: u8, (addr >> 8): u8, (addr >> 16): u8, 42 (addr >> 24): u8]: addr4, 43 endian::ntohu16(a.in.sin_port) 44 ); 45 case rt::AF_INET6 => 46 return ( 47 a.in6.sin6_addr.s6_addr: addr6, 48 endian::ntohu16(a.in6.sin6_port) 49 ); 50 case => 51 abort("Wrong address family!"); 52 }; 53 };