// 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
	}
}
