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

标签 c++ macos acl guid

我正在研究 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/

相关文章:

c++ - 将条件转换为算术表达式

c++ - 轻松编写保持状态的模拟

c++ - 为什么数据成员在 C++ 中默认是私有(private)的?

objective-c - mac应用商店错误

c++ - 使用 cin 从用户那里获取输入

xcode - 如何在 macOS Swift 中保存 NSTextField 内容?

macos - 在沙箱中的辅助应用程序和主应用程序之间进行通信

symfony - AmazonS3 + KnpGaufretteBundle 如何为文件设置公共(public) acl?

powershell - 通过PowerShell许可注册表

mysql - ACL 截断操作名称