File: socket.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 (429 lines) | stat: -rw-r--r-- 13,111 bytes parent folder | download | duplicates (2)
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
// SPDX-License-Identifier: MPL-2.0
// (c) Hare authors <https://harelang.org>

export type sa_family_t = u16;
export type socklen_t = uint;

export type in_addr = struct {
	s_addr: u32
};

export type sockaddr_in = struct {
	sin_family: sa_family_t,
	sin_port: u16,
	sin_addr: in_addr,
	__pad: [16]u8,
};

export type in6_addr = struct {
	union {
		s6_addr: [16]u8,
		s6_addr16: [8]u16,
		s6_addr32: [4]u32,
	}
};

export type sockaddr_in6 = struct {
	sin6_family: sa_family_t,
	sin6_port: u16,
	sin6_flowinfo: u32,
	sin6_addr: in6_addr,
	sin6_scope_id: u32,
};

export def UNIX_PATH_MAX: size = 108;

export type sockaddr_un = struct {
	sun_family: sa_family_t,
	sun_path: [UNIX_PATH_MAX]u8,
};

export type sockaddr_nl = struct {
	nl_family: sa_family_t,
	nl_pad: u16,
	nl_pid: u32,
	nl_groups: u32,
};

export type sockaddr_ll = struct {
	sll_family: sa_family_t,
	sll_protocol: u16,
	sll_ifindex: int,
	sll_hatype: u16,
	sll_pkttype: u8,
	sll_halen: u8,
	sll_addr: [8]u8,
};

export type sockaddr = struct {
	union {
		in: sockaddr_in,
		in6: sockaddr_in6,
		un: sockaddr_un,
		nl: sockaddr_nl,
		ll: sockaddr_ll,
	},
};

export def SCM_RIGHTS: int = 0x01;
export def SCM_CREDENTIALS: int = 0x02;

export type msghdr = struct {
	msg_name: nullable *opaque,
	msg_namelen: u32,

	msg_iov: nullable *[*]iovec,
	msg_iovlen: size,

	msg_control: nullable *opaque,
	msg_controllen: size,

	msg_flags: int
};

export type cmsg = struct {
	hdr: cmsghdr,
	cmsg_data: [*]u8,
};

export type sock_filter = struct {
	__code: u16,
	__jt: u8,
	__jf: u8,
	__k: u32,
};

export type sock_fprog = struct {
	__len: u16,
	__filter: *[*]sock_filter,
};

// domain for socket(2)

// Unspecified
export def AF_UNSPEC: sa_family_t = 0;
// Unix domain sockets
export def AF_UNIX: sa_family_t = 1;
// POSIX name for AF_UNIX
export def AF_LOCAL: sa_family_t = 1;
// Internet IP Protocol
export def AF_INET: sa_family_t = 2;
// Amateur Radio AX.25
export def AF_AX25: sa_family_t = 3;
// Novell IPX
export def AF_IPX: sa_family_t = 4;
// AppleTalk DDP
export def AF_APPLETALK: sa_family_t = 5;
// Amateur Radio NET/ROM
export def AF_NETROM: sa_family_t = 6;
// Multiprotocol bridge
export def AF_BRIDGE: sa_family_t = 7;
// ATM PVCs
export def AF_ATMPVC: sa_family_t = 8;
// Reserved for X.25 project
export def AF_X25: sa_family_t = 9;
// IP version 6
export def AF_INET6: sa_family_t = 10;
// Amateur Radio X.25 PLP
export def AF_ROSE: sa_family_t = 11;
// Reserved for DECnet project
export def AF_DECnet: sa_family_t = 12;
// Reserved for 802.2LLC project
export def AF_NETBEUI: sa_family_t = 13;
// Security callback pseudo AF
export def AF_SECURITY: sa_family_t = 14;
// PF_KEY key management API
export def AF_KEY: sa_family_t = 15;
// Linux netlink API
export def AF_NETLINK: sa_family_t = 16;
// Alias to emulate 4.4BSD
export def AF_ROUTE: sa_family_t = AF_NETLINK;
// Packet family
export def AF_PACKET: sa_family_t = 17;
// Ash
export def AF_ASH: sa_family_t = 18;
// Acorn Econet
export def AF_ECONET: sa_family_t = 19;
// ATM SVCs
export def AF_ATMSVC: sa_family_t = 20;
// RDS sockets
export def AF_RDS: sa_family_t = 21;
// Linux SNA Project (nutters!)
export def AF_SNA: sa_family_t = 22;
// IRDA sockets
export def AF_IRDA: sa_family_t = 23;
// PPPoX sockets
export def AF_PPPOX: sa_family_t = 24;
// Wanpipe API Sockets
export def AF_WANPIPE: sa_family_t = 25;
// Linux LLC
export def AF_LLC: sa_family_t = 26;
// Native InfiniBand address
export def AF_IB: sa_family_t = 27;
// MPLS
export def AF_MPLS: sa_family_t = 28;
// Controller Area Network
export def AF_CAN: sa_family_t = 29;
// TIPC sockets
export def AF_TIPC: sa_family_t = 30;
// Bluetooth sockets
export def AF_BLUETOOTH: sa_family_t = 31;
// IUCV sockets
export def AF_IUCV: sa_family_t = 32;
// RxRPC sockets
export def AF_RXRPC: sa_family_t = 33;
// mISDN sockets
export def AF_ISDN: sa_family_t = 34;
// Phonet sockets
export def AF_PHONET: sa_family_t = 35;
// IEEE802154 sockets
export def AF_IEEE802154: sa_family_t = 36;
// CAIF sockets
export def AF_CAIF: sa_family_t = 37;
// Algorithm sockets
export def AF_ALG: sa_family_t = 38;
// NFC sockets
export def AF_NFC: sa_family_t = 39;
// vSockets
export def AF_VSOCK: sa_family_t = 40;
// Kernel Connection Multiplexor
export def AF_KCM: sa_family_t = 41;
// Qualcomm IPC Router
export def AF_QIPCRTR: sa_family_t = 42;
// smc sockets
export def AF_SMC: sa_family_t = 43;
// XDP sockets
export def AF_XDP: sa_family_t = 44;

