2013-04-11 2 views
0

Я написал простую программу для тестирования функций lsetxattr() и lgetxattr(). Я просто хотел добавить в этот файл расширенное свойство и снова получить значение. Но я не могу получить результат, как ожидалось. Итак, как правильно использовать эти два метода? Спасибо!Использование функций lsetxattr и lgetxattr

#define _GNU_SOURCE 
#include <ctype.h> 
#include <dirent.h> 
#include <errno.h> 
#include <fcntl.h> 
#include <getopt.h> 
#include <limits.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <strings.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <sys/xattr.h> 
#include <time.h> 
#include <unistd.h> 

int main() 
{ 
    char *path = "/tmp/abc.txt"; 
    FILE *file = fopen(path, "w"); 

    int id = 101; 
    if (lsetxattr(path, "user.id", &id, sizeof(int), 0) < 0) 
     printf("lsetxattr wrong\n"); 

    int result; 
    if (lgetxattr(path, "user.id", &result, sizeof(int)) != sizeof(int)) { 
     printf("lgetxattr wrong\n"); 
    } 
    printf("%d\n", result); 
    return 0; 
} 
+0

один из ваших «неправильных» сообщений печати, или это просто возвращая результат, отличный от 101? – Barmar

+1

Если функция возвращает -1, вы должны использовать 'perror()', чтобы причина была напечатана. – Barmar

ответ

1

Это, вероятно, потому, что ваш /tmp монтирования не поддерживает расширенные атрибуты. Глядя на man page:

ENOTSUP 
      Extended attributes are not supported by the file system, or are 
      disabled, errno is set to ENOTSUP. 

Вы можете проверить это, изменив путь, чтобы быть вне этого крепления, например, в текущем каталоге (при условии, что это за пределами этого горе, конечно):

char *path = "abc.txt"; 

Предполагая, что ваши другие монтировки, конечно, поддерживают расширенные атрибуты (это более вероятно). Если вам нужно сделать это на /tmp, вам нужно будет посмотреть некоторые руководства, чтобы выяснить, как включить его на /tmp (tmpfs).

+0

Спасибо. Параметр/tmp не поддерживает расширенные атрибуты. Если я переведу файл на другое место, он работает. – nop

0

Похоже, как lsetxattr() и lgetxatter() возвращения -1 по умолчанию:

#include <errno.h> 
#include <sys/xattr.h> 

ssize_t 
lgetxattr (const char *__path, const char *__name, 
      void *__value, size_t __size) 
{ 
    __set_errno (ENOSYS); 
    return -1; 
} 

stub_warning (lgetxattr) 
#include <stub-tag.h> 

Я нашел это на исходном коде GLibC в: lgetxattr.c и lsetxattr.c

Смежные вопросы