@ai-ecoverse/wasm-gawk 5.4.1-1 → 5.4.1-3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/gawk CHANGED
@@ -263,8 +263,7 @@ function initRuntime() {
263
263
  runtimeInitialized = true;
264
264
 
265
265
  // Begin ATINITS hooks
266
- SOCKFS.root = FS.mount(SOCKFS, {}, null);
267
- if (!Module['noFSInit'] && !FS.initialized) FS.init();
266
+ if (!Module['noFSInit'] && !FS.initialized) FS.init();
268
267
  TTY.init();
269
268
  PIPEFS.root = FS.mount(PIPEFS, {}, null);
270
269
  // End ATINITS hooks
@@ -660,20 +659,6 @@ async function createWasm() {
660
659
  };
661
660
  var ___call_sighandler = (fp, sig) => getWasmTableEntry(fp)(sig);
662
661
 
663
- var initRandomFill = () => {
664
- // This block is not needed on v19+ since crypto.getRandomValues is builtin
665
- if (ENVIRONMENT_IS_NODE) {
666
- var nodeCrypto = require('crypto');
667
- return (view) => nodeCrypto.randomFillSync(view);
668
- }
669
-
670
- return (view) => crypto.getRandomValues(view);
671
- };
672
- var randomFill = (view) => {
673
- // Lazily init on the first invocation.
674
- (randomFill = initRandomFill())(view);
675
- };
676
-
677
662
  var PATH = {
678
663
  isAbs:(path) => path.charAt(0) === '/',
679
664
  splitPath:(filename) => {
@@ -735,6 +720,21 @@ async function createWasm() {
735
720
  join2:(l, r) => PATH.normalize(l + '/' + r),
736
721
  };
737
722
 
723
+ var initRandomFill = () => {
724
+ // This block is not needed on v19+ since crypto.getRandomValues is builtin
725
+ if (ENVIRONMENT_IS_NODE) {
726
+ var nodeCrypto = require('crypto');
727
+ return (view) => nodeCrypto.randomFillSync(view);
728
+ }
729
+
730
+ return (view) => crypto.getRandomValues(view);
731
+ };
732
+ var randomFill = (view) => {
733
+ // Lazily init on the first invocation.
734
+ (randomFill = initRandomFill())(view);
735
+ };
736
+
737
+
738
738
 
739
739
  var PATH_FS = {
740
740
  resolve:(...args) => {
@@ -1560,8 +1560,10 @@ async function createWasm() {
1560
1560
  path = FS.cwd() + '/' + path;
1561
1561
  }
1562
1562
 
1563
- // limit max consecutive symlinks to 40 (SYMLOOP_MAX).
1564
- linkloop: for (var nlinks = 0; nlinks < 40; nlinks++) {
1563
+ // limit max consecutive symlinks to 40 (SYMLOOP_MAX): pass 0 follows
1564
+ // none, so 40 follows take 41 passes and the 41st follow is ELOOP, as
1565
+ // on Linux (homescoop#461).
1566
+ linkloop: for (var nlinks = 0; nlinks <= 40; nlinks++) {
1565
1567
  // split the absolute path
1566
1568
  var parts = path.split('/').filter((p) => !!p);
1567
1569
 
@@ -3071,960 +3073,6 @@ async function createWasm() {
3071
3073
  return node;
3072
3074
  },
3073
3075
  };
3074
- var SOCKFS = {
3075
- websocketArgs:{
3076
- },
3077
- callbacks:{
3078
- },
3079
- on(event, callback) {
3080
- SOCKFS.callbacks[event] = callback;
3081
- },
3082
- emit(event, param) {
3083
- SOCKFS.callbacks[event]?.(param);
3084
- },
3085
- mount(mount) {
3086
- // The incoming Module['websocket'] can be used for configuring
3087
- // subprotocol/url, etc
3088
- SOCKFS.websocketArgs = Module['websocket'] || {};
3089
- // Add the Event registration mechanism to the exported websocket configuration
3090
- // object so we can register network callbacks from native JavaScript too.
3091
- // For more documentation see system/include/emscripten/emscripten.h
3092
- (Module['websocket'] ??= {})['on'] = SOCKFS.on;
3093
-
3094
- return FS.createNode(null, '/', 16895, 0);
3095
- },
3096
- createSocket(family, type, protocol) {
3097
- // Emscripten only supports AF_INET
3098
- if (family != 2) {
3099
- throw new FS.ErrnoError(5);
3100
- }
3101
- type &= ~526336; // Some applications may pass it; it makes no sense for a single process.
3102
- // Emscripten only supports SOCK_STREAM and SOCK_DGRAM
3103
- if (type != 1 && type != 2) {
3104
- throw new FS.ErrnoError(28);
3105
- }
3106
- var streaming = type == 1;
3107
- if (streaming && protocol && protocol != 6) {
3108
- throw new FS.ErrnoError(66); // if SOCK_STREAM, must be tcp or 0.
3109
- }
3110
-
3111
- // create our internal socket structure
3112
- var sock = {
3113
- family,
3114
- type,
3115
- protocol,
3116
- server: null,
3117
- error: null, // Used in getsockopt for SOL_SOCKET/SO_ERROR test
3118
- peers: {},
3119
- pending: [],
3120
- recv_queue: [],
3121
- sock_ops: SOCKFS.websocket_sock_ops
3122
- };
3123
-
3124
- // create the filesystem node to store the socket structure
3125
- var name = SOCKFS.nextname();
3126
- var node = FS.createNode(SOCKFS.root, name, 49152, 0);
3127
- node.sock = sock;
3128
-
3129
- // and the wrapping stream that enables library functions such
3130
- // as read and write to indirectly interact with the socket
3131
- var stream = FS.createStream({
3132
- path: name,
3133
- node,
3134
- flags: 2,
3135
- seekable: false,
3136
- stream_ops: SOCKFS.stream_ops
3137
- });
3138
-
3139
- // map the new stream to the socket structure (sockets have a 1:1
3140
- // relationship with a stream)
3141
- sock.stream = stream;
3142
-
3143
- return sock;
3144
- },
3145
- getSocket(fd) {
3146
- var stream = FS.getStream(fd);
3147
- if (!stream || !FS.isSocket(stream.node.mode)) {
3148
- return null;
3149
- }
3150
- return stream.node.sock;
3151
- },
3152
- stream_ops:{
3153
- poll(stream) {
3154
- var sock = stream.node.sock;
3155
- return sock.sock_ops.poll(sock);
3156
- },
3157
- ioctl(stream, request, varargs) {
3158
- var sock = stream.node.sock;
3159
- return sock.sock_ops.ioctl(sock, request, varargs);
3160
- },
3161
- read(stream, buffer, offset, length, position /* ignored */) {
3162
- var sock = stream.node.sock;
3163
- var msg = sock.sock_ops.recvmsg(sock, length);
3164
- if (!msg) {
3165
- // socket is closed
3166
- return 0;
3167
- }
3168
- buffer.set(msg.buffer, offset);
3169
- return msg.buffer.length;
3170
- },
3171
- write(stream, buffer, offset, length, position /* ignored */) {
3172
- var sock = stream.node.sock;
3173
- return sock.sock_ops.sendmsg(sock, buffer, offset, length);
3174
- },
3175
- close(stream) {
3176
- var sock = stream.node.sock;
3177
- sock.sock_ops.close(sock);
3178
- },
3179
- },
3180
- nextname() {
3181
- if (!SOCKFS.nextname.current) {
3182
- SOCKFS.nextname.current = 0;
3183
- }
3184
- return `socket[${SOCKFS.nextname.current++}]`;
3185
- },
3186
- websocket_sock_ops:{
3187
- createPeer(sock, addr, port) {
3188
- var ws;
3189
-
3190
- if (typeof addr == 'object') {
3191
- ws = addr;
3192
- addr = null;
3193
- port = null;
3194
- }
3195
-
3196
- if (ws) {
3197
- // for sockets that've already connected (e.g. we're the server)
3198
- // we can inspect the _socket property for the address
3199
- if (ws._socket) {
3200
- addr = ws._socket.remoteAddress;
3201
- port = ws._socket.remotePort;
3202
- }
3203
- // if we're just now initializing a connection to the remote,
3204
- // inspect the url property
3205
- else {
3206
- var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);
3207
- if (!result) {
3208
- throw new Error('WebSocket URL must be in the format ws(s)://address:port');
3209
- }
3210
- addr = result[1];
3211
- port = parseInt(result[2], 10);
3212
- }
3213
- } else {
3214
- // create the actual websocket object and connect
3215
- try {
3216
- // The default value is 'ws://' the replace is needed because the compiler replaces '//' comments with '#'
3217
- // comments without checking context, so we'd end up with ws:#, the replace swaps the '#' for '//' again.
3218
- var url = 'ws://'.replace('#', '//');
3219
- // Make the WebSocket subprotocol (Sec-WebSocket-Protocol) default to binary if no configuration is set.
3220
- var subProtocols = 'binary'; // The default value is 'binary'
3221
- // The default WebSocket options
3222
- var opts = undefined;
3223
-
3224
- // Fetch runtime WebSocket URL config.
3225
- if (SOCKFS.websocketArgs['url']) {
3226
- url = SOCKFS.websocketArgs['url'];
3227
- }
3228
- // Fetch runtime WebSocket subprotocol config.
3229
- if (SOCKFS.websocketArgs['subprotocol']) {
3230
- subProtocols = SOCKFS.websocketArgs['subprotocol'];
3231
- } else if (SOCKFS.websocketArgs['subprotocol'] === null) {
3232
- subProtocols = 'null'
3233
- }
3234
-
3235
- if (url === 'ws://' || url === 'wss://') { // Is the supplied URL config just a prefix, if so complete it.
3236
- var parts = addr.split('/');
3237
- url = url + parts[0] + ":" + port + "/" + parts.slice(1).join('/');
3238
- }
3239
-
3240
- if (subProtocols !== 'null') {
3241
- // The regex trims the string (removes spaces at the beginning and end), then splits the string by
3242
- // <any space>,<any space> into an Array. Whitespace removal is important for Websockify and ws.
3243
- subProtocols = subProtocols.replace(/^ +| +$/g,"").split(/ *, */);
3244
-
3245
- opts = subProtocols;
3246
- }
3247
-
3248
- // If node we use the ws library.
3249
- var WebSocketConstructor;
3250
- if (ENVIRONMENT_IS_NODE) {
3251
- WebSocketConstructor = /** @type{(typeof WebSocket)} */(require('ws'));
3252
- } else
3253
- {
3254
- WebSocketConstructor = WebSocket;
3255
- }
3256
- ws = new WebSocketConstructor(url, opts);
3257
- ws.binaryType = 'arraybuffer';
3258
- } catch (e) {
3259
- throw new FS.ErrnoError(23);
3260
- }
3261
- }
3262
-
3263
- var peer = {
3264
- addr,
3265
- port,
3266
- socket: ws,
3267
- msg_send_queue: []
3268
- };
3269
-
3270
- SOCKFS.websocket_sock_ops.addPeer(sock, peer);
3271
- SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer);
3272
-
3273
- // if this is a bound dgram socket, send the port number first to allow
3274
- // us to override the ephemeral port reported to us by remotePort on the
3275
- // remote end.
3276
- if (sock.type === 2 && typeof sock.sport != 'undefined') {
3277
- peer.msg_send_queue.push(new Uint8Array([
3278
- 255, 255, 255, 255,
3279
- 'p'.charCodeAt(0), 'o'.charCodeAt(0), 'r'.charCodeAt(0), 't'.charCodeAt(0),
3280
- ((sock.sport & 0xff00) >> 8) , (sock.sport & 0xff)
3281
- ]));
3282
- }
3283
-
3284
- return peer;
3285
- },
3286
- getPeer(sock, addr, port) {
3287
- return sock.peers[addr + ':' + port];
3288
- },
3289
- addPeer(sock, peer) {
3290
- sock.peers[peer.addr + ':' + peer.port] = peer;
3291
- },
3292
- removePeer(sock, peer) {
3293
- delete sock.peers[peer.addr + ':' + peer.port];
3294
- },
3295
- handlePeerEvents(sock, peer) {
3296
- var first = true;
3297
-
3298
- var handleOpen = function () {
3299
-
3300
- sock.connecting = false;
3301
- SOCKFS.emit('open', sock.stream.fd);
3302
-
3303
- try {
3304
- var queued = peer.msg_send_queue.shift();
3305
- while (queued) {
3306
- peer.socket.send(queued);
3307
- queued = peer.msg_send_queue.shift();
3308
- }
3309
- } catch (e) {
3310
- // not much we can do here in the way of proper error handling as we've already
3311
- // lied and said this data was sent. shut it down.
3312
- peer.socket.close();
3313
- }
3314
- };
3315
-
3316
- function handleMessage(data) {
3317
- if (typeof data == 'string') {
3318
- var encoder = new TextEncoder(); // should be utf-8
3319
- data = encoder.encode(data); // make a typed array from the string
3320
- } else {
3321
- if (data.byteLength == 0) {
3322
- // An empty ArrayBuffer will emit a pseudo disconnect event
3323
- // as recv/recvmsg will return zero which indicates that a socket
3324
- // has performed a shutdown although the connection has not been disconnected yet.
3325
- return;
3326
- }
3327
- data = new Uint8Array(data); // make a typed array view on the array buffer
3328
- }
3329
-
3330
- // if this is the port message, override the peer's port with it
3331
- var wasfirst = first;
3332
- first = false;
3333
- if (wasfirst &&
3334
- data.length === 10 &&
3335
- data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 &&
3336
- data[4] === 'p'.charCodeAt(0) && data[5] === 'o'.charCodeAt(0) && data[6] === 'r'.charCodeAt(0) && data[7] === 't'.charCodeAt(0)) {
3337
- // update the peer's port and its key in the peer map
3338
- var newport = ((data[8] << 8) | data[9]);
3339
- SOCKFS.websocket_sock_ops.removePeer(sock, peer);
3340
- peer.port = newport;
3341
- SOCKFS.websocket_sock_ops.addPeer(sock, peer);
3342
- return;
3343
- }
3344
-
3345
- sock.recv_queue.push({ addr: peer.addr, port: peer.port, data: data });
3346
- SOCKFS.emit('message', sock.stream.fd);
3347
- };
3348
-
3349
- if (ENVIRONMENT_IS_NODE) {
3350
- peer.socket.on('open', handleOpen);
3351
- peer.socket.on('message', function(data, isBinary) {
3352
- if (!isBinary) {
3353
- return;
3354
- }
3355
- handleMessage((new Uint8Array(data)).buffer); // copy from node Buffer -> ArrayBuffer
3356
- });
3357
- peer.socket.on('close', function() {
3358
- SOCKFS.emit('close', sock.stream.fd);
3359
- });
3360
- peer.socket.on('error', function(error) {
3361
- // Although the ws library may pass errors that may be more descriptive than
3362
- // ECONNREFUSED they are not necessarily the expected error code e.g.
3363
- // ENOTFOUND on getaddrinfo seems to be node.js specific, so using ECONNREFUSED
3364
- // is still probably the most useful thing to do.
3365
- sock.error = 14; // Used in getsockopt for SOL_SOCKET/SO_ERROR test.
3366
- SOCKFS.emit('error', [sock.stream.fd, sock.error, 'ECONNREFUSED: Connection refused']);
3367
- // don't throw
3368
- });
3369
- } else {
3370
- peer.socket.onopen = handleOpen;
3371
- peer.socket.onclose = function() {
3372
- SOCKFS.emit('close', sock.stream.fd);
3373
- };
3374
- peer.socket.onmessage = function peer_socket_onmessage(event) {
3375
- handleMessage(event.data);
3376
- };
3377
- peer.socket.onerror = function(error) {
3378
- // The WebSocket spec only allows a 'simple event' to be thrown on error,
3379
- // so we only really know as much as ECONNREFUSED.
3380
- sock.error = 14; // Used in getsockopt for SOL_SOCKET/SO_ERROR test.
3381
- SOCKFS.emit('error', [sock.stream.fd, sock.error, 'ECONNREFUSED: Connection refused']);
3382
- };
3383
- }
3384
- },
3385
- poll(sock) {
3386
- if (sock.type === 1 && sock.server) {
3387
- // listen sockets should only say they're available for reading
3388
- // if there are pending clients.
3389
- return sock.pending.length ? (64 | 1) : 0;
3390
- }
3391
-
3392
- var mask = 0;
3393
- var dest = sock.type === 1 ? // we only care about the socket state for connection-based sockets
3394
- SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) :
3395
- null;
3396
-
3397
- if (sock.recv_queue.length ||
3398
- !dest || // connection-less sockets are always ready to read
3399
- (dest && dest.socket.readyState === dest.socket.CLOSING) ||
3400
- (dest && dest.socket.readyState === dest.socket.CLOSED)) { // let recv return 0 once closed
3401
- mask |= (64 | 1);
3402
- }
3403
-
3404
- if (!dest || // connection-less sockets are always ready to write
3405
- (dest && dest.socket.readyState === dest.socket.OPEN)) {
3406
- mask |= 4;
3407
- }
3408
-
3409
- if ((dest && dest.socket.readyState === dest.socket.CLOSING) ||
3410
- (dest && dest.socket.readyState === dest.socket.CLOSED)) {
3411
- // When an non-blocking connect fails mark the socket as writable.
3412
- // Its up to the calling code to then use getsockopt with SO_ERROR to
3413
- // retrieve the error.
3414
- // See https://man7.org/linux/man-pages/man2/connect.2.html
3415
- if (sock.connecting) {
3416
- mask |= 4;
3417
- } else {
3418
- mask |= 16;
3419
- }
3420
- }
3421
-
3422
- return mask;
3423
- },
3424
- ioctl(sock, request, arg) {
3425
- switch (request) {
3426
- case 21531:
3427
- var bytes = 0;
3428
- if (sock.recv_queue.length) {
3429
- bytes = sock.recv_queue[0].data.length;
3430
- }
3431
- HEAP32[((arg)>>2)] = bytes;
3432
- return 0;
3433
- case 21537:
3434
- var on = HEAP32[((arg)>>2)];
3435
- if (on) {
3436
- sock.stream.flags |= 2048;
3437
- } else {
3438
- sock.stream.flags &= ~2048;
3439
- }
3440
- return 0;
3441
- default:
3442
- return 28;
3443
- }
3444
- },
3445
- close(sock) {
3446
- // if we've spawned a listen server, close it
3447
- if (sock.server) {
3448
- try {
3449
- sock.server.close();
3450
- } catch (e) {
3451
- }
3452
- sock.server = null;
3453
- }
3454
- // close any peer connections
3455
- for (var peer of Object.values(sock.peers)) {
3456
- try {
3457
- peer.socket.close();
3458
- } catch (e) {
3459
- }
3460
- SOCKFS.websocket_sock_ops.removePeer(sock, peer);
3461
- }
3462
- return 0;
3463
- },
3464
- bind(sock, addr, port) {
3465
- if (typeof sock.saddr != 'undefined' || typeof sock.sport != 'undefined') {
3466
- throw new FS.ErrnoError(28); // already bound
3467
- }
3468
- sock.saddr = addr;
3469
- sock.sport = port;
3470
- // in order to emulate dgram sockets, we need to launch a listen server when
3471
- // binding on a connection-less socket
3472
- // note: this is only required on the server side
3473
- if (sock.type === 2) {
3474
- // close the existing server if it exists
3475
- if (sock.server) {
3476
- sock.server.close();
3477
- sock.server = null;
3478
- }
3479
- // swallow error operation not supported error that occurs when binding in the
3480
- // browser where this isn't supported
3481
- try {
3482
- sock.sock_ops.listen(sock, 0);
3483
- } catch (e) {
3484
- if (!(e.name === 'ErrnoError')) throw e;
3485
- if (e.errno !== 138) throw e;
3486
- }
3487
- }
3488
- },
3489
- connect(sock, addr, port) {
3490
- if (sock.server) {
3491
- throw new FS.ErrnoError(138);
3492
- }
3493
-
3494
- // TODO autobind
3495
- // if (!sock.addr && sock.type == 2) {
3496
- // }
3497
-
3498
- // early out if we're already connected / in the middle of connecting
3499
- if (typeof sock.daddr != 'undefined' && typeof sock.dport != 'undefined') {
3500
- var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);
3501
- if (dest) {
3502
- if (dest.socket.readyState === dest.socket.CONNECTING) {
3503
- throw new FS.ErrnoError(7);
3504
- } else {
3505
- throw new FS.ErrnoError(30);
3506
- }
3507
- }
3508
- }
3509
-
3510
- // add the socket to our peer list and set our
3511
- // destination address / port to match
3512
- var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);
3513
- sock.daddr = peer.addr;
3514
- sock.dport = peer.port;
3515
-
3516
- // because we cannot synchronously block to wait for the WebSocket
3517
- // connection to complete, we return here pretending that the connection
3518
- // was a success.
3519
- sock.connecting = true;
3520
- },
3521
- listen(sock, backlog) {
3522
- if (!ENVIRONMENT_IS_NODE) {
3523
- throw new FS.ErrnoError(138);
3524
- }
3525
- if (sock.server) {
3526
- throw new FS.ErrnoError(28); // already listening
3527
- }
3528
- var WebSocketServer = require('ws').Server;
3529
- var host = sock.saddr;
3530
- sock.server = new WebSocketServer({
3531
- host,
3532
- port: sock.sport
3533
- // TODO support backlog
3534
- });
3535
- SOCKFS.emit('listen', sock.stream.fd); // Send Event with listen fd.
3536
-
3537
- sock.server.on('connection', function(ws) {
3538
- if (sock.type === 1) {
3539
- var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol);
3540
-
3541
- // create a peer on the new socket
3542
- var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws);
3543
- newsock.daddr = peer.addr;
3544
- newsock.dport = peer.port;
3545
-
3546
- // push to queue for accept to pick up
3547
- sock.pending.push(newsock);
3548
- SOCKFS.emit('connection', newsock.stream.fd);
3549
- } else {
3550
- // create a peer on the listen socket so calling sendto
3551
- // with the listen socket and an address will resolve
3552
- // to the correct client
3553
- SOCKFS.websocket_sock_ops.createPeer(sock, ws);
3554
- SOCKFS.emit('connection', sock.stream.fd);
3555
- }
3556
- });
3557
- sock.server.on('close', function() {
3558
- SOCKFS.emit('close', sock.stream.fd);
3559
- sock.server = null;
3560
- });
3561
- sock.server.on('error', function(error) {
3562
- // Although the ws library may pass errors that may be more descriptive than
3563
- // ECONNREFUSED they are not necessarily the expected error code e.g.
3564
- // ENOTFOUND on getaddrinfo seems to be node.js specific, so using EHOSTUNREACH
3565
- // is still probably the most useful thing to do. This error shouldn't
3566
- // occur in a well written app as errors should get trapped in the compiled
3567
- // app's own getaddrinfo call.
3568
- sock.error = 23; // Used in getsockopt for SOL_SOCKET/SO_ERROR test.
3569
- SOCKFS.emit('error', [sock.stream.fd, sock.error, 'EHOSTUNREACH: Host is unreachable']);
3570
- // don't throw
3571
- });
3572
- },
3573
- accept(listensock) {
3574
- if (!listensock.server || !listensock.pending.length) {
3575
- throw new FS.ErrnoError(28);
3576
- }
3577
- var newsock = listensock.pending.shift();
3578
- newsock.stream.flags = listensock.stream.flags;
3579
- return newsock;
3580
- },
3581
- getname(sock, peer) {
3582
- var addr, port;
3583
- if (peer) {
3584
- if (sock.daddr === undefined || sock.dport === undefined) {
3585
- throw new FS.ErrnoError(53);
3586
- }
3587
- addr = sock.daddr;
3588
- port = sock.dport;
3589
- } else {
3590
- // TODO saddr and sport will be set for bind()'d UDP sockets, but what
3591
- // should we be returning for TCP sockets that've been connect()'d?
3592
- addr = sock.saddr || 0;
3593
- port = sock.sport || 0;
3594
- }
3595
- return { addr, port };
3596
- },
3597
- sendmsg(sock, buffer, offset, length, addr, port) {
3598
- if (sock.type === 2) {
3599
- // connection-less sockets will honor the message address,
3600
- // and otherwise fall back to the bound destination address
3601
- if (addr === undefined || port === undefined) {
3602
- addr = sock.daddr;
3603
- port = sock.dport;
3604
- }
3605
- // if there was no address to fall back to, error out
3606
- if (addr === undefined || port === undefined) {
3607
- throw new FS.ErrnoError(17);
3608
- }
3609
- } else {
3610
- // connection-based sockets will only use the bound
3611
- addr = sock.daddr;
3612
- port = sock.dport;
3613
- }
3614
-
3615
- // find the peer for the destination address
3616
- var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port);
3617
-
3618
- // early out if not connected with a connection-based socket
3619
- if (sock.type === 1) {
3620
- if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {
3621
- throw new FS.ErrnoError(53);
3622
- }
3623
- }
3624
-
3625
- // create a copy of the incoming data to send, as the WebSocket API
3626
- // doesn't work entirely with an ArrayBufferView, it'll just send
3627
- // the entire underlying buffer
3628
- if (ArrayBuffer.isView(buffer)) {
3629
- offset += buffer.byteOffset;
3630
- buffer = buffer.buffer;
3631
- }
3632
-
3633
- var data = buffer.slice(offset, offset + length);
3634
-
3635
- // if we don't have a cached connectionless UDP datagram connection, or
3636
- // the TCP socket is still connecting, queue the message to be sent upon
3637
- // connect, and lie, saying the data was sent now.
3638
- if (!dest || dest.socket.readyState !== dest.socket.OPEN) {
3639
- // if we're not connected, open a new connection
3640
- if (sock.type === 2) {
3641
- if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {
3642
- dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);
3643
- }
3644
- }
3645
- dest.msg_send_queue.push(data);
3646
- return length;
3647
- }
3648
-
3649
- try {
3650
- // send the actual data
3651
- dest.socket.send(data);
3652
- return length;
3653
- } catch (e) {
3654
- throw new FS.ErrnoError(28);
3655
- }
3656
- },
3657
- recvmsg(sock, length) {
3658
- // http://pubs.opengroup.org/onlinepubs/7908799/xns/recvmsg.html
3659
- if (sock.type === 1 && sock.server) {
3660
- // tcp servers should not be recv()'ing on the listen socket
3661
- throw new FS.ErrnoError(53);
3662
- }
3663
-
3664
- var queued = sock.recv_queue.shift();
3665
- if (!queued) {
3666
- if (sock.type === 1) {
3667
- var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);
3668
-
3669
- if (!dest) {
3670
- // if we have a destination address but are not connected, error out
3671
- throw new FS.ErrnoError(53);
3672
- }
3673
- if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {
3674
- // return null if the socket has closed
3675
- return null;
3676
- }
3677
- // else, our socket is in a valid state but truly has nothing available
3678
- throw new FS.ErrnoError(6);
3679
- }
3680
- throw new FS.ErrnoError(6);
3681
- }
3682
-
3683
- // queued.data will be an ArrayBuffer if it's unadulterated, but if it's
3684
- // requeued TCP data it'll be an ArrayBufferView
3685
- var queuedLength = queued.data.byteLength || queued.data.length;
3686
- var queuedOffset = queued.data.byteOffset || 0;
3687
- var queuedBuffer = queued.data.buffer || queued.data;
3688
- var bytesRead = Math.min(length, queuedLength);
3689
- var res = {
3690
- buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead),
3691
- addr: queued.addr,
3692
- port: queued.port
3693
- };
3694
-
3695
- // push back any unread data for TCP connections
3696
- if (sock.type === 1 && bytesRead < queuedLength) {
3697
- var bytesRemaining = queuedLength - bytesRead;
3698
- queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining);
3699
- sock.recv_queue.unshift(queued);
3700
- }
3701
-
3702
- return res;
3703
- },
3704
- },
3705
- };
3706
-
3707
- var getSocketFromFD = (fd) => {
3708
- var socket = SOCKFS.getSocket(fd);
3709
- if (!socket) throw new FS.ErrnoError(8);
3710
- return socket;
3711
- };
3712
-
3713
- var inetPton4 = (str) => {
3714
- var b = str.split('.');
3715
- for (var i = 0; i < 4; i++) {
3716
- var tmp = Number(b[i]);
3717
- if (isNaN(tmp)) return null;
3718
- b[i] = tmp;
3719
- }
3720
- return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0;
3721
- };
3722
-
3723
- var inetPton6 = (str) => {
3724
- var words;
3725
- var w, offset, z, i;
3726
- /* http://home.deds.nl/~aeron/regex/ */
3727
- var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i
3728
- var parts = [];
3729
- if (!valid6regx.test(str)) {
3730
- return null;
3731
- }
3732
- if (str === "::") {
3733
- return [0, 0, 0, 0, 0, 0, 0, 0];
3734
- }
3735
- // Z placeholder to keep track of zeros when splitting the string on ":"
3736
- if (str.startsWith("::")) {
3737
- str = str.replace("::", "Z:"); // leading zeros case
3738
- } else {
3739
- str = str.replace("::", ":Z:");
3740
- }
3741
-
3742
- if (str.indexOf(".") > 0) {
3743
- // parse IPv4 embedded address
3744
- str = str.replace(new RegExp('[.]', 'g'), ":");
3745
- words = str.split(":");
3746
- words[words.length-4] = Number(words[words.length-4]) + Number(words[words.length-3])*256;
3747
- words[words.length-3] = Number(words[words.length-2]) + Number(words[words.length-1])*256;
3748
- words = words.slice(0, words.length-2);
3749
- } else {
3750
- words = str.split(":");
3751
- }
3752
-
3753
- offset = 0; z = 0;
3754
- for (w=0; w < words.length; w++) {
3755
- if (typeof words[w] == 'string') {
3756
- if (words[w] === 'Z') {
3757
- // compressed zeros - write appropriate number of zero words
3758
- for (z = 0; z < (8 - words.length+1); z++) {
3759
- parts[w+z] = 0;
3760
- }
3761
- offset = z-1;
3762
- } else {
3763
- // parse hex field to 16-bit value and write it in network byte-order
3764
- parts[w+offset] = _htons(parseInt(words[w],16));
3765
- }
3766
- } else {
3767
- // parsed IPv4 words
3768
- parts[w+offset] = words[w];
3769
- }
3770
- }
3771
- return [
3772
- (parts[1] << 16) | parts[0],
3773
- (parts[3] << 16) | parts[2],
3774
- (parts[5] << 16) | parts[4],
3775
- (parts[7] << 16) | parts[6]
3776
- ];
3777
- };
3778
-
3779
- var zeroMemory = (ptr, size) => HEAPU8.fill(0, ptr, ptr + size);
3780
-
3781
- /** @param {number=} addrlen */
3782
- var writeSockaddr = (sa, family, addr, port, addrlen) => {
3783
- switch (family) {
3784
- case 2:
3785
- addr = inetPton4(addr);
3786
- zeroMemory(sa, 16);
3787
- if (addrlen) {
3788
- HEAP32[((addrlen)>>2)] = 16;
3789
- }
3790
- HEAP16[((sa)>>1)] = family;
3791
- HEAP32[(((sa)+(4))>>2)] = addr;
3792
- HEAP16[(((sa)+(2))>>1)] = _htons(port);
3793
- break;
3794
- case 10:
3795
- addr = inetPton6(addr);
3796
- zeroMemory(sa, 28);
3797
- if (addrlen) {
3798
- HEAP32[((addrlen)>>2)] = 28;
3799
- }
3800
- HEAP32[((sa)>>2)] = family;
3801
- HEAP32[(((sa)+(8))>>2)] = addr[0];
3802
- HEAP32[(((sa)+(12))>>2)] = addr[1];
3803
- HEAP32[(((sa)+(16))>>2)] = addr[2];
3804
- HEAP32[(((sa)+(20))>>2)] = addr[3];
3805
- HEAP16[(((sa)+(2))>>1)] = _htons(port);
3806
- break;
3807
- default:
3808
- return 5;
3809
- }
3810
- return 0;
3811
- };
3812
-
3813
-
3814
- var DNS = {
3815
- address_map:{
3816
- id:1,
3817
- addrs:{
3818
- },
3819
- names:{
3820
- },
3821
- },
3822
- lookup_name(name) {
3823
- // If the name is already a valid ipv4 / ipv6 address, don't generate a fake one.
3824
- var res = inetPton4(name);
3825
- if (res !== null) {
3826
- return name;
3827
- }
3828
- res = inetPton6(name);
3829
- if (res !== null) {
3830
- return name;
3831
- }
3832
-
3833
- // See if this name is already mapped.
3834
- var addr;
3835
-
3836
- if (DNS.address_map.addrs[name]) {
3837
- addr = DNS.address_map.addrs[name];
3838
- } else {
3839
- var id = DNS.address_map.id++;
3840
-
3841
- addr = '172.29.' + (id & 0xff) + '.' + (id & 0xff00);
3842
-
3843
- DNS.address_map.names[addr] = name;
3844
- DNS.address_map.addrs[name] = addr;
3845
- }
3846
-
3847
- return addr;
3848
- },
3849
- lookup_addr(addr) {
3850
- if (DNS.address_map.names[addr]) {
3851
- return DNS.address_map.names[addr];
3852
- }
3853
-
3854
- return null;
3855
- },
3856
- };
3857
- function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) {
3858
- try {
3859
-
3860
- var sock = getSocketFromFD(fd);
3861
- var newsock = sock.sock_ops.accept(sock);
3862
- if (addr) {
3863
- var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen);
3864
- }
3865
- return newsock.stream.fd;
3866
- } catch (e) {
3867
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e;
3868
- return -e.errno;
3869
- }
3870
- }
3871
-
3872
-
3873
- var inetNtop4 = (addr) =>
3874
- (addr & 0xff) + '.' + ((addr >> 8) & 0xff) + '.' + ((addr >> 16) & 0xff) + '.' + ((addr >> 24) & 0xff);
3875
-
3876
-
3877
- var inetNtop6 = (ints) => {
3878
- // ref: http://www.ietf.org/rfc/rfc2373.txt - section 2.5.4
3879
- // Format for IPv4 compatible and mapped 128-bit IPv6 Addresses
3880
- // 128-bits are split into eight 16-bit words
3881
- // stored in network byte order (big-endian)
3882
- // | 80 bits | 16 | 32 bits |
3883
- // +-----------------------------------------------------------------+
3884
- // | 10 bytes | 2 | 4 bytes |
3885
- // +--------------------------------------+--------------------------+
3886
- // + 5 words | 1 | 2 words |
3887
- // +--------------------------------------+--------------------------+
3888
- // |0000..............................0000|0000| IPv4 ADDRESS | (compatible)
3889
- // +--------------------------------------+----+---------------------+
3890
- // |0000..............................0000|FFFF| IPv4 ADDRESS | (mapped)
3891
- // +--------------------------------------+----+---------------------+
3892
- var str = "";
3893
- var word = 0;
3894
- var longest = 0;
3895
- var lastzero = 0;
3896
- var zstart = 0;
3897
- var len = 0;
3898
- var i = 0;
3899
- var parts = [
3900
- ints[0] & 0xffff,
3901
- (ints[0] >> 16),
3902
- ints[1] & 0xffff,
3903
- (ints[1] >> 16),
3904
- ints[2] & 0xffff,
3905
- (ints[2] >> 16),
3906
- ints[3] & 0xffff,
3907
- (ints[3] >> 16)
3908
- ];
3909
-
3910
- // Handle IPv4-compatible, IPv4-mapped, loopback and any/unspecified addresses
3911
-
3912
- var hasipv4 = true;
3913
- var v4part = "";
3914
- // check if the 10 high-order bytes are all zeros (first 5 words)
3915
- for (i = 0; i < 5; i++) {
3916
- if (parts[i] !== 0) { hasipv4 = false; break; }
3917
- }
3918
-
3919
- if (hasipv4) {
3920
- // low-order 32-bits store an IPv4 address (bytes 13 to 16) (last 2 words)
3921
- v4part = inetNtop4(parts[6] | (parts[7] << 16));
3922
- // IPv4-mapped IPv6 address if 16-bit value (bytes 11 and 12) == 0xFFFF (6th word)
3923
- if (parts[5] === -1) {
3924
- str = "::ffff:";
3925
- str += v4part;
3926
- return str;
3927
- }
3928
- // IPv4-compatible IPv6 address if 16-bit value (bytes 11 and 12) == 0x0000 (6th word)
3929
- if (parts[5] === 0) {
3930
- str = "::";
3931
- // special case IPv6 addresses
3932
- if (v4part === "0.0.0.0") v4part = ""; // any/unspecified address
3933
- if (v4part === "0.0.0.1") v4part = "1";// loopback address
3934
- str += v4part;
3935
- return str;
3936
- }
3937
- }
3938
-
3939
- // Handle all other IPv6 addresses
3940
-
3941
- // first run to find the longest contiguous zero words
3942
- for (word = 0; word < 8; word++) {
3943
- if (parts[word] === 0) {
3944
- if (word - lastzero > 1) {
3945
- len = 0;
3946
- }
3947
- lastzero = word;
3948
- len++;
3949
- }
3950
- if (len > longest) {
3951
- longest = len;
3952
- zstart = word - longest + 1;
3953
- }
3954
- }
3955
-
3956
- for (word = 0; word < 8; word++) {
3957
- if (longest > 1) {
3958
- // compress contiguous zeros - to produce "::"
3959
- if (parts[word] === 0 && word >= zstart && word < (zstart + longest) ) {
3960
- if (word === zstart) {
3961
- str += ":";
3962
- if (zstart === 0) str += ":"; //leading zeros case
3963
- }
3964
- continue;
3965
- }
3966
- }
3967
- // converts 16-bit words from big-endian to little-endian before converting to hex string
3968
- str += Number(_ntohs(parts[word] & 0xffff)).toString(16);
3969
- str += word < 7 ? ":" : "";
3970
- }
3971
- return str;
3972
- };
3973
-
3974
- var readSockaddr = (sa, salen) => {
3975
- // family / port offsets are common to both sockaddr_in and sockaddr_in6
3976
- var family = HEAP16[((sa)>>1)];
3977
- var port = _ntohs(HEAPU16[(((sa)+(2))>>1)]);
3978
- var addr;
3979
-
3980
- switch (family) {
3981
- case 2:
3982
- if (salen !== 16) {
3983
- return { errno: 28 };
3984
- }
3985
- addr = HEAP32[(((sa)+(4))>>2)];
3986
- addr = inetNtop4(addr);
3987
- break;
3988
- case 10:
3989
- if (salen !== 28) {
3990
- return { errno: 28 };
3991
- }
3992
- addr = [
3993
- HEAP32[(((sa)+(8))>>2)],
3994
- HEAP32[(((sa)+(12))>>2)],
3995
- HEAP32[(((sa)+(16))>>2)],
3996
- HEAP32[(((sa)+(20))>>2)]
3997
- ];
3998
- addr = inetNtop6(addr);
3999
- break;
4000
- default:
4001
- return { errno: 5 };
4002
- }
4003
-
4004
- return { family: family, addr: addr, port: port };
4005
- };
4006
-
4007
-
4008
- var getSocketAddress = (addrp, addrlen) => {
4009
- var info = readSockaddr(addrp, addrlen);
4010
- if (info.errno) throw new FS.ErrnoError(info.errno);
4011
- info.addr = DNS.lookup_addr(info.addr) || info.addr;
4012
- return info;
4013
- };
4014
- function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) {
4015
- try {
4016
-
4017
- var sock = getSocketFromFD(fd);
4018
- var info = getSocketAddress(addr, addrlen);
4019
- sock.sock_ops.bind(sock, info.addr, info.port);
4020
- return 0;
4021
- } catch (e) {
4022
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e;
4023
- return -e.errno;
4024
- }
4025
- }
4026
-
4027
-
4028
3076
 
