From 795e712b72802ad49b7c077964046f79c4f6586e Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Thu, 3 Mar 2016 20:54:24 +0000 Subject: [PATCH] os/user: make Current work without cgo Fixes #14626 Change-Id: I91c40407dc35355e5c5046f24111a126f99260d9 Reviewed-on: https://go-review.googlesource.com/20192 Reviewed-by: Ian Lance Taylor Reviewed-by: Minux Ma --- src/os/user/lookup_stubs.go | 50 +++++++++++++++++++++++++++++++++++-- src/os/user/user_test.go | 2 -- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/os/user/lookup_stubs.go b/src/os/user/lookup_stubs.go index 92391d7074..7ff4829516 100644 --- a/src/os/user/lookup_stubs.go +++ b/src/os/user/lookup_stubs.go @@ -6,7 +6,13 @@ package user -import "errors" +import ( + "errors" + "fmt" + "os" + "runtime" + "strconv" +) func init() { userImplemented = false @@ -14,7 +20,30 @@ func init() { } func current() (*User, error) { - return nil, errors.New("user: Current requires cgo") + u := &User{ + Uid: currentUID(), + Gid: currentGID(), + Username: os.Getenv("USER"), + Name: "", // ignored + HomeDir: os.Getenv("HOME"), + } + if runtime.GOOS == "nacl" { + if u.Uid == "" { + u.Uid = "1" + } + if u.Username == "" { + u.Username = "nacl" + } + if u.HomeDir == "" { + u.HomeDir = "/home/nacl" + } + } + // cgo isn't available, but if we found the minimum information + // without it, use it: + if u.Uid != "" && u.Username != "" && u.HomeDir != "" { + return u, nil + } + return nil, fmt.Errorf("user: Current not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) } func lookupUser(username string) (*User, error) { @@ -36,3 +65,20 @@ func lookupGroupId(string) (*Group, error) { func listGroups(*User) ([]string, error) { return nil, errors.New("user: GroupIds requires cgo") } + +func currentUID() string { + if id := os.Getuid(); id >= 0 { + return strconv.Itoa(id) + } + // Note: Windows returns -1, but this file isn't used on + // Windows anyway, so this empty return path shouldn't be + // used. + return "" +} + +func currentGID() string { + if id := os.Getgid(); id >= 0 { + return strconv.Itoa(id) + } + return "" +} diff --git a/src/os/user/user_test.go b/src/os/user/user_test.go index 98f7e410a6..122051d959 100644 --- a/src/os/user/user_test.go +++ b/src/os/user/user_test.go @@ -16,8 +16,6 @@ func checkUser(t *testing.T) { } func TestCurrent(t *testing.T) { - checkUser(t) - u, err := Current() if err != nil { t.Fatalf("Current: %v", err) -- 2.48.1