Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/wapython
Path: blob/main/core/kernel/src/wasm/posix/socket.zig
1068 views
1
pub fn keepalive() void {}
2
const std = @import("std");
3
const util = @import("util.zig");
4
5
// The upstream zig/wasi layer by default has a very badly crippled
6
// sockaddr struct defined with sa_data having size 0, so it is
7
// *impossible* to use. Thus -- just for importing socket.h --
8
// we temporarily set __wasilibc_unmodified_upstream. We patch
9
// cPython (Modules/socketmodule.h) and do the same thing there.
10
// The result is we get the
11
// non-WASI *normal* version of sockaddr. This is important to
12
// actually do both here and in cPython, since just attempting to
13
// cast, etc., is going to lead to random corruption.
14
15
// IMPORTANT: do not use this @cImport for error codes -- the "__wasilibc_unmodified_upstream" allows for all
16
// the SO constants, etc., but defines all the error codes incorrectly.
17
// Note that any c code that needs to use these has to be patched,
18
// similar to how we patch socketmodule.h. Be sure to only
19
// patch the import of socket.h, since error codes would also be
20
// messed up by setting __wasilibc_unmodified_upstream!!!
21
// **E.g., EINPROGRESS is changed from 28 to 115!**
22
23
const c = @cImport({
24
@cDefine("__wasilibc_unmodified_upstream", "1");
25
@cInclude("sys/socket.h");
26
});
27
28
// TODO: These scare me. if really used, I should move them to posix-wasm.h,
29
// define them myself, and so on. Touching __wasilibc_unmodified_upstream is
30
// VERY VERY bad.
31
pub const constants = .{ .c_import = c, .names = [_][:0]const u8{
32
"MSG_OOB",
33
"MSG_PEEK",
34
"MSG_WAITALL",
35
"MSG_DONTROUTE",
36
"SO_ACCEPTCONN",
37
"SO_ATTACH_BPF",
38
"SO_ATTACH_FILTER",
39
"SO_ATTACH_REUSEPORT_CBPF",
40
"SO_ATTACH_REUSEPORT_EBPF",
41
"SO_BINDTODEVICE",
42
"SO_BINDTOIFINDEX",
43
"SO_BPF_EXTENSIONS",
44
"SO_BROADCAST",
45
"SO_BSDCOMPAT",
46
"SO_BUSY_POLL",
47
"SO_CNX_ADVICE",
48
"SO_COOKIE",
49
"SO_DEBUG",
50
"SO_DETACH_BPF",
51
"SO_DETACH_FILTER",
52
"SO_DETACH_REUSEPORT_BPF",
53
"SO_DOMAIN",
54
"SO_DONTROUTE",
55
"SO_ERROR",
56
"SO_GET_FILTER",
57
"SO_INCOMING_CPU",
58
"SO_INCOMING_NAPI_ID",
59
"SO_KEEPALIVE",
60
"SO_LINGER",
61
"SO_LOCK_FILTER",
62
"SO_MARK",
63
"SO_MAX_PACING_RATE",
64
"SO_MEMINFO",
65
"SO_NOFCS",
66
"SO_NO_CHECK",
67
"SO_OOBINLINE",
68
"SO_PASSCRED",
69
"SO_PASSSEC",
70
"SO_PEEK_OFF",
71
"SO_PEERCRED",
72
"SO_PEERGROUPS",
73
"SO_PEERNAME",
74
"SO_PEERSEC",
75
"SO_PRIORITY",
76
"SO_PROTOCOL",
77
"SO_RCVBUF",
78
"SO_RCVBUFFORCE",
79
"SO_RCVLOWAT",
80
"SO_RCVTIMEO",
81
"SO_REUSEADDR",
82
"SO_REUSEPORT",
83
"SO_RXQ_OVFL",
84
"SO_SECURITY_AUTHENTICATION",
85
"SO_SECURITY_ENCRYPTION_NETWORK",
86
"SO_SECURITY_ENCRYPTION_TRANSPORT",
87
"SO_SELECT_ERR_QUEUE",
88
"SO_SNDBUF",
89
"SO_SNDBUFFORCE",
90
"SO_SNDLOWAT",
91
"SO_SNDTIMEO",
92
"SO_TIMESTAMP",
93
"SO_TIMESTAMPING",
94
"SO_TIMESTAMPNS",
95
"SO_TXTIME",
96
"SO_TYPE",
97
"SO_WIFI_STATUS",
98
"SO_ZEROCOPY",
99
} };
100
101
// sockaddr is this: struct { sa_family: u16, sa_data: [14]u8 };
102
103
export fn recv_sockaddr_sa_family(sockaddr: *c.sockaddr) u16 {
104
// std.debug.print("sockaddr = {}\n", .{sockaddr});
105
return sockaddr.sa_family;
106
}
107
108
// do NOT free the returned string - it's just a reference into sockaddr
109
export fn recv_sockaddr_sa_data(sockaddr: *c.sockaddr) [*]u8 {
110
return &(sockaddr.sa_data);
111
}
112
113