如何获取文件的扩展属性(UNIX / C)?

时间:2016-03-25 22:46:22

标签: c macos unix permissions xattr

当我在命令行中键入ls -l时,有时会在文件权限旁边显示@+符号(顺便说一下,我在OS X上),如下所示:

-rw-r-----@  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

仍在尝试了解如何将其转换为@+

2 个答案:

答案 0 :(得分:4)

@表示文件具有扩展属性。使用listxattr()获取所有扩展属性的名称列表,使用getxattr()获取特定属性的值。如果listxattr返回非零结果,则会显示@以表明此结果。

扩展属性不在POSIX中,但此API在Linux和OS X中至少可用。

您可以找到如何使用这些函数的示例here

+表示该文件具有访问控制列表。在某些文件系统中,它存储为特殊的扩展属性;在其他人中,它是分开存储的。有关访问控制列表,请参阅acl(5)以获取参考,您可以找到显示它的示例程序here

答案 1 :(得分:1)

以下是我从Apple提供的%projectFile%官方实施中删除的一些代码,您会发现here。代码很长,所以做CMD + F并搜索“printlong”。

ls

根据所使用的文件,输出将为空白,@或+,其显示方式与#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 chr; 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; if (xattr > 0) chr = '@'; else if (acl != NULL) chr = '+'; else chr = ' '; printf("%c\n", chr); } 完全相同。希望这有帮助!