}
}
+func TestStatStdin(t *testing.T) {
+ if runtime.GOOS == "plan9" {
+ t.Skipf("skipping test on plan9")
+ }
+
+ testenv.MustHaveExec(t)
+
+ if Getenv("GO_WANT_HELPER_PROCESS") == "1" {
+ st, err := Stdin.Stat()
+ if err != nil {
+ t.Fatalf("Stat failed: %v", err)
+ }
+ fmt.Println(st.Mode() & ModeNamedPipe)
+ Exit(0)
+ }
+
+ var cmd *osexec.Cmd
+ if runtime.GOOS == "windows" {
+ cmd = osexec.Command("cmd", "/c", "echo output | "+Args[0]+" -test.run=TestStatStdin")
+ } else {
+ cmd = osexec.Command("/bin/sh", "-c", "echo output | "+Args[0]+" -test.run=TestStatStdin")
+ }
+ cmd.Env = append(Environ(), "GO_WANT_HELPER_PROCESS=1")
+
+ output, err := cmd.CombinedOutput()
+ if err != nil {
+ t.Fatalf("Failed to spawn child process: %v %q", err, string(output))
+ }
+
+ // result will be like "prw-rw-rw"
+ if len(output) < 1 || output[0] != 'p' {
+ t.Fatalf("Child process reports stdin is not pipe '%v'", string(output))
+ }
+}
+
func TestReadAtEOF(t *testing.T) {
f := newFile("TestReadAtEOF", t)
defer Remove(f.Name())
if file.name == DevNull {
return &devNullStat, nil
}
+
+ ft, err := syscall.GetFileType(file.fd)
+ if err != nil {
+ return nil, &PathError{"GetFileType", file.name, err}
+ }
+ if ft == syscall.FILE_TYPE_PIPE {
+ return &fileStat{name: basename(file.name), pipe: true}, nil
+ }
+
var d syscall.ByHandleFileInformation
- e := syscall.GetFileInformationByHandle(syscall.Handle(file.fd), &d)
- if e != nil {
- return nil, &PathError{"GetFileInformationByHandle", file.name, e}
+ err = syscall.GetFileInformationByHandle(syscall.Handle(file.fd), &d)
+ if err != nil {
+ return nil, &PathError{"GetFileInformationByHandle", file.name, err}
}
return &fileStat{
name: basename(file.name),
vol: d.VolumeSerialNumber,
idxhi: d.FileIndexHigh,
idxlo: d.FileIndexLow,
+ pipe: false,
}, nil
}