Exit(0)
}
+ fi, err := Stdin.Stat()
+ if err != nil {
+ t.Fatal(err)
+ }
+ switch mode := fi.Mode(); {
+ case mode&ModeCharDevice != 0:
+ case mode&ModeNamedPipe != 0:
+ default:
+ t.Fatalf("unexpected Stdin mode (%v), want ModeCharDevice or ModeNamedPipe", mode)
+ }
+
var cmd *osexec.Cmd
if runtime.GOOS == "windows" {
cmd = osexec.Command("cmd", "/c", "echo output | "+Args[0]+" -test.run=TestStatStdin")
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
+ switch ft {
+ case syscall.FILE_TYPE_PIPE, syscall.FILE_TYPE_CHAR:
+ return &fileStat{name: basename(file.name), filetype: ft}, nil
}
var d syscall.ByHandleFileInformation
FileSizeHigh: d.FileSizeHigh,
FileSizeLow: d.FileSizeLow,
},
- vol: d.VolumeSerialNumber,
- idxhi: d.FileIndexHigh,
- idxlo: d.FileIndexLow,
- pipe: false,
+ filetype: ft,
+ vol: d.VolumeSerialNumber,
+ idxhi: d.FileIndexHigh,
+ idxlo: d.FileIndexLow,
}, nil
}
// A fileStat is the implementation of FileInfo returned by Stat and Lstat.
type fileStat struct {
- name string
- sys syscall.Win32FileAttributeData
- pipe bool
+ name string
+ sys syscall.Win32FileAttributeData
+ filetype uint32 // what syscall.GetFileType returns
// used to implement SameFile
sync.Mutex
if fs.sys.FileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT != 0 {
m |= ModeSymlink
}
- if fs.pipe {
+ switch fs.filetype {
+ case syscall.FILE_TYPE_PIPE:
m |= ModeNamedPipe
+ case syscall.FILE_TYPE_CHAR:
+ m |= ModeCharDevice
}
return m
}