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);
            }
         }
      }
   }

問題は、UUID を対応するユーザーまたはグループにマップするためにどの API を使用すればよいかということです。グループにとっては、GUID の末尾のバイトが GID を与えるので、実際には非常に簡単ですが、ユーザーにとってはそれほど簡単ではありません。

4

1 に答える 1

1

OK、少し探し回った後、答えを見つけました。これは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 に答える