// type for socket(2)
export def SOCK_STREAM: int = 1;
export def SOCK_DGRAM: int = 2;
export def SOCK_RAW: int = 3;
export def SOCK_RDM: int = 4;
export def SOCK_SEQPACKET: int = 5;
export def SOCK_DCCP: int = 6;
export def SOCK_PACKET: int = 10;
export def SOCK_NONBLOCK: int = 0o4000;
export def SOCK_CLOEXEC: int = 0o2000000;

// protocol for socket(2)
export def ETH_P_15: int = 0x88f7;
export def ETH_P_8021AD: int = 0x88a8;
export def ETH_P_8021AH: int = 0x88e7;
export def ETH_P_8021Q: int = 0x8100;
export def ETH_P_80221: int = 0x8917;
export def ETH_P_802_2: int = 0x4;
export def ETH_P_802_3: int = 0x1;
export def ETH_P_802_3_MIN: int = 0x600;
export def ETH_P_802_EX1: int = 0x88b5;
export def ETH_P_AARP: int = 0x80f3;
export def ETH_P_AF_IUCV: int = 0xfbfb;
export def ETH_P_ALL: int = 0x3;
export def ETH_P_AOE: int = 0x88a2;
export def ETH_P_ARCNET: int = 0x1a;
export def ETH_P_ARP: int = 0x806;
export def ETH_P_ATALK: int = 0x809b;
export def ETH_P_ATMFATE: int = 0x8884;
export def ETH_P_ATMMPOA: int = 0x884c;
export def ETH_P_AX25: int = 0x2;
export def ETH_P_BATMAN: int = 0x4305;
export def ETH_P_BPQ: int = 0x8ff;
export def ETH_P_CAIF: int = 0xf7;
export def ETH_P_CAN: int = 0xc;
export def ETH_P_CANFD: int = 0xd;
export def ETH_P_CANXL: int = 0xe;
export def ETH_P_CFM: int = 0x8902;
export def ETH_P_CONTROL: int = 0x16;
export def ETH_P_CUST: int = 0x6006;
export def ETH_P_DDCMP: int = 0x6;
export def ETH_P_DEC: int = 0x6000;
export def ETH_P_DIAG: int = 0x6005;
export def ETH_P_DNA_DL: int = 0x6001;
export def ETH_P_DNA_RC: int = 0x6002;
export def ETH_P_DNA_RT: int = 0x6003;
export def ETH_P_DSA: int = 0x1b;
export def ETH_P_DSA_8021Q: int = 0xdadb;
export def ETH_P_DSA_A5PSW: int = 0xe001;
export def ETH_P_ECONET: int = 0x18;
export def ETH_P_EDSA: int = 0xdada;
export def ETH_P_ERSPAN: int = 0x88be;
export def ETH_P_ERSPAN2: int = 0x22eb;
export def ETH_P_ETHERCAT: int = 0x88a4;
export def ETH_P_FCOE: int = 0x8906;
export def ETH_P_FIP: int = 0x8914;
export def ETH_P_HDLC: int = 0x19;
export def ETH_P_HSR: int = 0x892f;
export def ETH_P_IBOE: int = 0x8915;
export def ETH_P_IEEE802154: int = 0xf6;
export def ETH_P_IEEEPUP: int = 0xa00;
export def ETH_P_IEEEPUPAT: int = 0xa01;
export def ETH_P_IFE: int = 0xed3e;
export def ETH_P_IP: int = 0x800;
export def ETH_P_IPV6: int = 0x86dd;
export def ETH_P_IPX: int = 0x8137;
export def ETH_P_IRDA: int = 0x17;
export def ETH_P_LAT: int = 0x6004;
export def ETH_P_LINK_CTL: int = 0x886c;
export def ETH_P_LLDP: int = 0x88cc;
export def ETH_P_LOCALTALK: int = 0x9;
export def ETH_P_LOOP: int = 0x60;
export def ETH_P_LOOPBACK: int = 0x9000;
export def ETH_P_MACSEC: int = 0x88e5;
export def ETH_P_MAP: int = 0xf9;
export def ETH_P_MCTP: int = 0xfa;
export def ETH_P_MOBITEX: int = 0x15;
export def ETH_P_MPLS_MC: int = 0x8848;
export def ETH_P_MPLS_UC: int = 0x8847;
export def ETH_P_MRP: int = 0x88e3;
export def ETH_P_MVRP: int = 0x88f5;
export def ETH_P_NCSI: int = 0x88f8;
export def ETH_P_NSH: int = 0x894f;
export def ETH_P_PAE: int = 0x888e;
export def ETH_P_PAUSE: int = 0x8808;
export def ETH_P_PHONET: int = 0xf5;
export def ETH_P_PPPTALK: int = 0x10;
export def ETH_P_PPP_DISC: int = 0x8863;
export def ETH_P_PPP_MP: int = 0x8;
export def ETH_P_PPP_SES: int = 0x8864;
export def ETH_P_PREAUTH: int = 0x88c7;
export def ETH_P_PROFINET: int = 0x8892;
export def ETH_P_PRP: int = 0x88fb;
export def ETH_P_PUP: int = 0x200;
export def ETH_P_PUPAT: int = 0x201;
export def ETH_P_QINQ1: int = 0x9100;
export def ETH_P_QINQ2: int = 0x9200;
export def ETH_P_QINQ3: int = 0x9300;
export def ETH_P_RARP: int = 0x8035;
export def ETH_P_REALTEK: int = 0x8899;
export def ETH_P_SCA: int = 0x6007;
export def ETH_P_SLOW: int = 0x8809;
export def ETH_P_SNAP: int = 0x5;
export def ETH_P_TDLS: int = 0x890d;
export def ETH_P_TEB: int = 0x6558;
export def ETH_P_TIPC: int = 0x88ca;
export def ETH_P_TRAILER: int = 0x1c;
export def ETH_P_TR_802_2: int = 0x11;
export def ETH_P_TSN: int = 0x22f0;
export def ETH_P_WAN_PPP: int = 0x7;
export def ETH_P_WCCP: int = 0x883e;
export def ETH_P_X25: int = 0x805;
export def ETH_P_XDSA: int = 0xf8;

