]> Cypherpunks.ru repositories - gostls13.git/commit
net: implement wasip1 FileListener and FileConn
authorChris O'Hara <cohara87@gmail.com>
Mon, 8 May 2023 07:08:20 +0000 (17:08 +1000)
committerGopher Robot <gobot@golang.org>
Thu, 25 May 2023 00:12:41 +0000 (00:12 +0000)
commita17de43ef12250cd9a0ffdd8ff2d05fb18fcf322
tree1a092d125865530314bfa393625262302029330e
parentc5c2184538411c8cf7abc4e536fbe7af8b0307f5
net: implement wasip1 FileListener and FileConn

Implements net.FileListener and net.FileConn for wasip1.

net.FileListener can be used with a pre-opened socket. If the WASM
module knows the file descriptor, a listener can be constructed with:

    l, err := net.FileListener(os.NewFile(fd, ""))

If the WASM module does not know the file descriptor, but knows that at
least one of the preopens is a socket, it can find the file descriptor
and construct a listener like so:

    func findListener() (net.Listener, error) {
        // We start looking for pre-opened sockets at fd=3 because 0, 1,
        // and 2 are reserved for stdio. Pre-opened directories also
        // start at fd=3, so we skip fds that aren't sockets. Once we
        // reach EBADF we know there are no more pre-opens.
        for preopenFd := uintptr(3); ; preopenFd++ {
            l, err := net.FileListener(os.NewFile(preopenFd, ""))

            var se syscall.Errno
            switch errors.As(err, &se); se {
            case syscall.ENOTSOCK:
                continue
            case syscall.EBADF:
                err = nil
            }
            return l, err
        }
    }

A similar strategy can be used with net.FileConn and pre-opened
connection sockets.

The wasmtime runtime supports pre-opening listener sockets:

    $ wasmtime --tcplisten 127.0.0.1:8080 module.wasm

Change-Id: Iec6ae4ffa84b3753cce4f56a2817e150445db643
Reviewed-on: https://go-review.googlesource.com/c/go/+/493358
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
TryBot-Bypass: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
Auto-Submit: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
16 files changed:
misc/wasm/go_wasip1_wasm_exec
src/internal/poll/fd_unix.go
src/internal/poll/fd_unixjs.go
src/internal/poll/fd_wasip1.go
src/net/fd_wasip1.go [new file with mode: 0644]
src/net/file_stub.go
src/net/file_wasip1.go [new file with mode: 0644]
src/net/net_fake.go
src/net/net_fake_js.go [new file with mode: 0644]
src/os/file_wasip1.go [new file with mode: 0644]
src/runtime/internal/wasitest/tcpecho_test.go [new file with mode: 0644]
src/runtime/internal/wasitest/testdata/tcpecho.go [new file with mode: 0644]
src/syscall/fs_wasip1.go
src/syscall/net_fake.go [new file with mode: 0644]
src/syscall/net_js.go
src/syscall/net_wasip1.go