// 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