1

我正在调查 Mac OS X 10.8 Mountain Lion 上的 ACL。我在 API 方面取得了一些进展(文档很差),并且可以检索给定文件或目录的 ACL 条目列表。我不知道如何将返回的 GUID/UUIDacl_get_qualifier()转换为 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,但对于用户来说,这并不那么简单。

4

1 回答 1

1

好的,经过一番寻找,我找到了答案。它是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
   ...
   }

奇迹般有效。

于 2013-08-27T01:10:56.867 回答