File: %2Blinux.ha

package info (click to toggle)
hare 0.25.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,948 kB
  • sloc: asm: 1,264; makefile: 123; sh: 114; lisp: 101
file content (53 lines) | stat: -rw-r--r-- 1,108 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// SPDX-License-Identifier: MPL-2.0
// (c) Hare authors <https://harelang.org>

use endian;
use rt;

export fn to_native(a: addr, port: u16) rt::sockaddr = {
	match (a) {
	case let v4: addr4 =>
		const addr = rt::in_addr {
			s_addr = endian::host.getu32(v4),
		};
		return rt::sockaddr {
			in = rt::sockaddr_in {
				sin_family = rt::AF_INET,
				sin_port = endian::htonu16(port),
				sin_addr = addr,
				...
			},
			...
		};
	case let v6: addr6 =>
		return rt::sockaddr {
			in6 = rt::sockaddr_in6 {
				sin6_family = rt::AF_INET6,
				sin6_port = endian::htonu16(port),
				sin6_addr = rt::in6_addr { s6_addr = v6 },
				...
			},
			...
		};
	};
};

export fn from_native(a: rt::sockaddr) (addr, u16)  = {
	let family = a.in.sin_family;
	switch (family) {
	case rt::AF_INET =>
		let addr = a.in.sin_addr.s_addr;
		return (
			[addr: u8, (addr >> 8): u8, (addr >> 16): u8,
				(addr >> 24):  u8]: addr4,
			endian::ntohu16(a.in.sin_port)
		);
	case rt::AF_INET6 =>
		return (
			a.in6.sin6_addr.s6_addr: addr6,
			endian::ntohu16(a.in6.sin6_port)
		);
	case =>
		abort("Wrong address family!");
	};
};