2013-08-26 1 views
0

Mac OS X 10.8 Mountain Lion에서 ACL을 조사하고 있습니다. 필자는 API (문서가 좋지 않음)를 사용하여 특정 파일 또는 디렉토리에 대한 ACL 항목 목록을 검색 할 수 있습니다. 어떻게 해야할지 모르겠지만 acl_get_qualifier()에 의해 반환 된 GUID/UUID를 UID 또는 GID로 변환해야합니다. 나는 C++을 사용하고있다. (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

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 
    ... 
    } 

과 같이 작동합니다.