diff options
Diffstat (limited to 'attr/listxattr.c')
-rw-r--r-- | attr/listxattr.c | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/attr/listxattr.c b/attr/listxattr.c new file mode 100644 index 000000000..1aa8e14cf --- /dev/null +++ b/attr/listxattr.c @@ -0,0 +1,202 @@ +/**************************************************************************** + | (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; +} |