2013-08-26 37 views
0

我正在調查Mac OS X 10.8 Mountain Lion上的ACL。我已經取得了一些進展(API文檔很差),並且可以檢索給定文件或目錄的ACL條目列表。我不知道如何做的是將由acl_get_qualifier()返回的GUID/UUID轉換爲UID或GID。我正在使用C++(真的)。這裏有一些代碼:Mac OS X中的ACL - 查找GUID

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,但對於用戶來說並不那麼直接。

回答

0

好吧,經過一番狩獵後我找到了答案。它是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 
    ... 
    } 

工程就像一個魅力。