1 // Copyright 2011 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4 5 package user
6 7 import "sync"
8 9 const (
10 userFile = "/etc/passwd"
11 groupFile = "/etc/group"
12 )
13 14 var colon = []byte{':'}
15 16 // Current returns the current user.
17 //
18 // The first call will cache the current user information.
19 // Subsequent calls will return the cached value and will not reflect
20 // changes to the current user.
21 func Current() (*User, error) {
22 cache.Do(func() { cache.u, cache.err = current() })
23 if cache.err != nil {
24 return nil, cache.err
25 }
26 u := *cache.u // copy
27 return &u, nil
28 }
29 30 // cache of the current user
31 var cache struct {
32 sync.Once
33 u *User
34 err error
35 }
36 37 // Lookup looks up a user by username. If the user cannot be found, the
38 // returned error is of type [UnknownUserError].
39 func Lookup(username string) (*User, error) {
40 if u, err := Current(); err == nil && u.Username == username {
41 return u, err
42 }
43 return lookupUser(username)
44 }
45 46 // LookupId looks up a user by userid. If the user cannot be found, the
47 // returned error is of type [UnknownUserIdError].
48 func LookupId(uid string) (*User, error) {
49 if u, err := Current(); err == nil && u.Uid == uid {
50 return u, err
51 }
52 return lookupUserId(uid)
53 }
54 55 // LookupGroup looks up a group by name. If the group cannot be found, the
56 // returned error is of type [UnknownGroupError].
57 func LookupGroup(name string) (*Group, error) {
58 return lookupGroup(name)
59 }
60 61 // LookupGroupId looks up a group by groupid. If the group cannot be found, the
62 // returned error is of type [UnknownGroupIdError].
63 func LookupGroupId(gid string) (*Group, error) {
64 return lookupGroupId(gid)
65 }
66 67 // GroupIds returns the list of group IDs that the user is a member of.
68 func (u *User) GroupIds() ([]string, error) {
69 return listGroups(u)
70 }
71