]> Cypherpunks repositories - gostls13.git/commitdiff
os/user: make Current work without cgo
authorBrad Fitzpatrick <bradfitz@golang.org>
Thu, 3 Mar 2016 20:54:24 +0000 (20:54 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Mon, 7 Mar 2016 20:22:32 +0000 (20:22 +0000)
Fixes #14626

Change-Id: I91c40407dc35355e5c5046f24111a126f99260d9
Reviewed-on: https://go-review.googlesource.com/20192
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Minux Ma <minux@golang.org>
src/os/user/lookup_stubs.go
src/os/user/user_test.go

index 92391d7074e3ebfc6c77dc618124fa9e886a0ed5..7ff4829516fed461012a918d0d4928e334734482 100644 (file)
@@ -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 ""
+}
index 98f7e410a6180f4e322647344f3c90b5287e5354..122051d9596f8ae5aebe4f97dd73c0220baa6e46 100644 (file)
@@ -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)