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