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

C++ Mac OS X中的ACL-查找GUID,c++,macos,acl,guid,C++,Macos,Acl,Guid,我正在调查Mac OS X 10.8 Mountain Lion上的ACL。我在API方面取得了一些进展(文档很差),可以检索给定文件或目录的ACL条目列表。我不知道如何将acl\u get\u qualifier()返回的GUID/UUID转换为UID或GID。我用C++(C真的)。下面是一些代码: int acleid=ACL_FIRST_ENTRY; int aclgeres; // got an ACL in acl, loop on entries ... if((

我正在调查Mac OS X 10.8 Mountain Lion上的ACL。我在API方面取得了一些进展(文档很差),可以检索给定文件或目录的ACL条目列表。我不知道如何将
acl\u get\u 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);
            }
         }
      }
   }
int acleid=ACL\u第一个\u条目;
int aclgeres;
//在ACL中获得ACL,在条目上循环。。。
if((aclgeres=acl\u get\u entry(acl、acleid和ace))==0)
{
int aclgttres;
acl标签;
void*aclgq;
acleid=ACL\u下一个\u条目;

如果((aclgttres=acl_get_tag_type(ace,&tag))好的,经过一番搜索,我找到了答案。这是
mbr_uuid_to_id()
函数,它是成员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
   ...
   }
int mbridres,idtype;
身份证;

如果((mbridres=mbr_uuid_to_id(static_cast(aclgq),&ugid,&idtype))OK,经过一番探索后,我找到了答案。这是
mbr_uuid_to_id()
函数,它是成员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
   ...
   }
int mbridres,idtype;
身份证;
if((mbridres=mbr_uuid_to_id(静态_cast(aclgq),&ugid,&idtype))