如何獲得文件的擴展屬性(UNIX/C)?




osx permissions (2)

當我在命令行中鍵入ls -l時,有時候@或者+符號會出現在文件權限(btw,我在OS X上),如下所示:

-rw-r[email protected]  1 john  staff      6731 Sep 28 01:10 mutations.txt
drwxr-xr-x+ 71 john  staff      2414 Mar 25 18:16 ..

我知道如何獲得使用stat結構的權限位,但我不認為這些擴展權限值在那裡。 有人能指出我如何通過C或POSIX API獲取這些值嗎?

編輯

我嘗試了以下內容:

#include <sys/types.h>
#include <sys/xattr.h>
#include <sys/types.h>

int main () {
    char  l[1024];
    listxattr("/Users/john/desktop/mutations.txt", l, 1024,  XATTR_SHOWCOMPRESSION);

    printf("%s\n", l);
}

並得到輸出:

com.apple.metadata:kMDItemWhereFroms

仍試圖了解如何將其轉換為@+


@表示文件具有擴展屬性。 使用listxattr()獲取所有擴展屬性的名稱列表,使用listxattr()獲取特定屬性的值。 如果listxattr返回一個非零的結果,你會顯示@來表明這一點。

擴展屬性不在POSIX中,但是這個API至少在Linux和OS X中可用。

你可以在這裡找到一個如何使用這些函數的例子。

+表示文件具有訪問控制列表。 在一些文件系統中,這被存儲為一個特殊的擴展屬性; 在別人中它是分開存儲的。 對於訪問控制列表,請參閱acl(5)以獲取參考,您可以在此處找到一個示例程序來顯示它。


以下是我從蘋果給出的ls的正式實施中刮掉的一些代碼,你會在這裡找到。 代碼很長,CMD + F也搜索“printlong”。

#include <sys/types.h>
#include <sys/xattr.h>
#include <sys/types.h>
#include <sys/acl.h>
#include <stdio.h>

int main () {
    acl_t acl = NULL;
    acl_entry_t dummy;
    ssize_t xattr = 0;
    char str[10];
    char * filename = "/Users/john/desktop/mutations.txt";

    acl = acl_get_link_np(filename, ACL_TYPE_EXTENDED);
    if (acl && acl_get_entry(acl, ACL_FIRST_ENTRY, &dummy) == -1) {
        acl_free(acl);
        acl = NULL;
    }
    xattr = listxattr(filename, NULL, 0, XATTR_NOFOLLOW);
    if (xattr < 0)
        xattr = 0;

    str[1] = '\0';
    if (xattr > 0)
        str[0] = '@';
    else if (acl != NULL)
        str[0] = '+';
    else
        str[0] = ' ';

    printf("%s\n", str);
 }

根據所使用的文件,輸出將是一個空白,@,或+,完全相同的方式ls -l顯示它。 希望這可以幫助 !





xattr