Source file src/os/user/lookup.go

     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  

View as plain text