/**************************************************************************** | (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 * #include * * 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, and the SGI XFS * development team, . 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 #include #include #include #include //#include //#include /* 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(""); 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 "); } 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; }