Системный вызов setxattr()#

Описание#

Системный вызов setxattr() устанавливает значение расширенного атрибута для файла. Расширенные атрибуты используются для хранения дополнительной информации о файлах, например: права доступа, информация по безопасности и другие.

Расширенные атрибуты - это пары «name:value» («имя:значение»), связанные с индексными дескрипторами - файлами, каталогами, символьными ссылками и т.д. Они являются расширениями обычных атрибутов, связанных со всеми индексными дескрипторами в системе.

setxattr() устанавливает значение расширенного атрибута, идентифицируемого по имени и связанного с заданным путем в файловой системе.

Синтаксис системного вызова:

#include <sys/xattr.h>

int setxattr(const char *path, const char *name, const void value[.size], size_t size, int flags);

Где:

  • #include <sys/xattr.h> - включение заголовочного файла, содержащего определения функций и констант, используемых для работы с расширенными атрибутами файлов в системе;

  • int - целочисленный тип данных;

  • const char *path - путь к файлу/каталогу;

  • const char *name - имя расширенного атрибута;

  • const void value[.size] - значение расширенного атрибута;

  • size_t size - размер значения расширенного атрибута в байтах, может быть равен 0;

  • flags - флаги.

Имя расширенного атрибута - это строка, заканчивающаяся нулем и содержащая префикс namespace. С отдельным индексным дескриптором может быть связано несколько непересекающихся namespaces.

Значением расширенного атрибута является фрагмент произвольных текстовых или бинарных данных заданной длины.

По умолчанию значение flags равно 0 - расширенный атрибут будет создан, если он не существует, или значение будет заменено, если атрибут уже существует. Также в поле flags можно указать значения:

  • XATTR_CREATE - создать атрибут; выдать ошибку, если он уже существует;

  • XATTR_REPLACE - заменить атрибут; выдать ошибку, если он еще не существует.

Варианты возвращаемых значений:

  • 0 - успешное выполнение;

  • -1 - неуспешное выполнение;

  • errno - ошибка.

Примеры использования#

Примеры использования setxattr() на языке C:

  • Установка пользовательского атрибута user.description со значением This is a text file:

#include <sys/xattr.h>

int set_user_description(const char * path)

{
  const char * value = "This is a text file";
  return setxattr(path, "user.description", value, strlen(value) + 1, 0);
}
  • Удаление пользовательского аттрибута user.description:

#include <sys/xattr.h>

int remove_user_description(const char *path)
{
  return removexattr(path, "user.description");
}
  • Пример успешно возвращаемого значения системного вызова setxattr():

    #include <sys/types.h>
    #include <attr/xattr.h>
    #include <stdio.h>  // Добавлено для использования printf и perror
    #include <string.h> // Добавлено для использования strlen
    
    int set_custom_attribute(const char *file_path, const char *attr_name, const char *attr_value) {
        int result = setxattr(file_path, attr_name, attr_value, strlen(attr_value), 0);
        
        if (result == 0) {
            // Атрибут был успешно установлен
            printf("The attribute '%s' was set successfully on '%s'.\n", attr_name, file_path);
        } else {
            // Произошла ошибка, и атрибут не был установлен
            perror("Error setting attribute");
        }
        
        return result;
    }
    

    В этом примере функция set_custom_attribute использует системный вызов setxattr() для установки пользовательского атрибута на файл, указанный в file_path. Если setxattr() возвращает 0, это означает, что атрибут был успешно установлен, и программа выводит сообщение об успешной установке. Если setxattr() возвращает -1, это указывает на то, что произошла ошибка. В этом случае переменная errno устанавливается в соответствующий код ошибки, который может быть использован для диагностики проблемы. Возможные коды ошибок:

    • EACCES — отсутствуют необходимые права доступа;

    • ENOTSUP — файловая система не поддерживает расширенные атрибуты;

    • EFAULT — некорректный указатель (например, file_path, attr_name или attr_value равен NULL);

    • ENAMETOOLONG — имя атрибута или значение слишком длинное.

    Для получения описания ошибки используйте функцию perror или strerror(errno).

Дополнительная информация#

Дополнительную информацию можно получить, выполнив команду:

man setxattr