| /**************************************************************************** |
| | (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; |
| } |