203 lines
6.4 KiB
C
203 lines
6.4 KiB
C
/****************************************************************************
|
|
| (C) Copyright 2008 Novell, Inc. All Rights Reserved.
|
|
|
|
|
| GPLv2: This program is free software; you can redistribute it
|
|
| and/or modify it under the terms of version 2 of the GNU General
|
|
| Public License as published by the Free Software Foundation.
|
|
|
|
|
| This program is distributed in the hope that it will be useful,
|
|
| but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
| GNU General Public License for more details.
|
|
+-------------------------------------------------------------------------*/
|
|
/*
|
|
* NOTE from Dees_Troy: modified source to display values along with xattr names
|
|
* Below code comments about usage are no longer accurate but came from the
|
|
* original source code from the chromium project and combine features of
|
|
* listxattr and getfattr:
|
|
* https://chromium.googlesource.com/chromiumos/platform/punybench/+/factory-1235.B/file.m/listxattr.c
|
|
* https://chromium.googlesource.com/chromiumos/platform/punybench/+/factory-1235.B/file.m/getxattr.c
|
|
*/
|
|
/*
|
|
* LISTXATTR(2) Linux Programmer's Manual LISTXATTR(2)
|
|
*
|
|
*
|
|
*
|
|
* NAME
|
|
* listxattr, llistxattr, flistxattr - list extended attribute names
|
|
*
|
|
* SYNOPSIS
|
|
* #include <sys/types.h>
|
|
* #include <attr/xattr.h>
|
|
*
|
|
* ssize_t listxattr (const char *path,
|
|
* char *list, size_t size);
|
|
* ssize_t llistxattr (const char *path,
|
|
* char *list, size_t size);
|
|
* ssize_t flistxattr (int filedes,
|
|
* char *list, size_t size);
|
|
*
|
|
* DESCRIPTION
|
|
* Extended attributes are name:value pairs associated with inodes
|
|
* (files, directories, symlinks, etc). They are extensions to the
|
|
* normal attributes which are associated with all inodes in the sys-
|
|
* tem (i.e. the stat(2) data). A complete overview of extended
|
|
* attributes concepts can be found in attr(5).
|
|
*
|
|
* listxattr retrieves the list of extended attribute names associated
|
|
* with the given path in the filesystem. The list is the set of
|
|
* (NULL-terminated) names, one after the other. Names of extended
|
|
* attributes to which the calling process does not have access may be
|
|
* omitted from the list. The length of the attribute name list is
|
|
* returned.
|
|
*
|
|
* llistxattr is identical to listxattr, except in the case of a sym-
|
|
* bolic link, where the list of names of extended attributes associ-
|
|
* ated with the link itself is retrieved, not the file that it refers
|
|
* to.
|
|
*
|
|
* flistxattr is identical to listxattr, only the open file pointed to
|
|
* by filedes (as returned by open(2)) is interrogated in place of
|
|
* path.
|
|
*
|
|
* A single extended attribute name is a simple NULL-terminated
|
|
* string. The name includes a namespace prefix; there may be sev-
|
|
* eral, disjoint namespaces associated with an individual inode.
|
|
*
|
|
* An empty buffer of size zero can be passed into these calls to
|
|
* return the current size of the list of extended attribute names,
|
|
* which can be used to estimate the size of a buffer which is suffi-
|
|
* ciently large to hold the list of names.
|
|
*
|
|
* EXAMPLES
|
|
* The list of names is returned as an unordered array of NULL-termi-
|
|
* nated character strings (attribute names are separated by NULL
|
|
* characters), like this:
|
|
* user.name1\0system.name1\0user.name2\0
|
|
*
|
|
* Filesystems like ext2, ext3 and XFS which implement POSIX ACLs
|
|
* using extended attributes, might return a list like this:
|
|
* system.posix_acl_access\0system.posix_acl_default\0
|
|
*
|
|
* RETURN VALUE
|
|
* On success, a positive number is returned indicating the size of
|
|
* the extended attribute name list. On failure, -1 is returned and
|
|
* errno is set appropriately.
|
|
*
|
|
* If the size of the list buffer is too small to hold the result,
|
|
* errno is set to ERANGE.
|
|
*
|
|
* If extended attributes are not supported by the filesystem, or are
|
|
* disabled, errno is set to ENOTSUP.
|
|
*
|
|
* The errors documented for the stat(2) system call are also applica-
|
|
* ble here.
|
|
*
|
|
* AUTHORS
|
|
* Andreas Gruenbacher, <a.gruenbacher@computer.org> and the SGI XFS
|
|
* development team, <linux-xfs@oss.sgi.com>. Please send any bug
|
|
* reports or comments to these addresses.
|
|
*
|
|
* SEE ALSO
|
|
* getfattr(1), setfattr(1), getxattr(2), open(2), removexattr(2),
|
|
* setxattr(2), stat(2), attr(5)
|
|
*
|
|
*
|
|
*
|
|
* Dec 2001 Extended Attributes LISTXATTR(2)
|
|
*/
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <ctype.h>
|
|
#include <sys/types.h>
|
|
#include <sys/xattr.h>
|
|
//#include <eprintf.h>
|
|
//#include <puny.h>
|
|
|
|
/* dumpmem: dumps an n byte area of memory to screen */
|
|
void dumpmem (const void *mem, unsigned int n)
|
|
{
|
|
const char *c = mem;
|
|
unsigned i;
|
|
int all_text = 1;
|
|
if (n == 0) {
|
|
printf("<empty>");
|
|
return;
|
|
}
|
|
for (i = 0; i < n - 1; i++, c++) {
|
|
if (!isprint(*c)) {
|
|
all_text = 0;
|
|
break;
|
|
}
|
|
}
|
|
c = mem;
|
|
if (all_text) {
|
|
for (i = 0; i < n - 1; i++, c++) {
|
|
putchar(*c);
|
|
}
|
|
return;
|
|
} else {
|
|
char hex[(n * 2) + 1];
|
|
for(i = 0; i < n; i++, c++)
|
|
sprintf(hex + (i * 2), "%02X", *c);
|
|
hex[n] = 0;
|
|
printf("0x%s", hex);
|
|
return;
|
|
}
|
|
}
|
|
|
|
void dump_list (char *file, char *list, ssize_t size)
|
|
{
|
|
int c;
|
|
int i;
|
|
int first = 1;
|
|
int j = 0;
|
|
char xattr[1024];
|
|
char value[1024];
|
|
ssize_t size2;
|
|
for (i = 0; i < size; i++) {
|
|
c = list[i];
|
|
if (c) {
|
|
if (first) {
|
|
putchar('\t');
|
|
first = 0;
|
|
j = 0;
|
|
}
|
|
putchar(c);
|
|
xattr[j++] = list[i];
|
|
} else {
|
|
xattr[j] = '\0';
|
|
size2 = getxattr(file, xattr, value, sizeof(value));
|
|
if (size2 < 0) {
|
|
printf("file=%s xattr=%s returned:", file, xattr);
|
|
} else {
|
|
putchar('=');
|
|
dumpmem(value, size2);
|
|
}
|
|
putchar('\n');
|
|
first = 1;
|
|
}
|
|
}
|
|
}
|
|
void usage (void)
|
|
{
|
|
printf("listxattr <file>");
|
|
}
|
|
char List[1<<17];
|
|
int main (int argc, char *argv[])
|
|
{
|
|
ssize_t size;
|
|
if (argc < 2) {
|
|
usage();
|
|
exit(2);
|
|
}
|
|
size = listxattr(argv[1], List, sizeof(List));
|
|
if (size == -1) {
|
|
perror(argv[1]);
|
|
exit(2);
|
|
}
|
|
printf("xattrs for %s:\n", argv[1]);
|
|
dump_list(argv[1], List, size);
|
|
return 0;
|
|
}
|