diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-08-01 14:43:04 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-08-01 15:48:42 +0200 |
commit | acfef038be1db770c33476bbb33b53558ddabc91 (patch) | |
tree | 3a681779e25f180f67d4244c3f0972b796526045 | |
parent | b6f8bbbd4d3c344c220f884ad5629ab3576e9105 (diff) |
Add option to rdsquashfs to dump extended attributes for an inode
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
-rw-r--r-- | unpack/options.c | 10 | ||||
-rw-r--r-- | unpack/rdsquashfs.c | 19 | ||||
-rw-r--r-- | unpack/rdsquashfs.h | 1 |
3 files changed, 29 insertions, 1 deletions
diff --git a/unpack/options.c b/unpack/options.c index c281415..e5e0389 100644 --- a/unpack/options.c +++ b/unpack/options.c @@ -9,6 +9,7 @@ static struct option long_opts[] = { { "list", required_argument, NULL, 'l' }, { "cat", required_argument, NULL, 'c' }, + { "xattr", required_argument, NULL, 'x' }, { "unpack-root", required_argument, NULL, 'p' }, { "unpack-path", required_argument, NULL, 'u' }, { "no-dev", no_argument, NULL, 'D' }, @@ -26,7 +27,7 @@ static struct option long_opts[] = { { "version", no_argument, NULL, 'V' }, }; -static const char *short_opts = "l:c:u:p:DSFLCOEZj:dqhV"; +static const char *short_opts = "l:c:u:p:x:DSFLCOEZj:dqhV"; static const char *help_string = "Usage: %s [OPTIONS] <squashfs-file>\n" @@ -39,6 +40,8 @@ static const char *help_string = " the squashfs image.\n" " --cat, -c <path> If the specified path is a regular file in the,\n" " image, dump its contents to stdout.\n" +" --xattr, -x <path> Enumerate extended attributes associated with\n" +" an inode that the given path resolves to.\n" " --unpack-path, -u <path> Unpack this sub directory from the image. To\n" " unpack everything, simply specify /.\n" " --describe, -d Produce a file listing from the image.\n" @@ -152,6 +155,11 @@ void process_command_line(options_t *opt, int argc, char **argv) free(opt->cmdpath); opt->cmdpath = NULL; break; + case 'x': + opt->op = OP_RDATTR; + opt->rdtree_flags |= RDTREE_READ_XATTR; + opt->cmdpath = get_path(opt->cmdpath, optarg); + break; case 'l': opt->op = OP_LS; opt->cmdpath = get_path(opt->cmdpath, optarg); diff --git a/unpack/rdsquashfs.c b/unpack/rdsquashfs.c index 4b2dc6c..5eb10f2 100644 --- a/unpack/rdsquashfs.c +++ b/unpack/rdsquashfs.c @@ -6,6 +6,21 @@ */ #include "rdsquashfs.h" +static void dump_xattrs(fstree_t *fs, tree_xattr_t *xattr) +{ + const char *key, *value; + size_t i; + + for (i = 0; i < xattr->num_attr; ++i) { + key = str_table_get_string(&fs->xattr_keys, + xattr->attr[i].key_index); + value = str_table_get_string(&fs->xattr_values, + xattr->attr[i].value_index); + + printf("%s=%s\n", key, value); + } +} + int main(int argc, char **argv) { int status = EXIT_FAILURE; @@ -106,6 +121,10 @@ int main(int argc, char **argv) case OP_DESCRIBE: describe_tree(fs.root, opt.unpack_root); break; + case OP_RDATTR: + if (n->xattr != NULL) + dump_xattrs(&fs, n->xattr); + break; } status = EXIT_SUCCESS; diff --git a/unpack/rdsquashfs.h b/unpack/rdsquashfs.h index b7c2fdf..5990ab9 100644 --- a/unpack/rdsquashfs.h +++ b/unpack/rdsquashfs.h @@ -45,6 +45,7 @@ enum { OP_CAT, OP_UNPACK, OP_DESCRIBE, + OP_RDATTR, }; typedef struct { |