Системный вызов 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