hare

[hare] The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

+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 };