aboutsummaryrefslogtreecommitdiff
path: root/libgo/go/os/user/lookup.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/os/user/lookup.go')
-rw-r--r--libgo/go/os/user/lookup.go22
1 files changed, 21 insertions, 1 deletions
diff --git a/libgo/go/os/user/lookup.go b/libgo/go/os/user/lookup.go
index 3b4421badd5..2243a25788a 100644
--- a/libgo/go/os/user/lookup.go
+++ b/libgo/go/os/user/lookup.go
@@ -4,20 +4,40 @@
package user
+import "sync"
+
// Current returns the current user.
func Current() (*User, error) {
- return current()
+ cache.Do(func() { cache.u, cache.err = current() })
+ if cache.err != nil {
+ return nil, cache.err
+ }
+ u := *cache.u // copy
+ return &u, nil
+}
+
+// cache of the current user
+var cache struct {
+ sync.Once
+ u *User
+ err error
}
// Lookup looks up a user by username. If the user cannot be found, the
// returned error is of type UnknownUserError.
func Lookup(username string) (*User, error) {
+ if u, err := Current(); err == nil && u.Username == username {
+ return u, err
+ }
return lookupUser(username)
}
// LookupId looks up a user by userid. If the user cannot be found, the
// returned error is of type UnknownUserIdError.
func LookupId(uid string) (*User, error) {
+ if u, err := Current(); err == nil && u.Uid == uid {
+ return u, err
+ }
return lookupUserId(uid)
}