hare

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

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