summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2019-09-01 14:19:19 -0400
committerAustin Clements <austin@google.com>2019-09-04 17:56:17 +0000
commit0607cdda6b9f978b268464e9a42630c702dbd833 (patch)
treed4cc848f52d648511ec72e6f0fd80cd039aa3a4a /src
parent4af3c17f8cd37288a5bb9bc53e8b88c58f5624d1 (diff)
downloadgo-git-0607cdda6b9f978b268464e9a42630c702dbd833.tar.gz
syscall: redirect writes to runtime.write in faketime mode
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>
Diffstat (limited to 'src')
-rw-r--r--src/syscall/fs_js.go8
-rw-r--r--src/syscall/syscall_plan9.go8
-rw-r--r--src/syscall/syscall_unix.go9
-rw-r--r--src/syscall/time_fake.go26
-rw-r--r--src/syscall/time_nofake.go14
5 files changed, 64 insertions, 1 deletions
diff --git a/src/syscall/fs_js.go b/src/syscall/fs_js.go
index 1b835c5048..91042f10ef 100644
--- a/src/syscall/fs_js.go
+++ b/src/syscall/fs_js.go
@@ -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)
diff --git a/src/syscall/syscall_plan9.go b/src/syscall/syscall_plan9.go
index d4e679c92a..1648e409b0 100644
--- a/src/syscall/syscall_plan9.go
+++ b/src/syscall/syscall_plan9.go
@@ -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)
}
diff --git a/src/syscall/syscall_unix.go b/src/syscall/syscall_unix.go
index 1d0be94305..457be311c4 100644
--- a/src/syscall/syscall_unix.go
+++ b/src/syscall/syscall_unix.go
@@ -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
index 0000000000..5dec57a25a
--- /dev/null
+++ b/src/syscall/time_fake.go
@@ -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
index 0000000000..c94cef8686
--- /dev/null
+++ b/src/syscall/time_nofake.go
@@ -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")
+}