• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "brillo/userdb_utils.h"
6 
7 #include <grp.h>
8 #include <pwd.h>
9 #include <sys/types.h>
10 #include <unistd.h>
11 
12 #include <vector>
13 
14 #include <base/logging.h>
15 
16 namespace brillo {
17 namespace userdb {
18 
GetUserInfo(const std::string & user,uid_t * uid,gid_t * gid)19 bool GetUserInfo(const std::string& user, uid_t* uid, gid_t* gid) {
20   ssize_t buf_len = sysconf(_SC_GETPW_R_SIZE_MAX);
21   if (buf_len < 0)
22     buf_len = 16384;  // 16K should be enough?...
23   passwd pwd_buf;
24   passwd* pwd = nullptr;
25   std::vector<char> buf(buf_len);
26   if (getpwnam_r(user.c_str(), &pwd_buf, buf.data(), buf_len, &pwd) || !pwd) {
27     PLOG(ERROR) << "Unable to find user " << user;
28     return false;
29   }
30 
31   if (uid)
32     *uid = pwd->pw_uid;
33   if (gid)
34     *gid = pwd->pw_gid;
35   return true;
36 }
37 
GetGroupInfo(const std::string & group,gid_t * gid)38 bool GetGroupInfo(const std::string& group, gid_t* gid) {
39   ssize_t buf_len = sysconf(_SC_GETGR_R_SIZE_MAX);
40   if (buf_len < 0)
41     buf_len = 16384;  // 16K should be enough?...
42   struct group grp_buf;
43   struct group* grp = nullptr;
44   std::vector<char> buf(buf_len);
45   if (getgrnam_r(group.c_str(), &grp_buf, buf.data(), buf_len, &grp) || !grp) {
46     PLOG(ERROR) << "Unable to find group " << group;
47     return false;
48   }
49 
50   if (gid)
51     *gid = grp->gr_gid;
52   return true;
53 }
54 
55 }  // namespace userdb
56 }  // namespace brillo
57