4029
3077
  var SYSCALLS = {
4030
3078
  calculateAt(dirfd, path, allowEmpty) {
@@ -4114,20 +3162,6 @@ async function createWasm() {
4114
3162
  }
4115
3163
  }
4116
3164
 
4117
-
4118
- function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) {
4119
- try {
4120
-
4121
- var sock = getSocketFromFD(fd);
4122
- var info = getSocketAddress(addr, addrlen);
4123
- sock.sock_ops.connect(sock, info.addr, info.port);
4124
- return 0;
4125
- } catch (e) {
4126
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e;
4127
- return -e.errno;
4128
- }
4129
- }
4130
-
4131
3165
  function ___syscall_dup(fd) {
4132
3166
  try {
4133
3167
 
@@ -4349,18 +3383,6 @@ async function createWasm() {
4349
3383
  }
4350
3384
  }
4351
3385
 
4352
- function ___syscall_listen(fd, backlog) {
4353
- try {
4354
-
4355
- var sock = getSocketFromFD(fd);
4356
- sock.sock_ops.listen(sock, backlog);
4357
- return 0;
4358
- } catch (e) {
4359
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e;
4360
- return -e.errno;
4361
- }
4362
- }
4363
-
4364
3386
  function ___syscall_lstat64(path, buf) {
4365
3387
  try {
4366
3388
 
@@ -4648,36 +3670,6 @@ async function createWasm() {
4648
3670
  }
4649
3671
  }
4650
3672
 
4651
-
4652
-
4653
- function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) {
4654
- try {
4655
-
4656
- var sock = getSocketFromFD(fd);
4657
- var msg = sock.sock_ops.recvmsg(sock, len);
4658
- if (!msg) return 0; // socket is closed
4659
- if (addr) {
4660
- var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen);
4661
- }
4662
- HEAPU8.set(msg.buffer, buf);
4663
- return msg.buffer.byteLength;
4664
- } catch (e) {
4665
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e;
4666
- return -e.errno;
4667
- }
4668
- }
4669
-
4670
- function ___syscall_socket(domain, type, protocol) {
4671
- try {
4672
-
4673
- var sock = SOCKFS.createSocket(domain, type, protocol);
4674
- return sock.stream.fd;
4675
- } catch (e) {
4676
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e;
4677
- return -e.errno;
4678
- }
4679
- }
4680
-
4681
3673
  function ___syscall_stat64(path, buf) {
4682
3674
  try {
4683
3675
 
@@ -4689,6 +3681,15 @@ async function createWasm() {
4689
3681
  }
4690
3682
  }
4691
3683
 
3684
+ var stringToUTF8 = (str, outPtr, maxBytesToWrite) => {
3685
+ return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);
3686
+ };
3687
+ var ___syscall_uname = (buf) => {
3688
+ if (!buf) return -21;
3689
+ ['Emscripten', 'emscripten', '4.0.23', '#1', 'wasm32'].forEach((field, i) => stringToUTF8(field, buf + i * 65, 65));
3690
+ return 0;
3691
+ };
3692
+
4692
3693
  var __abort_js = () =>
