You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.4 KiB
56 lines
1.4 KiB
// Copyright 2015 The Chromium OS Authors. All rights reserved. |
|
// Use of this source code is governed by a BSD-style license that can be |
|
// found in the LICENSE file. |
|
|
|
#include "brillo/userdb_utils.h" |
|
|
|
#include <grp.h> |
|
#include <pwd.h> |
|
#include <sys/types.h> |
|
#include <unistd.h> |
|
|
|
#include <vector> |
|
|
|
#include <base/logging.h> |
|
|
|
namespace brillo { |
|
namespace userdb { |
|
|
|
bool GetUserInfo(const std::string& user, uid_t* uid, gid_t* gid) { |
|
ssize_t buf_len = sysconf(_SC_GETPW_R_SIZE_MAX); |
|
if (buf_len < 0) |
|
buf_len = 16384; // 16K should be enough?... |
|
passwd pwd_buf; |
|
passwd* pwd = nullptr; |
|
std::vector<char> buf(buf_len); |
|
if (getpwnam_r(user.c_str(), &pwd_buf, buf.data(), buf_len, &pwd) || !pwd) { |
|
PLOG(ERROR) << "Unable to find user " << user; |
|
return false; |
|
} |
|
|
|
if (uid) |
|
*uid = pwd->pw_uid; |
|
if (gid) |
|
*gid = pwd->pw_gid; |
|
return true; |
|
} |
|
|
|
bool GetGroupInfo(const std::string& group, gid_t* gid) { |
|
ssize_t buf_len = sysconf(_SC_GETGR_R_SIZE_MAX); |
|
if (buf_len < 0) |
|
buf_len = 16384; // 16K should be enough?... |
|
struct group grp_buf; |
|
struct group* grp = nullptr; |
|
std::vector<char> buf(buf_len); |
|
if (getgrnam_r(group.c_str(), &grp_buf, buf.data(), buf_len, &grp) || !grp) { |
|
PLOG(ERROR) << "Unable to find group " << group; |
|
return false; |
|
} |
|
|
|
if (gid) |
|
*gid = grp->gr_gid; |
|
return true; |
|
} |
|
|
|
} // namespace userdb |
|
} // namespace brillo
|
|
|