
Путь: Toys/Pending, команды версии: Ver.4 Ver.9 getfattr Комментарии в файле getfattr.c :
Исходный текст в файле getfattr.c #define FOR_getfattr
#include "toys.h"
GLOBALS(
char *n;
)
// TODO: factor out the lister and getter loops and use them in cp too.
static void do_getfattr(char *file)
{
ssize_t (*getter)(const char *, const char *, void *, size_t) = getxattr;
ssize_t (*lister)(const char *, char *, size_t) = listxattr;
char **sorted_keys;
ssize_t keys_len;
char *keys, *key;
int i, key_count;
if (FLAG(h)) {
getter = lgetxattr;
lister = llistxattr;
}
// Collect the keys.
while ((keys_len = lister(file, NULL, 0))) {
if (keys_len == -1) perror_msg("listxattr failed");
keys = xmalloc(keys_len);
if (lister(file, keys, keys_len) == keys_len) break;
free(keys);
}
if (keys_len == 0) return;
// Sort the keys.
for (key = keys, key_count = 0; key-keys < keys_len; key += strlen(key)+1)
key_count++;
sorted_keys = xmalloc(key_count * sizeof(char *));
for (key = keys, i = 0; key-keys < keys_len; key += strlen(key)+1)
sorted_keys[i++] = key;
qsort(sorted_keys, key_count, sizeof(char *), qstrcmp);
if (!FLAG(only_values)) printf("# file: %s\n", file);
for (i = 0; i < key_count; i++) {
key = sorted_keys[i];
if (TT.n && strcmp(TT.n, key)) continue;
if (FLAG(d) || FLAG(only_values)) {
ssize_t value_len;
char *value = NULL;
while ((value_len = getter(file, key, NULL, 0))) {
if (value_len == -1) perror_msg("getxattr failed");
value = xzalloc(value_len+1);
if (getter(file, key, value, value_len) == value_len) break;
free(value);
}
if (FLAG(only_values)) {
if (value) printf("%s", value);
} else if (!value) puts(key);
else printf("%s=\"%s\"\n", key, value);
free(value);
} else puts(key); // Just list names.
}
if (!FLAG(only_values)) xputc('\n');
free(sorted_keys);
}
void getfattr_main(void)
{
char **s;
for (s=toys.optargs; *s; s++) do_getfattr(*s);
} |
![]() |