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

Jen*_*aiz 5 c unix permissions macos 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 ..
Run Code Online (Sandbox Code Playgroud)

我知道如何使用该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);
}
Run Code Online (Sandbox Code Playgroud)

并作为输出:

com.apple.metadata:kMDItemWhereFroms
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*mar 6

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

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

您可以在此处找到有关如何使用这些功能的示例。

+表示该文件具有访问控制列表。在某些文件系统中,这被存储为一个特殊的扩展属性;在其他情况下,它是单独存储的。有关访问控制列表,请参阅acl(5)参考资料,您可以在此处找到显示它的示例程序。


Jen*_*aiz 3

ls以下是我从 Apple 提供的官方实现中摘取的一些代码,您可以在这里找到。代码很长,所以 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 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);
 }
Run Code Online (Sandbox Code Playgroud)

根据所使用的文件,输出将为空白、@ 或 +,其显示方式完全相同ls -l。希望这可以帮助 !