]> Cypherpunks repositories - gostls13.git/commitdiff
os: return some invented data from Stat(DevNull) on windows
authorAlex Brainman <alex.brainman@gmail.com>
Thu, 15 Mar 2012 05:33:45 +0000 (16:33 +1100)
committerAlex Brainman <alex.brainman@gmail.com>
Thu, 15 Mar 2012 05:33:45 +0000 (16:33 +1100)
Fixes #3321.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5831043

src/pkg/os/os_test.go
src/pkg/os/stat_windows.go

index d1e241f006becb493d69397fb0a70702ad4dba9e..dec80cc091549d19e4b1ccbb451f6a22c99144d6 100644 (file)
@@ -1047,3 +1047,22 @@ func TestSameFile(t *testing.T) {
                t.Errorf("files should be different")
        }
 }
+
+func TestDevNullFile(t *testing.T) {
+       f, err := Open(DevNull)
+       if err != nil {
+               t.Fatalf("Open(%s): %v", DevNull, err)
+       }
+       defer f.Close()
+       fi, err := f.Stat()
+       if err != nil {
+               t.Fatalf("Stat(%s): %v", DevNull, err)
+       }
+       name := filepath.Base(DevNull)
+       if fi.Name() != name {
+               t.Fatalf("wrong file name have %v want %v", fi.Name(), name)
+       }
+       if fi.Size() != 0 {
+               t.Fatalf("wrong file size have %d want 0", fi.Size())
+       }
+}
index 6841748345061f7ed6b0715cfc4781d2188de2f7..75351c805a2705c56fc69e1e16db8a1f3d841b2c 100644 (file)
@@ -21,6 +21,9 @@ func (file *File) Stat() (fi FileInfo, err error) {
                // I don't know any better way to do that for directory
                return Stat(file.name)
        }
+       if file.name == DevNull {
+               return statDevNull()
+       }
        var d syscall.ByHandleFileInformation
        e := syscall.GetFileInformationByHandle(syscall.Handle(file.fd), &d)
        if e != nil {
@@ -41,6 +44,9 @@ func Stat(name string) (fi FileInfo, err error) {
        if len(name) == 0 {
                return nil, &PathError{"Stat", name, syscall.Errno(syscall.ERROR_PATH_NOT_FOUND)}
        }
+       if name == DevNull {
+               return statDevNull()
+       }
        var d syscall.Win32FileAttributeData
        e := syscall.GetFileAttributesEx(syscall.StringToUTF16Ptr(name), syscall.GetFileExInfoStandard, (*byte)(unsafe.Pointer(&d)))
        if e != nil {
@@ -69,6 +75,22 @@ func Lstat(name string) (fi FileInfo, err error) {
        return Stat(name)
 }
 
+// statDevNull return FileInfo structure describing DevNull file ("NUL").
+// It creates invented data, since none of windows api will return
+// that information.
+func statDevNull() (fi FileInfo, err error) {
+       return &fileStat{
+               name: DevNull,
+               mode: ModeDevice | ModeCharDevice | 0666,
+               sys: &winSys{
+                       // hopefully this will work for SameFile
+                       vol:   0,
+                       idxhi: 0,
+                       idxlo: 0,
+               },
+       }, nil
+}
+
 // basename removes trailing slashes and the leading
 // directory name and drive letter from path name.
 func basename(name string) string {