macOS 上的 getgroups() 不返回所有补充组,而只返回主要组

getgroups() on macOS is not returning all the supplementary groups, but instead just the primary group

'id' 命令确实给了我所有的补充组,但下面的代码只是返回使用所属的主要组:

gid_size = getgroups(0, NULL); //1 is getting returned here
grouplist = malloc(gid_size * sizeof(gid_t));
getgroups(gid_size, grouplist); //Even with gid_size>1, only primary groups is returned.

我的问题是,是否有任何其他替代方法可以在 macOS 上获取所有补充组。

您应该可以通过先调用 initgroups() 获得多达 16 个以上的组,但即使这样也不理想。

来自initgroups(3) man page:

Processes should not use the group ID numbers from getgroups(2) to determine a user's group membership. The list obtained from getgroups() may only be a partial list of a user's group membership. Membership checks should use the mbr_gid_to_uuid(3), mbr_uid_to_uuid(3), and mbr_check_membership(3) functions.

因此,如果您要检查用户是否是特定组的成员,mbr_*() 函数是最佳选择。

请注意 source code of the id command is available,根据非常快速的检查,它看起来像是使用了未记录的 getgrouplist_2()

looks like this is a variant of the getgrouplist()功能,但没有16组限制。

我不认为这个函数在任何 public headers 中声明,id.c 使用原型

int32_t getgrouplist_2(const char *, gid_t, gid_t **);