← index
cplusplus11.Examples/UNIX/attr/attr-list.cpp
Source: cplusplus11.Examples/UNIX/attr/attr-list.cpp
#include<iostream>
#include<sys/xattr.h>
#include<cstring>

constexpr int LIST_SIZE=10000;

int main(int argc, char **argv) {
    
    if(argc != 2) {
        std::cerr << "Error requires an argument\n" << argv[0] << " file\n";
        exit(EXIT_FAILURE);
    }
    
    
    char attr_list[LIST_SIZE], attr_value[LIST_SIZE];
    ssize_t list_len = 0, value_len = 0;
    int cur_pos;
#if defined(__APPLE__)
    list_len = listxattr(argv[1], attr_list, LIST_SIZE, XATTR_NOFOLLOW);
#elif defined(__linux__)
    list_len = listxattr(argv[1], attr_list, LIST_SIZE);
#endif
    
    if(list_len == 1) {
        std::cerr << "Error extend attribute list failed.\n";
        exit(EXIT_FAILURE);
    }
    
    std::cout << argv[1] << ":\n";
    
    for(cur_pos = 0; cur_pos < list_len; cur_pos += strlen(&attr_list[cur_pos])+1) {
        std::cout << "name = " << &attr_list[cur_pos] << "\n";
#if defined(__APPLE__)
        value_len = getxattr(argv[1], &attr_list[cur_pos], attr_value,LIST_SIZE, 0, XATTR_NOFOLLOW);
#elif defined(__linux__)
        value_len = getxattr(argv[1], &attr_list[cur_pos], attr_value,LIST_SIZE);
#endif
        
        if(value_len == -1) {
            std::cout << "Could not get value..\n";
        } else {
            std::cout << "value = " << attr_value << "\n";
        }
        
        std::cout << "\n";
    }
    
    return EXIT_SUCCESS;
}