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

//go:build unix

package runtime

func checkfds() {
	if islibrary || isarchive {
		// If the program is actually a library, presumably being consumed by
		// another program, we don't want to mess around with the file
		// descriptors.
		return
	}

	const (
		// F_GETFD, EBADF, O_RDWR are standard across all unixes we support, so
		// we define them here rather than in each of the OS specific files.
		 = 0x01
		   = 0x09
		  = 0x02
	)

	 := []byte("/dev/null\x00")
	for  := 0;  < 3; ++ {
		,  := fcntl(int32(), , 0)
		if  >= 0 {
			continue
		}

		if  !=  {
			print("runtime: unexpected error while checking standard file descriptor ", , ", errno=", , "\n")
			throw("cannot open standard fds")
		}

		if  := open(&[0], , 0);  < 0 {
			print("runtime: standard file descriptor ", , " closed, unable to open /dev/null, errno=", , "\n")
			throw("cannot open standard fds")
		} else if  != int32() {
			print("runtime: opened unexpected file descriptor ", , " when attempting to open ", , "\n")
			throw("cannot open standard fds")
		}
	}
}