// Dummy protocol for TCP
export def IPPROTO_IP: int = 0;
// Internet Control Message Protocol
export def IPPROTO_ICMP: int = 1;
// Internet Group Management Protocol
export def IPPROTO_IGMP: int = 2;
// IPIP tunnels (older KA9Q tunnels use 94)
export def IPPROTO_IPIP: int = 4;
// Transmission Control Protocol
export def IPPROTO_TCP: int = 6;
// Exterior Gateway Protocol
export def IPPROTO_EGP: int = 8;
// PUP protocol
export def IPPROTO_PUP: int = 12;
// User Datagram Protocol
export def IPPROTO_UDP: int = 17;
// XNS IDP protocol
export def IPPROTO_IDP: int = 22;
// SO Transport Protocol Class 4
export def IPPROTO_TP: int = 29;
// Datagram Congestion Control Protocol
export def IPPROTO_DCCP: int = 33;
// IPv6-in-IPv4 tunnelling
export def IPPROTO_IPV6: int = 41;
// RSVP Protocol
export def IPPROTO_RSVP: int = 46;
// Cisco GRE tunnels (rfc 1701,1702)
export def IPPROTO_GRE: int = 47;
// Encapsulation Security Payload protocol
export def IPPROTO_ESP: int = 50;
// Authentication Header protocol
export def IPPROTO_AH: int = 51;
// ICMPv6
export def IPPROTO_ICMPV6: int = 58;
// Multicast Transport Protocol
export def IPPROTO_MTP: int = 92;
// IP option pseudo header for BEET
export def IPPROTO_BEETPH: int = 94;
// Encapsulation Header
export def IPPROTO_ENCAP: int = 98;
// Protocol Independent Multicast
export def IPPROTO_PIM: int = 103;
// Compression Header Protocol
export def IPPROTO_COMP: int = 108;
// Stream Control Transport Protocol
export def IPPROTO_SCTP: int = 132;
// UDP-Lite (RFC 3828)
export def IPPROTO_UDPLITE: int = 136;
// MPLS in IP (RFC 4023)
export def IPPROTO_MPLS: int = 137;
// Ethernet-within-IPv6 Encapsulation
export def IPPROTO_ETHERNET: int = 143;
// Raw IP packets
export def IPPROTO_RAW: int = 255;
// Multipath TCP connection
export def IPPROTO_MPTCP: int = 262;

