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