blob: 096557a6cfe9586d52e18fda6b5aa12042b5793f [file] [log] [blame]
Chris Masone31ca5a32015-04-01 10:27:57 -07001// 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 "chromeos/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 chromeos {
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 chromeos