#include "tslog.hpp"
#include <grp.h>
#include <pwd.h>
+#include <array>
/**
* \file
*/
std::vector<gid_t> get_groups(const uid_t uid, const gid_t gid) {
- const int max_groups = 100;
- std::vector<gid_t> groups(max_groups);
- int ngroups = max_groups;
- std::vector<char> buf(1024);
+ std::array <char, 1024> buf;
struct passwd *user_pw = nullptr;
struct passwd pwd;
- if (getpwuid_r(uid, &pwd, &buf[0], buf.size(), &user_pw)) {
+ if (getpwuid_r(uid, &pwd, buf.data(), buf.size(), &user_pw)) {
if (tslog::enabled())
std::cout << "getpwuid_r failed" << " uid:" << uid << " gid: " << gid << std::endl;
- groups.clear();
- return groups;
+ return {};
}
if (!user_pw) {
if (tslog::enabled())
std::cout << "getpwuid_r failed. no matching password record was found" << " uid:" << uid << " gid: " << gid << std::endl;
- groups.clear();
- return groups;
+ return {};
}
- if (getgrouplist(user_pw->pw_name, gid, &groups[0], &ngroups) < 0) {
+ int ngroups = 0;
+ int r = getgrouplist(user_pw->pw_name, gid, NULL, &ngroups);
+
+ if (ngroups == 0)
+ return {};
+
+ auto groups = std::vector<gid_t> (ngroups);
+ r = getgrouplist(user_pw->pw_name, gid, groups.data(), &ngroups);
+ if (r < 0) {
if (tslog::enabled())
std::cout << "getgrouplist failed" << " uid:" << uid << " gid: " << gid << std::endl;
groups.clear();
- return groups;
}
- groups.resize(ngroups);
return groups;
}