]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: redirect writes to runtime.write in faketime mode
authorAustin Clements <austin@google.com>
Sun, 1 Sep 2019 18:19:19 +0000 (14:19 -0400)
committerAustin Clements <austin@google.com>
Wed, 4 Sep 2019 17:56:17 +0000 (17:56 +0000)
If the faketime build tag is set, this causes syscall.Write for FDs 1
and 2 to redirect to runtime.write, since that's where we'll apply the
faketime framing. This is equivalent to what nacl currently does in
naclFile.write.

We do this on all of the platforms except nacl, which has its own
faketime support and we're about to remove, and Windows, which would
require other changes to support faketime so we're leaving alone for
now.

Updates #30439.

Change-Id: I138a5ca63577d92d15b5437d037bd3159fa84ee7
Reviewed-on: https://go-review.googlesource.com/c/go/+/192739
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/syscall/fs_js.go
src/syscall/syscall_plan9.go
src/syscall/syscall_unix.go
src/syscall/time_fake.go [new file with mode: 0644]
src/syscall/time_nofake.go [new file with mode: 0644]

index 1b835c50484033a55f06a53cfd55905dd9797fd0..91042f10efdba523d44342424082c704e850aee1 100644 (file)
@@ -404,6 +404,14 @@ func Write(fd int, b []byte) (int, error) {
                return n, err
        }
 
+       if faketime && (fd == 1 || fd == 2) {
+               n := faketimeWrite(fd, b)
+               if n < 0 {
+                       return 0, errnoErr(Errno(-n))
+               }
+               return n, nil
+       }
+
        buf := uint8Array.New(len(b))
        js.CopyBytesToJS(buf, b)
        n, err := fsCall("write", fd, buf, 0, len(b), nil)
index d4e679c92a0d0c0f0c728782942954ec581656a5..1648e409b092ca5d2ec03e6923448116391b8419 100644 (file)
@@ -167,6 +167,14 @@ func Read(fd int, p []byte) (n int, err error) {
 }
 
 func Write(fd int, p []byte) (n int, err error) {
+       if faketime && (fd == 1 || fd == 2) {
+               n = faketimeWrite(fd, p)
+               if n < 0 {
+                       return 0, ErrorString("error")
+               }
+               return n, nil
+       }
+
        return Pwrite(fd, p, -1)
 }
 
index 1d0be94305124533429fb269f89af79417052eb1..457be311c4fdf9d7b23ad7fb0366745e2f3f125d 100644 (file)
@@ -205,7 +205,14 @@ func Write(fd int, p []byte) (n int, err error) {
        if race.Enabled {
                race.ReleaseMerge(unsafe.Pointer(&ioSync))
        }
-       n, err = write(fd, p)
+       if faketime && (fd == 1 || fd == 2) {
+               n = faketimeWrite(fd, p)
+               if n < 0 {
+                       n, err = 0, errnoErr(Errno(-n))
+               }
+       } else {
+               n, err = write(fd, p)
+       }
        if race.Enabled && n > 0 {
                race.ReadRange(unsafe.Pointer(&p[0]), n)
        }
diff --git a/src/syscall/time_fake.go b/src/syscall/time_fake.go
new file mode 100644 (file)
index 0000000..5dec57a
--- /dev/null
@@ -0,0 +1,26 @@
+// Copyright 2019 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.
+
+// +build faketime
+
+package syscall
+
+import "unsafe"
+
+const faketime = true
+
+// When faketime is enabled, we redirect writes to FDs 1 and 2 through
+// the runtime's write function, since that adds the framing that
+// reports the emulated time.
+
+//go:linkname runtimeWrite runtime.write
+func runtimeWrite(fd uintptr, p unsafe.Pointer, n int32) int32
+
+func faketimeWrite(fd int, p []byte) int {
+       var pp *byte
+       if len(p) > 0 {
+               pp = &p[0]
+       }
+       return int(runtimeWrite(uintptr(fd), unsafe.Pointer(pp), int32(len(p))))
+}
diff --git a/src/syscall/time_nofake.go b/src/syscall/time_nofake.go
new file mode 100644 (file)
index 0000000..c94cef8
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2019 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.
+
+// +build !faketime
+
+package syscall
+
+const faketime = false
+
+func faketimeWrite(fd int, p []byte) int {
+       // This should never be called since faketime is false.
+       panic("not implemented")
+}