]> Cypherpunks repositories - gostls13.git/commitdiff
os,syscall: implement functions related to uid, gid and pid on js/wasm
authorRichard Musiol <mail@richard-musiol.de>
Thu, 13 Dec 2018 20:56:45 +0000 (21:56 +0100)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 22 Mar 2019 15:40:37 +0000 (15:40 +0000)
This change implements the following functions on js/wasm:
- os.Chown
- os.Fchown
- os.Lchown
- syscall.Getuid
- syscall.Getgid
- syscall.Geteuid
- syscall.Getegid
- syscall.Getgroups
- syscall.Getpid
- syscall.Getppid
- syscall.Umask

Change-Id: Icdb0fafc02c9df6e9e3573542f8499c3464dc671
Reviewed-on: https://go-review.googlesource.com/c/go/+/154157
Run-TryBot: Richard Musiol <neelance@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/cmd/go/internal/work/build_test.go
src/os/os_unix_test.go
src/os/sticky_bsd.go
src/os/sticky_notbsd.go
src/syscall/fs_js.go
src/syscall/syscall_js.go

index ef95a408ca31bbc7fddbcef31aac019853bc41fe..55e1eea25ba08aaccc0df7b95d962010c65543d4 100644 (file)
@@ -227,8 +227,8 @@ func TestRespectSetgidDir(t *testing.T) {
                if runtime.GOARCH == "arm" || runtime.GOARCH == "arm64" {
                        t.Skip("can't set SetGID bit with chmod on iOS")
                }
-       case "windows", "plan9", "js":
-               t.Skip("chown/chmod setgid are not supported on Windows, Plan 9, or JS")
+       case "windows", "plan9":
+               t.Skip("chown/chmod setgid are not supported on Windows or Plan 9")
        }
 
        var b Builder
index 2aa930ea80dd0d966da82f5e2877602b8e571013..87c3bcd8fa6393f640baa81b830807b6b2e62c4a 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
+// +build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris
 
 package os_test
 
@@ -152,6 +152,9 @@ func TestLchown(t *testing.T) {
        gid := Getgid()
        t.Log("gid:", gid)
        if err = Lchown(linkname, -1, gid); err != nil {
+               if err, ok := err.(*PathError); ok && err.Err == syscall.ENOSYS {
+                       t.Skip("lchown is unavailable")
+               }
                t.Fatalf("lchown %s -1 %d: %s", linkname, gid, err)
        }
        sys := dir.Sys().(*syscall.Stat_t)
@@ -231,6 +234,10 @@ func TestMkdirStickyUmask(t *testing.T) {
 
 // See also issues: 22939, 24331
 func newFileTest(t *testing.T, blocking bool) {
+       if runtime.GOOS == "js" {
+               t.Skipf("syscall.Pipe is not available on %s.", runtime.GOOS)
+       }
+
        p := make([]int, 2)
        if err := syscall.Pipe(p); err != nil {
                t.Fatalf("pipe: %v", err)
index ae2744f81756bed1d41cd0556afa426739c65ca8..c09b1ac202889a2f86416dcee0b9f92165faf9a2 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build aix darwin dragonfly freebsd netbsd openbsd solaris
+// +build aix darwin dragonfly freebsd js,wasm netbsd openbsd solaris
 
 package os
 
index edb5f69bf0580ce8409eb9430d2261feddf092c9..c15850692cd75470888bde254afbe5268e674617 100644 (file)
@@ -6,6 +6,7 @@
 // +build !darwin
 // +build !dragonfly
 // +build !freebsd
+// +build !js !wasm
 // +build !netbsd
 // +build !openbsd
 // +build !solaris
index fcc5f038b823c10d481a3e835976b2d8bbedc859..b36cefc69addf039ea57d5fee642352e66edbe6b 100644 (file)
@@ -244,18 +244,26 @@ func Chown(path string, uid, gid int) error {
        if err := checkPath(path); err != nil {
                return err
        }
-       return ENOSYS
+       _, err := fsCall("chown", path, uint32(uid), uint32(gid))
+       return err
 }
 
 func Fchown(fd int, uid, gid int) error {
-       return ENOSYS
+       _, err := fsCall("fchown", fd, uint32(uid), uint32(gid))
+       return err
 }
 
 func Lchown(path string, uid, gid int) error {
        if err := checkPath(path); err != nil {
                return err
        }
-       return ENOSYS
+       if jsFS.Get("lchown") == js.Undefined() {
+               // fs.lchown is unavailable on Linux until Node.js 10.6.0
+               // TODO(neelance): remove when we require at least this Node.js version
+               return ENOSYS
+       }
+       _, err := fsCall("lchown", path, uint32(uid), uint32(gid))
+       return err
 }
 
 func UtimesNano(path string, ts []Timespec) error {
index 4dfcc6ed6415cdc85bc2193966be8221b6c99a88..99f9a935fe5ff9b1d782d956daad5b9ac0af19a5 100644 (file)
@@ -285,14 +285,45 @@ func Getwd() (wd string, err error) {
        return string(buf[:n]), nil
 }
 
-func Getegid() int                      { return 1 }
-func Geteuid() int                      { return 1 }
-func Getgid() int                       { return 1 }
-func Getgroups() ([]int, error)         { return []int{1}, nil }
-func Getppid() int                      { return 2 }
-func Getpid() int                       { return 3 }
-func Gettimeofday(tv *Timeval) error    { return ENOSYS }
-func Getuid() int                       { return 1 }
+func Getuid() int {
+       return jsProcess.Call("getuid").Int()
+}
+
+func Getgid() int {
+       return jsProcess.Call("getgid").Int()
+}
+
+func Geteuid() int {
+       return jsProcess.Call("geteuid").Int()
+}
+
+func Getegid() int {
+       return jsProcess.Call("getegid").Int()
+}
+
+func Getgroups() ([]int, error) {
+       array := jsProcess.Call("getgroups")
+       groups := make([]int, array.Length())
+       for i := range groups {
+               groups[i] = array.Index(i).Int()
+       }
+       return groups, nil
+}
+
+func Getpid() int {
+       return jsProcess.Get("pid").Int()
+}
+
+func Getppid() int {
+       return jsProcess.Get("ppid").Int()
+}
+
+func Umask(mask int) (oldmask int) {
+       return jsProcess.Call("umask", mask).Int()
+}
+
+func Gettimeofday(tv *Timeval) error { return ENOSYS }
+
 func Kill(pid int, signum Signal) error { return ENOSYS }
 func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
        return 0, ENOSYS