4693
3694
  abort('');
4694
3695
 
@@ -4815,36 +3816,6 @@ async function createWasm() {
4815
3816
  return BigInt(ret);
4816
3817
  };
4817
3818
 
4818
- function __poll_js(fds, nfds, timeout, ctx, arg) {
4819
- try {
4820
-
4821
-
4822
- var count = 0;
4823
- for (var i = 0; i < nfds; i++) {
4824
- var pollfd = fds + 8 * i;
4825
- var fd = HEAP32[((pollfd)>>2)];
4826
- var events = HEAP16[(((pollfd)+(4))>>1)];
4827
- var flags = 32;
4828
- var stream = FS.getStream(fd);
4829
- if (stream) {
4830
- if (stream.stream_ops.poll) {
4831
- flags = stream.stream_ops.poll(stream, -1);
4832
- } else {
4833
- flags = 5;
4834
- }
4835
- }
4836
- flags &= events | 8 | 16;
4837
- if (flags) count++;
4838
- HEAP16[(((pollfd)+(6))>>1)] = flags;
4839
- }
4840
-
4841
- return count;
4842
- } catch (e) {
4843
- if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e;
4844
- return -e.errno;
4845
- }
4846
- }
4847
-
4848
3819
  var __timegm_js = function(tmPtr) {
4849
3820
 
4850
3821
  var ret = (() => {
@@ -4867,9 +3838,6 @@ async function createWasm() {
4867
3838
  return BigInt(ret);
4868
3839
  };
4869
3840
 
4870
- var stringToUTF8 = (str, outPtr, maxBytesToWrite) => {
4871
- return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);
4872
- };
4873
3841
  var __tzset_js = (timezone, daylight, std_name, dst_name) => {
4874
3842
  // TODO: Use (malleable) environment variables instead of system settings.
4875
3843
  var currentYear = new Date().getFullYear();
@@ -5198,23 +4166,22 @@ async function createWasm() {
5198
4166
 
5199
4167
  /** @param {number=} offset */
5200
4168
  var doWritev = (stream, iov, iovcnt, offset) => {
5201
- var ret = 0;
5202
- for (var i = 0; i < iovcnt; i++) {
5203
- var ptr = HEAPU32[((iov)>>2)];
5204
- var len = HEAPU32[(((iov)+(4))>>2)];
5205
- iov += 8;
5206
- var curr = FS.write(stream, HEAP8, ptr, len, offset);
5207
- if (curr < 0) return -1;
5208
- ret += curr;
5209
- if (curr < len) {
5210
- // No more space to write.
5211
- break;
5212
- }
5213
- if (typeof offset != 'undefined') {
5214
- offset += curr;
5215
- }
4169
+ if (iovcnt == 1) {
4170
+ return FS.write(stream, HEAP8, HEAPU32[iov >> 2], HEAPU32[(iov + 4) >> 2], offset);
5216
4171
  }
5217
- return ret;
4172
+ var total = 0;
4173
+ for (var i = 0, p = iov; i < iovcnt; i++, p += 8) {
4174
+ total += HEAPU32[(p + 4) >> 2];
4175
+ }
4176
+ var view = new Uint8Array(total);
4177
+ var voff = 0;
4178
+ for (var i = 0; i < iovcnt; i++, iov += 8) {
4179
+ var ptr = HEAPU32[iov >> 2];
4180
+ var len = HEAPU32[(iov + 4) >> 2];
4181
+ view.set(HEAPU8.subarray(ptr, ptr + len), voff);
4182
+ voff += len;
4183
+ }
4184
+ return FS.write(stream, view, 0, total, offset);
5218
4185
  };
5219
4186
 
5220
4187
  function _fd_write(fd, iov, iovcnt, pnum) {
@@ -5230,182 +4197,6 @@ async function createWasm() {
5230
4197
  }
5231
4198
  }
5232
4199
 
5233
-
5234
-
5235
-
5236
-
5237
-
5238
-
5239
-
5240
-
5241
- var _getaddrinfo = (node, service, hint, out) => {
5242
- // Note getaddrinfo currently only returns a single addrinfo with ai_next defaulting to NULL. When NULL
5243
- // hints are specified or ai_family set to AF_UNSPEC or ai_socktype or ai_protocol set to 0 then we
5244
- // really should provide a linked list of suitable addrinfo values.
5245
- var addrs = [];
5246
- var canon = null;
5247
- var addr = 0;
5248
- var port = 0;
5249
- var flags = 0;
5250
- var family = 0;
5251
- var type = 0;
5252
- var proto = 0;
5253
- var ai, last;
5254
-
5255
- function allocaddrinfo(family, type, proto, canon, addr, port) {
5256
- var sa, salen, ai;
5257
- var errno;
5258
-
5259
- salen = family === 10 ?
5260
- 28 :
5261
- 16;
5262
- addr = family === 10 ?
5263
- inetNtop6(addr) :
5264
- inetNtop4(addr);
5265
- sa = _malloc(salen);
5266
- errno = writeSockaddr(sa, family, addr, port);
5267
-
5268
- ai = _malloc(32);
5269
- HEAP32[(((ai)+(4))>>2)] = family;
5270
- HEAP32[(((ai)+(8))>>2)] = type;
5271
- HEAP32[(((ai)+(12))>>2)] = proto;
5272
- HEAPU32[(((ai)+(24))>>2)] = canon;
5273
- HEAPU32[(((ai)+(20))>>2)] = sa;
5274
- if (family === 10) {
5275
- HEAP32[(((ai)+(16))>>2)] = 28;
5276
- } else {
5277
- HEAP32[(((ai)+(16))>>2)] = 16;
5278
- }
5279
- HEAP32[(((ai)+(28))>>2)] = 0;
5280
-
5281
- return ai;
5282
- }
5283
-
5284
- if (hint) {
5285
- flags = HEAP32[((hint)>>2)];
5286
- family = HEAP32[(((hint)+(4))>>2)];
5287
- type = HEAP32[(((hint)+(8))>>2)];
5288
- proto = HEAP32[(((hint)+(12))>>2)];
5289
- }
5290
- if (type && !proto) {
5291
- proto = type === 2 ? 17 : 6;
5292
- }
5293
- if (!type && proto) {
5294
- type = proto === 17 ? 2 : 1;
5295
- }
5296
-
5297
- // If type or proto are set to zero in hints we should really be returning multiple addrinfo values, but for
5298
- // now default to a TCP STREAM socket so we can at least return a sensible addrinfo given NULL hints.
5299
- if (proto === 0) {
5300
- proto = 6;
5301
- }
5302
- if (type === 0) {
5303
- type = 1;
5304
- }
5305
-
5306
- if (!node && !service) {
5307
- return -2;
5308
- }
5309
- if (flags & ~(1|2|4|
5310
- 1024|8|16|32)) {
5311
- return -1;
5312
- }
5313
- if (hint !== 0 && (HEAP32[((hint)>>2)] & 2) && !node) {
5314
- return -1;
5315
- }
5316
- if (flags & 32) {
5317
- // TODO
5318
- return -2;
5319
- }
5320
- if (type !== 0 && type !== 1 && type !== 2) {
5321
- return -7;
5322
- }
5323
- if (family !== 0 && family !== 2 && family !== 10) {
5324
- return -6;
5325
- }
5326
-
5327
- if (service) {
5328
- service = UTF8ToString(service);
5329
- port = parseInt(service, 10);
5330
-
5331
- if (isNaN(port)) {
5332
- if (flags & 1024) {
5333
- return -2;
5334
- }
5335
- // TODO support resolving well-known service names from:
5336
- // http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt
5337
- return -8;
5338
- }
5339
- }
5340
-
5341
- if (!node) {
5342
- if (family === 0) {
5343
- family = 2;
5344
- }
5345
- if ((flags & 1) === 0) {
5346
- if (family === 2) {
5347
- addr = _htonl(2130706433);
5348
- } else {
5349
- addr = [0, 0, 0, _htonl(1)];
5350
- }
5351
- }
5352
- ai = allocaddrinfo(family, type, proto, null, addr, port);
5353
- HEAPU32[((out)>>2)] = ai;
5354
- return 0;
5355
- }
5356
-
5357
- //
5358
- // try as a numeric address
5359
- //
5360
- node = UTF8ToString(node);
5361
- addr = inetPton4(node);
5362
- if (addr !== null) {
5363
- // incoming node is a valid ipv4 address
5364
- if (family === 0 || family === 2) {
5365
- family = 2;
5366
- }
5367
- else if (family === 10 && (flags & 8)) {
5368
- addr = [0, 0, _htonl(0xffff), addr];
5369
- family = 10;
5370
- } else {
5371
- return -2;
5372
- }
5373
- } else {
5374
- addr = inetPton6(node);
5375
- if (addr !== null) {
5376
- // incoming node is a valid ipv6 address
5377
- if (family === 0 || family === 10) {
5378
- family = 10;
5379
- } else {
5380
- return -2;
5381
- }
5382
- }
5383
- }
5384
- if (addr != null) {
5385
- ai = allocaddrinfo(family, type, proto, node, addr, port);
5386
- HEAPU32[((out)>>2)] = ai;
5387
- return 0;
5388
- }
5389
- if (flags & 4) {
5390
- return -2;
5391
- }
5392
-
5393
- //
5394
- // try as a hostname
5395
- //
5396
- // resolve the hostname to a temporary fake address
5397
- node = DNS.lookup_name(node);
5398
- addr = inetPton4(node);
5399
- if (family === 0) {
5400
- family = 2;
5401
- } else if (family === 10) {
5402
- addr = [0, 0, _htonl(0xffff), addr];
5403
- }
5404
- ai = allocaddrinfo(family, type, proto, null, addr, port);
5405
- HEAPU32[((out)>>2)] = ai;
5406
- return 0;
5407
- };
5408
-
5409
4200
 
5410
4201
 
5411
4202
  var handleException = (e) => {
@@ -5492,10 +4283,28 @@ if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];
5492
4283
 
5493
4284
  // end include: postlibrary.js
5494
4285
 
4286
+ function slicc_cred_js(out) { const k = Module.sliccKernel; if (!k || !k.cred) return -52; const c = k.cred(); if (typeof c === 'number') return c; ['ruid', 'euid', 'suid', 'rgid', 'egid', 'sgid'].forEach((key, i) => { HEAPU32[(out >> 2) + i] = c[key] >>> 0; }); return 0; }
4287
+ function slicc_groups_js(list,cap) { const k = Module.sliccKernel; if (!k || !k.cred) return -52; const c = k.cred(); if (typeof c === 'number') return c; if (cap === 0) return c.groups.length; if (cap < c.groups.length) return -28; c.groups.forEach((g, i) => { HEAPU32[(list >> 2) + i] = g >>> 0; }); return c.groups.length; }
4288
+ function slicc_setcred_js(ruid,euid,suid,rgid,egid,sgid) { const k = Module.sliccKernel; if (!k || !k.setcred) return -52; const change = {}; const ids = { ruid, euid, suid, rgid, egid, sgid }; for (const key in ids) if (ids[key] !== -1) change[key] = ids[key] >>> 0; const r = k.setcred(change); return typeof r === 'number' ? r : 0; }
4289
+ function slicc_setgroups_js(list,n) { const k = Module.sliccKernel; if (!k || !k.setcred) return -52; const groups = []; for (let i = 0; i < n; i++) groups.push(HEAPU32[(list >> 2) + i]); const r = k.setcred({ groups }); return typeof r === 'number' ? r : 0; }
4290
+ function slicc_net_ready() { return Module.sliccKernel && Module.sliccKernel.net ? 1 : 0; }
4291
+ function slicc_socket_js(unix_domain,nonblock,cloexec) { return Module.sliccKernel.net.socket(unix_domain ? 'unix' : 'inet', !!nonblock, !!cloexec); }
4292
+ function slicc_socketpair_js(unix_domain,nonblock,cloexec,fds) { const r = Module.sliccKernel.net.socketpair(unix_domain ? 'unix' : 'inet', !!nonblock, !!cloexec); if (typeof r === 'number') return r; HEAP32[fds >> 2] = r[0]; HEAP32[(fds >> 2) + 1] = r[1]; return 0; }
4293
+ function slicc_bind_js(fd,family,ip,port,path,connect) { const host = [ ip >>> 24, (ip >>> 16) & 255, (ip >>> 8) & 255, ip & 255 ].join('.'); const addr = family === 1 ? { family : 'unix', path : UTF8ToString(path) } : { family : 'inet', host, port }; const net = Module.sliccKernel.net; return connect ? net.connect(fd, addr) : net.bind(fd, addr); }
4294
+ function slicc_listen_js(fd,backlog) { return Module.sliccKernel.net.listen(fd, backlog); }
4295
+ function slicc_addr_call_js(op,fd,arg,out) { const net = Module.sliccKernel.net; const r = op === 0 ? net.accept(fd, !!(arg & 1), !!(arg & 2)) : net.name(fd, op === 2); if (typeof r === 'number') return r; const a = op === 0 ? r.peer : r; if (a && a.family === 'unix') { HEAP32[out >> 2] = 1; const bytes = new TextEncoder().encode(a.path).subarray(0, 107); HEAPU8.set(bytes, out + 12); HEAPU8[out + 12 + bytes.length] = 0; } else if (a) { const q = a.host.split('.').map(Number); HEAP32[out >> 2] = 2; HEAPU32[(out + 4) >> 2] = ((q[0] << 24) | (q[1] << 16) | (q[2] << 8) | q[3]) >>> 0; HEAP32[(out + 8) >> 2] = a.port; } return op === 0 ? r.fd : 0; }
4296
+ function slicc_shutdown_js(fd,how) { return Module.sliccKernel.net.shutdown(fd, how); }
4297
+ function slicc_getopt_js(fd,level,name,value) { const r = Module.sliccKernel.net.getopt(fd, level, name); if (typeof r === 'number') return r; HEAP32[value >> 2] = r.value; return 0; }
4298
+ function slicc_setopt_js(fd,level,name,value) { return Module.sliccKernel.net.setopt(fd, level, name, value); }
4299
+ function slicc_send_js(fd,buf,len,dontwait,nosignal) { const bytes = HEAPU8.slice(buf, buf + len); return Module.sliccKernel.net.send(fd, bytes, { dontwait : !!dontwait, nosignal : !!nosignal }); }
4300
+ function slicc_recv_js(fd,buf,len,dontwait,peek) { const r = Module.sliccKernel.net.recv(fd, len, { dontwait : !!dontwait, peek : !!peek }); if (typeof r === 'number') return r; HEAPU8.set(r, buf); return r.length; }
4301
+ function slicc_resolve_js(name,out,max) { const net = Module.sliccKernel && Module.sliccKernel.net; if (!net || typeof net.resolve !== 'function') return -52; const r = net.resolve(UTF8ToString(name), 4); if (typeof r === 'number') return r < 0 ? r : -52; if (!Array.isArray(r)) return -52; let n = 0; for (const a of r) { const parts = String(a).split('.'); if (parts.length !== 4 || n >= max) continue; const q = parts.map(Number); if (q.some((x, i) => String(x) !== parts[i] || x > 255)) continue; HEAPU32[(out >> 2) + n++] = ((q[0] << 24) | (q[1] << 16) | (q[2] << 8) | q[3]) >>> 0; } return n; }
5495
4302
  function slicc_spawn_capture_js(path,argv,envp,cwd,in_fd,out_fd,err_fd,actions,nactions) { const strings = (ptr) => { const out = []; for (let i = 0; ptr; i++) { const s = HEAPU32[(ptr >> 2) + i]; if (!s) break; out.push(UTF8ToString(s)); } return out; }; const isTty = (st) => st && FS.isChrdev(st.node.mode); const file = UTF8ToString(path); if (!file) return -44; const args = strings(argv); const envList = strings(envp); const env = {}; for (const kv of envList) { const eq = kv.indexOf('='); if (eq > 0) env[kv.slice(0, eq)] = kv.slice(eq + 1); } if (Module.sliccKernel) { const pairs = []; for (let i = 0; i < nactions; i++) { pairs.push([HEAP32[(actions >> 2) + 2 * i], HEAP32[(actions >> 2) + 2 * i + 1]]); } return Module.sliccKernel.spawn(file, args, envList.length ? env : null, cwd ? UTF8ToString(cwd) : null, [in_fd === -2 ? 0 : in_fd, out_fd, err_fd], pairs); } let input; if (in_fd >= 0) { try { const st = FS.getStream(in_fd); if (st && !isTty(st)) { const chunks = []; const buf = new Uint8Array(65536); let n; while ((n = FS.read(st, buf, 0, buf.length)) > 0) chunks.push(buf.slice(0, n)); if (chunks.length) input = Buffer.concat(chunks); } } catch (e) { } } if (Module.sliccBeforeSpawn) Module.sliccBeforeSpawn(); let r; try { r = require('child_process').spawnSync(file, args.slice(1), { cwd: cwd ? UTF8ToString(cwd) : FS.cwd(), env: envList.length ? env : process.env, input, }); } catch (e) { return e && e.code === 'ENOENT' ? -44 : -29; } finally { if (Module.sliccAfterSpawn) Module.sliccAfterSpawn(); } if (r.error) return r.error.code === 'ENOENT' ? -44 : -29; const put = (fd, data) => { if (fd < 0 || !data || !data.length) return; const bytes = typeof data === 'string' ? new TextEncoder().encode(data) : data; let st; try { st = FS.getStream(fd); } catch (e) {} if ((fd === 1 || fd === 2) && (!st || isTty(st))) { (fd === 1 ? process.stdout : process.stderr).write(bytes); return; } if (st) FS.write(st, bytes, 0, bytes.length); }; put(out_fd, r.stdout); put(err_fd, r.stderr); Module.sliccExited = Module.sliccExited || new Map(); Module.sliccNextPid = Module.sliccNextPid || 1000; const pid = ++Module.sliccNextPid; Module.sliccExited.set(pid, r.signal ? 9 : ((r.status ?? 1) & 0xff) << 8); return pid; }
5496
4303
  function slicc_wait_js(pid,status,options) { const nohang = options & 1; const gone = (st) => (st & 0xff) !== 0x7f && st !== 0xffff; const done = Module.sliccExited; const kernel = Module.sliccKernel; if (kernel) { const put = (reaped, st) => { if (status && reaped > 0) HEAP32[status >> 2] = st; return reaped; }; const exitedKey = pid > 0 ? (done?.has(pid) ? pid : undefined) : done?.keys().next().value; if (exitedKey !== undefined) { const st = done.get(exitedKey); done.delete(exitedKey); return put(exitedKey, st); } const aliases = Module.sliccAliases; if (pid > 0 && aliases?.has(pid)) { const r = kernel.wait(aliases.get(pid), !!nohang, options); if (typeof r === 'number') return r; if (r[0] > 0 && gone(r[1])) aliases.delete(pid); return put(r[0] > 0 ? pid : 0, r[1]); } const r = kernel.wait(pid, !!nohang, options); if (typeof r === 'number') return r; for (const [forkPid, kernelPid] of aliases ?? []) { if (kernelPid !== r[0]) continue; if (gone(r[1])) aliases.delete(forkPid); return put(forkPid, r[1]); } return put(r[0], r[1]); } if (!done || done.size === 0) return -12; const key = pid > 0 ? pid : done.keys().next().value; if (!done.has(key)) return -12; if (status) HEAP32[status >> 2] = done.get(key); done.delete(key); return key; }
5497
4304
  function slicc_exec_detach(pid) { if (!Module.sliccKernel || typeof SliccFork === 'undefined' || !SliccFork.stack.length) return 0; SliccFork.execPid = pid; return 1; }
5498
4305
  function slicc_exec_wait_js(pid) { if (!Module.sliccKernel || !Module.sliccKernel.execWait) return -1; return Module.sliccKernel.execWait(pid); }
4306
+ function slicc_execve_js(path,argv,envp) { const k = Module.sliccKernel; if (!k || typeof k.execve !== 'function') return -0x40000000; const strings = (ptr) => { const out = []; for (let i = 0; ptr; i++) { const s = HEAPU32[(ptr >> 2) + i]; if (!s) break; out.push(UTF8ToString(s)); } return out; }; const file = UTF8ToString(path); if (!file) return -44; let env = null; if (envp) { env = {}; for (const kv of strings(envp)) { const eq = kv.indexOf('='); if (eq > 0) env[kv.slice(0, eq)] = kv.slice(eq + 1); } } return k.execve(file, strings(argv), env, null); }
4307
+ function slicc_in_emulated_fork() { return typeof SliccFork !== 'undefined' && SliccFork.stack.length > 0 ? 1 : 0; }
5499
4308
  function slicc_sleep_ms(ms) { if (typeof SharedArrayBuffer === 'function' && typeof Atomics === 'object') { Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms); return; } const end = Date.now() + ms; while (Date.now() < end) {} }
5500
4309
  function slicc_default_getpid_js() { return (Module.sliccPid | 0) || 42; }
5501
4310
  function slicc_default_getppid_js() { return (Module.sliccPpid | 0) || 1; }
@@ -5506,16 +4315,13 @@ function slicc_poll_js(fds,n,timeout_ms) { const IN = 0x001 | 0x040; const OUT =
5506
4315
  function slicc_jobs_js(op,a,b) { const k = Module.sliccKernel; if (!k || !k.setpgid) return -0x40000000; switch (op) { case 0: return k.setpgid(a, b); case 1: return k.getpgid(a); case 2: return k.getsid(a); case 3: return k.setsid(); case 4: return k.tcgetpgrp(a); case 5: return k.tcsetpgrp(a, b); } return -52; }
5507
4316
 
5508
4317
  // Imports from the Wasm binary.
5509
- var _malloc,
4318
+ var _slicc_cred_euid,
5510
4319
  _fflush,
5511
4320
  _main,
5512
4321
  _slicc_sigpipe,
5513
4322
  _slicc_raise,
5514
4323
  _slicc_sig_mask,
5515
4324
  ___funcs_on_exit,
5516
- _htonl,
5517
- _htons,
5518
- _ntohs,
5519
4325
  _setThrew,
5520
4326
  __emscripten_stack_restore,
5521
4327
  __emscripten_stack_alloc,
@@ -5527,16 +4333,13 @@ var _malloc,
5527
4333
 
5528
4334
 
5529
4335
  function assignWasmExports(wasmExports) {
5530
- _malloc = wasmExports['malloc'];
4336
+ _slicc_cred_euid = Module['_slicc_cred_euid'] = wasmExports['slicc_cred_euid'];
5531
4337
  _fflush = wasmExports['fflush'];
5532
4338
  _main = Module['_main'] = wasmExports['__main_argc_argv'];
5533
4339
  _slicc_sigpipe = Module['_slicc_sigpipe'] = wasmExports['slicc_sigpipe'];
5534
4340
  _slicc_raise = Module['_slicc_raise'] = wasmExports['slicc_raise'];
5535
4341
  _slicc_sig_mask = Module['_slicc_sig_mask'] = wasmExports['slicc_sig_mask'];
5536
4342
  ___funcs_on_exit = wasmExports['__funcs_on_exit'];
5537
- _htonl = wasmExports['htonl'];
5538
- _htons = wasmExports['htons'];
5539
- _ntohs = wasmExports['ntohs'];
5540
4343
  _setThrew = wasmExports['setThrew'];
5541
4344
  __emscripten_stack_restore = wasmExports['_emscripten_stack_restore'];
5542
4345
  __emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc'];
@@ -5551,14 +4354,8 @@ var wasmImports = {
5551
4354
  /** @export */
5552
4355
  __call_sighandler: ___call_sighandler,
5553
4356
  /** @export */
5554
- __syscall_accept4: ___syscall_accept4,
5555
- /** @export */
5556
- __syscall_bind: ___syscall_bind,
5557
- /** @export */
5558
4357
  __syscall_chmod: ___syscall_chmod,
5559
4358
  /** @export */
5560
- __syscall_connect: ___syscall_connect,
5561
- /** @export */
5562
4359
  __syscall_dup: ___syscall_dup,
5563
4360
  /** @export */
5564
4361
  __syscall_dup3: ___syscall_dup3,
@@ -5571,8 +4368,6 @@ var wasmImports = {
5571
4368
  /** @export */
5572
4369
  __syscall_ioctl: ___syscall_ioctl,
5573
4370
  /** @export */
5574
- __syscall_listen: ___syscall_listen,
5575
- /** @export */
5576
4371
  __syscall_lstat64: ___syscall_lstat64,
5577
4372
  /** @export */
5578
4373
  __syscall_newfstatat: ___syscall_newfstatat,
@@ -5581,12 +4376,10 @@ var wasmImports = {
5581
4376
  /** @export */
5582
4377
  __syscall_pipe: ___syscall_pipe,
5583
4378
  /** @export */
5584
- __syscall_recvfrom: ___syscall_recvfrom,
5585
- /** @export */
5586
- __syscall_socket: ___syscall_socket,
5587
- /** @export */
5588
4379
  __syscall_stat64: ___syscall_stat64,
5589
4380
  /** @export */
4381
+ __syscall_uname: ___syscall_uname,
4382
+ /** @export */
5590
4383
  _abort_js: __abort_js,
5591
4384
  /** @export */
5592
4385
  _emscripten_runtime_keepalive_clear: __emscripten_runtime_keepalive_clear,
@@ -5599,8 +4392,6 @@ var wasmImports = {
5599
4392
  /** @export */
5600
4393
  _mktime_js: __mktime_js,
5601
4394
  /** @export */
5602
- _poll_js: __poll_js,
5603
- /** @export */
5604
4395
  _timegm_js: __timegm_js,
5605
4396
  /** @export */
5606
4397
  _tzset_js: __tzset_js,
@@ -5627,8 +4418,6 @@ var wasmImports = {
5627
4418
  /** @export */
5628
4419
  fd_write: _fd_write,
5629
4420
  /** @export */
5630
- getaddrinfo: _getaddrinfo,
5631
- /** @export */
5632
4421
  invoke_i,
5633
4422
  /** @export */
5634
4423
  invoke_ii,
@@ -5655,6 +4444,12 @@ var wasmImports = {
5655
4444
  /** @export */
5656
4445
  proc_exit: _proc_exit,
5657
4446
  /** @export */
4447
+ slicc_addr_call_js,
4448
+ /** @export */
4449
+ slicc_bind_js,
4450
+ /** @export */
4451
+ slicc_cred_js,
4452
+ /** @export */
5658
4453
  slicc_default_getpid_js,
5659
4454
  /** @export */
5660
4455
  slicc_default_getppid_js,
@@ -5663,12 +4458,36 @@ var wasmImports = {
5663
4458
  /** @export */
5664
4459
  slicc_exec_wait_js,
5665
4460
  /** @export */
4461
+ slicc_execve_js,
4462
+ /** @export */
4463
+ slicc_groups_js,
4464
+ /** @export */
4465
+ slicc_in_emulated_fork,
4466
+ /** @export */
5666
4467
  slicc_jobs_js,
5667
4468
  /** @export */
5668
4469
  slicc_kill_js,
5669
4470
  /** @export */
4471
+ slicc_listen_js,
4472
+ /** @export */
4473
+ slicc_net_ready,
4474
+ /** @export */
4475
+ slicc_pause_js,
4476
+ /** @export */
4477
+ slicc_poll_js,
4478
+ /** @export */
4479
+ slicc_recv_js,
4480
+ /** @export */
4481
+ slicc_resolve_js,
4482
+ /** @export */
4483
+ slicc_setopt_js,
4484
+ /** @export */
4485
+ slicc_shutdown_js,
4486
+ /** @export */
5670
4487
  slicc_sleep_ms,
5671
4488
  /** @export */
4489
+ slicc_socket_js,
4490
+ /** @export */
5672
4491
  slicc_spawn_capture_js,
5673
4492
  /** @export */
5674
4493
  slicc_wait_js