Как получить расширенные атрибуты файла (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

Все еще пытаюсь понять, как преобразовать это в @ или же +?

2 ответа

Решение

Ниже приведен код, который я удалил из официальной реализации 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 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 отображает это. Надеюсь это поможет!

@ означает, что файл имеет расширенные атрибуты. использование listxattr() чтобы получить список имен всех расширенных атрибутов, и getxattr() чтобы получить значение определенного атрибута. Если listxattr возвращает ненулевой результат, вы бы отобразили @ чтобы указать это.

Расширенные атрибуты отсутствуют в POSIX, но этот API доступен по крайней мере в Linux и OS X.

Вы можете найти пример того, как использовать эти функции здесь.

+ означает, что файл имеет список контроля доступа. В некоторых файловых системах это сохраняется как специальный расширенный атрибут; в других он хранится отдельно. Для списков контроля доступа, см. acl(5) для справки, и вы можете найти пример программы, которая отображает его здесь.

Другие вопросы по тегам