// send/rcv flags
export def MSG_OOB: int = 1;
export def MSG_PEEK: int = 2;
export def MSG_DONTROUTE: int = 4;
export def MSG_TRYHARD: int = 4; // Synonym for MSG_DONTROUTE for DECnet
export def MSG_CTRUNC: int = 8;
export def MSG_PROBE: int = 0x10; // Do not send. Only probe path f.e. for MTU
export def MSG_TRUNC: int = 0x20;
export def MSG_DONTWAIT: int = 0x40; // Nonblocking io
export def MSG_EOR: int = 0x80; // End of record
export def MSG_WAITALL: int = 0x100; // Wait for a full request
export def MSG_FIN: int = 0x200;
export def MSG_SYN: int = 0x400;
export def MSG_CONFIRM: int = 0x800; // Confirm path validity
export def MSG_RST: int = 0x1000;
export def MSG_ERRQUEUE: int = 0x2000; // Fetch message from error queue
export def MSG_NOSIGNAL: int = 0x4000; // Do not generate SIGPIPE
export def MSG_MORE: int = 0x8000; // Sender will send more
export def MSG_WAITFORONE: int = 0x10000; // recvmmsg(): block until 1+ packets avail
export def MSG_SENDPAGE_NOPOLICY: int = 0x10000; // sendpage() internal : do no apply policy
export def MSG_SENDPAGE_NOTLAST: int = 0x20000; // sendpage() internal : not the last page
export def MSG_BATCH: int = 0x40000; // sendmmsg(): more messages coming
export def MSG_EOF: int = MSG_FIN;
export def MSG_NO_SHARED_FRAGS: int = 0x80000; // sendpage() internal : page frags are not shared
export def MSG_SENDPAGE_DECRYPTED: int = 0x100000; // sendpage() internal : page may carry * plain text and require encryption
export def MSG_ZEROCOPY: int = 0x4000000; // Use user data in kernel path
export def MSG_FASTOPEN: int = 0x20000000; // Send data in TCP SYN
export def MSG_CMSG_CLOEXEC: int = 0x40000000; // Set close_on_exec for file descriptor received through SCM_RIGHTS

// setsockopt levels
export def SOL_SOCKET: int = 1;

// setsockopt options
export def SO_DEBUG: int = 1;
export def SO_REUSEADDR: int = 2;
export def SO_TYPE: int = 3;
export def SO_ERROR: int = 4;
export def SO_DONTROUTE: int = 5;
export def SO_BROADCAST: int = 6;
export def SO_SNDBUF: int = 7;
export def SO_RCVBUF: int = 8;
export def SO_SNDBUFFORCE: int = 32;
export def SO_RCVBUFFORCE: int = 33;
export def SO_KEEPALIVE: int = 9;
export def SO_OOBINLINE: int = 10;
export def SO_NO_CHECK: int = 11;
export def SO_PRIORITY: int = 12;
export def SO_LINGER: int = 13;
export def SO_BSDCOMPAT: int = 14;
export def SO_REUSEPORT: int = 15;
export def SO_ATTACH_FILTER: int = 26;
export def SO_DETATCH_FILTER: int = 27;
export def SO_LOCK_FILTER: int = 44;

// the following differ on ppc
export def SO_PASSCRED: int = 16;
export def SO_PEERCRED: int = 17;
export def SO_RCVLOWAT: int = 18;
export def SO_SNDLOWAT: int = 19;
export def SO_RCVTIMEO_OLD: int = 20;
export def SO_SNDTIMEO_OLD: int = 21;