1
0
mirror of https://github.com/golang/go synced 2024-11-23 20:20:01 -07:00

os,syscall: implement functions related to uid, gid and pid on js/wasm

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>
This commit is contained in:
Richard Musiol 2018-12-13 21:56:45 +01:00 committed by Brad Fitzpatrick
parent d0cbf9bf53
commit b06d2122ee
6 changed files with 62 additions and 15 deletions

View 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

View 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)

View 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

View File

@ -6,6 +6,7 @@
// +build !darwin
// +build !dragonfly
// +build !freebsd
// +build !js !wasm
// +build !netbsd
// +build !openbsd
// +build !solaris

View File

@ -244,19 +244,27 @@ 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
}
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 {
if err := checkPath(path); err != nil {

View 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 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 Getuid() int { return 1 }
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