2016-03-25 36 views
1

当我在命令行中键入ls -l,有时一个@+符号来了旁边的文件权限(顺便说一句,我是在OS X),如下图所示:如何获取文件的扩展属性(UNIX/C)?

[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 

还是想知道,如何将此转化为@+

回答

0

以下是我给苹果给出的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它。希望这可以帮助 !

3

@表示文件具有扩展属性。使用listxattr()可获取所有扩展属性的名称列表,并获取特定属性的值。如果listxattr返回非零结果,您将显示@来表明这一点。

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

您可以找到如何使用这些功能的示例here

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

+0

你可以举一个如何获得@或+符号的例子吗?我阅读文档,并尝试链接,我得到:com.apple.metadata:kMDItemWhereFroms。任何想法是什么意思? –

+0

'@'和'+'不是来自任何地方。如果它检测到文件具有扩展属性或ACL,则它们仅由'ls'显示。 – Barmar

+0

要获取任何特定属性的含义,您必须搜索它。我不知道一个全面的列表。 – Barmar