Your IP : 172.28.240.42


Current Path : /usr/local/go/src/runtime/internal/wasitest/testdata/
Upload File :
Current File : //usr/local/go/src/runtime/internal/wasitest/testdata/tcpecho.go

// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
	"errors"
	"net"
	"os"
	"syscall"
)

func main() {
	if err := run(); err != nil {
		println(err)
		os.Exit(1)
	}
}

func run() error {
	l, err := findListener()
	if err != nil {
		return err
	}
	if l == nil {
		return errors.New("no pre-opened sockets available")
	}
	defer l.Close()

	c, err := l.Accept()
	if err != nil {
		return err
	}
	return handleConn(c)
}

func handleConn(c net.Conn) error {
	defer c.Close()

	var buf [128]byte
	n, err := c.Read(buf[:])
	if err != nil {
		return err
	}
	if _, err := c.Write(buf[:n]); err != nil {
		return err
	}
	if err := c.(*net.TCPConn).CloseWrite(); err != nil {
		return err
	}
	return c.Close()
}

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 directors 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++ {
		f := os.NewFile(preopenFd, "")
		l, err := net.FileListener(f)
		f.Close()

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