如何获取文件的扩展属性(UNIX/C)?
How to get extended attributes of a file(UNIX/C)?
当我在命令行中键入 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
仍在尝试了解如何将其转换为 @
或 +
?
@
表示文件有扩展属性。使用 listxattr()
to get a list of the names of all the extended attributes, and getxattr()
获取特定属性的值。如果 listxattr
returns 一个非零结果,你会显示 @
来表明这一点。
POSIX 中没有扩展属性,但是 API 至少在 Linux 和 OS X 中可用。
您可以找到如何使用这些函数的示例 here。
+
表示文件有访问控制列表。在一些文件系统中,这被存储为一个特殊的扩展属性;在其他情况下,它是单独存储的。有关访问控制列表,请参阅 acl(5)
for a reference, and you can find an example program that displays it here。
以下是我从 Apple 提供的 ls
官方实现中截取的一些代码,您会发现 here。代码很长,所以用 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);
}
根据所使用的文件,输出将是空白、@ 或 +,其显示方式与 ls -l
完全相同。希望这有帮助!
当我在命令行中键入 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
仍在尝试了解如何将其转换为 @
或 +
?
@
表示文件有扩展属性。使用 listxattr()
to get a list of the names of all the extended attributes, and getxattr()
获取特定属性的值。如果 listxattr
returns 一个非零结果,你会显示 @
来表明这一点。
POSIX 中没有扩展属性,但是 API 至少在 Linux 和 OS X 中可用。
您可以找到如何使用这些函数的示例 here。
+
表示文件有访问控制列表。在一些文件系统中,这被存储为一个特殊的扩展属性;在其他情况下,它是单独存储的。有关访问控制列表,请参阅 acl(5)
for a reference, and you can find an example program that displays it here。
以下是我从 Apple 提供的 ls
官方实现中截取的一些代码,您会发现 here。代码很长,所以用 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);
}
根据所使用的文件,输出将是空白、@ 或 +,其显示方式与 ls -l
完全相同。希望这有帮助!