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)
}
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)
}
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)
}
--- /dev/null
+// 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))))
+}
--- /dev/null
+// 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")
+}