mirror of
https://github.com/golang/go.git
synced 2025-05-29 11:25:43 +00:00
syscall: fix Fchdir on js/wasm
NodeJS does not support fchdir so it has to be emulated with chdir by saving the path when opening a directory. However, if the path opened is relative, saving this path is not sufficient, because after changing the working directory the path does not resolve correctly any more, thus a subsequent fd.Chdir() fails. This change fixes the issue by resolving a relative path when opening the directory and saving the absolute path instead. Fixes #37448 Change-Id: Id6bc8c4232b0019fc11e850599a526336608ce54 Reviewed-on: https://go-review.googlesource.com/c/go/+/221717 Run-TryBot: Richard Musiol <neelance@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
This commit is contained in:
parent
7913f7dfcf
commit
e44cda3aa9
@ -1242,6 +1242,41 @@ func testChtimes(t *testing.T, name string) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestFileChdir(t *testing.T) {
|
||||
// TODO(brainman): file.Chdir() is not implemented on windows.
|
||||
if runtime.GOOS == "windows" {
|
||||
return
|
||||
}
|
||||
|
||||
wd, err := Getwd()
|
||||
if err != nil {
|
||||
t.Fatalf("Getwd: %s", err)
|
||||
}
|
||||
defer Chdir(wd)
|
||||
|
||||
fd, err := Open(".")
|
||||
if err != nil {
|
||||
t.Fatalf("Open .: %s", err)
|
||||
}
|
||||
defer fd.Close()
|
||||
|
||||
if err := Chdir("/"); err != nil {
|
||||
t.Fatalf("Chdir /: %s", err)
|
||||
}
|
||||
|
||||
if err := fd.Chdir(); err != nil {
|
||||
t.Fatalf("fd.Chdir: %s", err)
|
||||
}
|
||||
|
||||
wdNew, err := Getwd()
|
||||
if err != nil {
|
||||
t.Fatalf("Getwd: %s", err)
|
||||
}
|
||||
if wdNew != wd {
|
||||
t.Fatalf("fd.Chdir failed, got %s, want %s", wdNew, wd)
|
||||
}
|
||||
}
|
||||
|
||||
func TestChdirAndGetwd(t *testing.T) {
|
||||
// TODO(brainman): file.Chdir() is not implemented on windows.
|
||||
if runtime.GOOS == "windows" {
|
||||
|
@ -102,6 +102,10 @@ func Open(path string, openmode int, perm uint32) (int, error) {
|
||||
}
|
||||
}
|
||||
|
||||
if path[0] != '/' {
|
||||
cwd := jsProcess.Call("cwd").String()
|
||||
path = cwd + "/" + path
|
||||
}
|
||||
f := &jsFile{
|
||||
path: path,
|
||||
entries: entries,
|
||||
|
Loading…
x
Reference in New Issue
Block a user