gpt4 book ai didi

c++ - Mac OS X 中的 ACL - 查找 GUID

转载 作者:太空宇宙 更新时间:2023-11-04 11:50:38 25 4
gpt4 key购买 nike

我正在研究 Mac OS X 10.8 Mountain Lion 上的 ACL。我在 API 方面取得了一些进展(文档很差)并且可以检索给定文件或目录的 ACL 条目列表。我不知道如何将 acl_get_qualifier() 返回的 GUID/UUID 转换为 UID 或 GID。我正在使用 C++(真的是 C)。这是一些代码:

int     acleid=ACL_FIRST_ENTRY;
int aclgeres;

// got an ACL in acl, loop on entries ...

if((aclgeres=acl_get_entry(acl,acleid,&ace))==0)
{
int aclgttres;
acl_tag_t tag;
void *aclgq;
acleid=ACL_NEXT_ENTRY;
if((aclgttres=acl_get_tag_type(ace,&tag))<0)
exit(errno);
else
{
switch(tag)
{
case ACL_UNDEFINED_TAG:
{
// error
break;
}

case ACL_EXTENDED_ALLOW:
{
printf(" TAG ALLOW\n");
break;
}

case ACL_EXTENDED_DENY:
{
printf(" TAG DENY\n");
break;
}
}

if(tag!=ACL_UNDEFINED_TAG)
{
if((aclgq=acl_get_qualifier(ace))==NULL)
exit(errno);
else
{
guid_t *guid=static_cast<guid_t*>(aclgq);

/**********************************************/

guid is now a 16-byte buffer containing a semi-
opaque 128-bit UUID entry. This maps into a
user ID or group ID, but I do not know how

/**********************************************/

free(aclgq);
}
}
}
}

所以问题是,我使用什么 API 将 UUID 映射到相应的用户或组?对于组来说,这实际上很容易,因为 GUID 的尾随字节给出了 GID,但对于用户来说,就没那么简单了。

最佳答案

好吧,经过一番搜索,我找到了答案。它是 mbr_uuid_to_id() 函数,它是 Membership API (/usr/include/membership.h) 的一部分。所以现在的代码变成了

int         mbridres,idtype;
id_t ugid;

if((mbridres=mbr_uuid_to_id(static_cast<unsigned char*>(aclgq),&ugid,&idtype))<0)
exit(errno);

if(idtype==ID_TYPE_UID)
{
// do something with UID in ugid
...
}
else // idtype = ID_TYPE_GID
{
// do something with GID in ugid
...
}

像魅力一样工作。

关于c++ - Mac OS X 中的 ACL - 查找 GUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18436613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com