]> Cypherpunks repositories - gostls13.git/commitdiff
os: make Open() O_APPEND flag work on windows
authorAlex Brainman <alex.brainman@gmail.com>
Wed, 22 Sep 2010 03:12:25 +0000 (13:12 +1000)
committerAlex Brainman <alex.brainman@gmail.com>
Wed, 22 Sep 2010 03:12:25 +0000 (13:12 +1000)
Fixes #1124.
Implementation is suggested by Skip.
Test is suggested by PeterGo.

R=r, PeterGo, rsc
CC=golang-dev, skip.tavakkolian
https://golang.org/cl/2256041

src/pkg/os/os_test.go
src/pkg/syscall/syscall_windows.go
src/pkg/syscall/ztypes_windows_386.go

index 05af090dae0dd24bf338448d109fb84bc5a5cc14..f8b2d010dbb05be58ddad7cba4520fb3a954ed63 100644 (file)
@@ -742,3 +742,33 @@ func TestWriteAt(t *testing.T) {
                t.Fatalf("after write: have %q want %q", string(b), "hello, WORLD\n")
        }
 }
+
+func writeFile(t *testing.T, fname string, flag int, text string) string {
+       f, err := Open(fname, flag, 0666)
+       if err != nil {
+               t.Fatalf("Open: %v", err)
+       }
+       n, err := io.WriteString(f, text)
+       if err != nil {
+               t.Fatalf("WriteString: %d, %v", n, err)
+       }
+       f.Close()
+       data, err := ioutil.ReadFile(fname)
+       if err != nil {
+               t.Fatalf("ReadFile: %v", err)
+       }
+       return string(data)
+}
+
+func TestAppend(t *testing.T) {
+       const f = "append.txt"
+       defer Remove(f)
+       s := writeFile(t, f, O_CREAT|O_TRUNC|O_RDWR, "new")
+       if s != "new" {
+               t.Fatalf("writeFile: have %q want %q", s, "new")
+       }
+       s = writeFile(t, f, O_APPEND|O_RDWR, "|append")
+       if s != "new|append" {
+               t.Fatalf("writeFile: have %q want %q", s, "new|append")
+       }
+}
index 3eb0af16db0b85ba56c0d74dce419793e85e6e99..e2a29202ff2969d08d51b88e8b07a0461ae5ec5a 100644 (file)
@@ -184,6 +184,10 @@ func Open(path string, mode int, perm uint32) (fd int, errno int) {
        if mode&O_CREAT != 0 {
                access |= GENERIC_WRITE
        }
+       if mode&O_APPEND != 0 {
+               access &^= GENERIC_WRITE
+               access |= FILE_APPEND_DATA
+       }
        sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE)
        var createmode uint32
        switch {
index 609b3801e93b60afaf916fdbce7204bed10ecb65..6b1ac27aa06c93cc483eef6469d81afc20a2a410 100644 (file)
@@ -56,6 +56,8 @@ const (
        GENERIC_EXECUTE = 0x20000000
        GENERIC_ALL     = 0x10000000
 
+       FILE_APPEND_DATA = 0x00000004
+
        FILE_SHARE_READ          = 0x00000001
        FILE_SHARE_WRITE         = 0x00000002
        FILE_SHARE_DELETE        = 0x00000004