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
16namespace brillo {
17namespace userdb {
18
19bool 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
38bool 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