#endif
#include "c-ctype.h"
+#include "mgetgroups.h"
#include "virerror.h"
#include "virlog.h"
#include "virbuffer.h"
return 0;
}
+
+/* Compute the list of supplementary groups associated with @uid, and
+ * including @gid in the list (unless it is -1), storing a malloc'd
+ * result into @list. Return the size of the list on success, or -1
+ * on failure with error reported and errno set. May not be called
+ * between fork and exec. */
+int
+virGetGroupList(uid_t uid, gid_t gid, gid_t **list)
+{
+ int ret = -1;
+ char *user = NULL;
+
+ *list = NULL;
+ if (uid == (uid_t)-1)
+ return 0;
+
+ if (virGetUserEnt(uid, &user,
+ gid == (gid_t)-1 ? &gid : NULL, NULL) < 0)
+ return -1;
+
+ ret = mgetgroups(user, gid, list);
+ if (ret < 0)
+ virReportSystemError(errno,
+ _("cannot get group list for '%s'"), user);
+ VIR_FREE(user);
+ return ret;
+}
+
+
/* Set the real and effective uid and gid to the given values, and call
* initgroups so that the process has all the assumed group membership of
* that uid. return 0 on success, -1 on failure (the original system error
char *virGetUserRuntimeDirectory(void);
char *virGetUserName(uid_t uid);
char *virGetGroupName(gid_t gid);
+int virGetGroupList(uid_t uid, gid_t group, gid_t **groups)
+ ATTRIBUTE_NONNULL(3);
int virGetUserID(const char *name,
uid_t *uid) ATTRIBUTE_RETURN_CHECK;
int virGetGroupID(const char *name,