summaryrefslogtreecommitdiff
path: root/bin/rdsquashfs/describe.c
diff options
context:
space:
mode:
Diffstat (limited to 'bin/rdsquashfs/describe.c')
-rw-r--r--bin/rdsquashfs/describe.c96
1 files changed, 56 insertions, 40 deletions
diff --git a/bin/rdsquashfs/describe.c b/bin/rdsquashfs/describe.c
index 0ac5cb6..452dc6c 100644
--- a/bin/rdsquashfs/describe.c
+++ b/bin/rdsquashfs/describe.c
@@ -6,41 +6,34 @@
*/
#include "rdsquashfs.h"
-static int print_name(const sqfs_tree_node_t *n, bool source_path)
+static char *get_name(const sqfs_tree_node_t *n)
{
- char *start, *ptr, *name;
+ char *name;
int ret;
ret = sqfs_tree_node_get_path(n, &name);
if (ret != 0) {
sqfs_perror(NULL, "Recovering file path of tree node", ret);
- return -1;
+ return NULL;
}
if (canonicalize_name(name) != 0) {
fprintf(stderr, "Error sanitizing file path '%s'\n", name);
sqfs_free(name);
- return -1;
+ return NULL;
}
-#if defined(_WIN32) || defined(__WINDOWS__)
- if (source_path) {
- char *fixed = fix_win32_filename(name);
- sqfs_free(name);
+ return name;
+}
- if (fixed == NULL) {
- fputs(stderr, "out of memor!\n");
- return -1;
- }
+static void print_stub(const char *type, const char *name,
+ const sqfs_tree_node_t *n)
+{
+ const char *start, *ptr;
- fputs(fixed, stdout);
- free(fixed);
- return 0;
- }
-#endif
+ printf("%s ", type);
- if (source_path || (strchr(name, ' ') == NULL &&
- strchr(name, '"') == NULL)) {
+ if (strchr(name, ' ') == NULL && strchr(name, '"') == NULL) {
fputs(name, stdout);
} else {
fputc('"', stdout);
@@ -65,12 +58,6 @@ static int print_name(const sqfs_tree_node_t *n, bool source_path)
fputc('"', stdout);
}
- sqfs_free(name);
- return 0;
-}
-
-static void print_perm(const sqfs_tree_node_t *n)
-{
printf(" 0%o %u %u", (unsigned int)n->inode->base.mode & (~S_IFMT),
n->uid, n->gid);
}
@@ -78,16 +65,56 @@ static void print_perm(const sqfs_tree_node_t *n)
static int print_simple(const char *type, const sqfs_tree_node_t *n,
const char *extra)
{
- printf("%s ", type);
- if (print_name(n, false))
+ char *name = get_name(n);
+ if (name == NULL)
return -1;
- print_perm(n);
+ print_stub(type, name, n);
+ sqfs_free(name);
if (extra != NULL)
printf(" %s", extra);
fputc('\n', stdout);
return 0;
}
+static int print_file(const sqfs_tree_node_t *n, const char *unpack_root)
+{
+ char *name, *srcpath;
+
+ name = get_name(n);
+ if (name == NULL)
+ return -1;
+
+#if defined(_WIN32) || defined(__WINDOWS__)
+ srcpath = fix_win32_filename(name);
+ if (srcpath == NULL) {
+ fprintf(stderr, "Error sanitizing windows name '%s'\n",
+ name);
+ sqfs_free(name);
+ return -1;
+ }
+
+ if (strcmp(name, srcpath) == 0) {
+ free(srcpath);
+ srcpath = NULL;
+ }
+#else
+ srcpath = NULL;
+#endif
+ print_stub("file", name, n);
+
+ if (unpack_root == NULL && srcpath != NULL) {
+ printf(" %s", srcpath);
+ } else if (unpack_root != NULL) {
+ printf(" %s/%s", unpack_root,
+ srcpath == NULL ? name : srcpath);
+ }
+
+ fputc('\n', stdout);
+ free(srcpath);
+ sqfs_free(name);
+ return 0;
+}
+
int describe_tree(const sqfs_tree_node_t *root, const char *unpack_root)
{
const sqfs_tree_node_t *n;
@@ -107,18 +134,7 @@ int describe_tree(const sqfs_tree_node_t *root, const char *unpack_root)
case S_IFIFO:
return print_simple("pipe", root, NULL);
case S_IFREG:
- if (unpack_root == NULL)
- return print_simple("file", root, NULL);
-
- fputs("file ", stdout);
- if (print_name(root, false))
- return -1;
- print_perm(root);
- printf(" %s/", unpack_root);
- if (print_name(root, true))
- return -1;
- fputc('\n', stdout);
- break;
+ return print_file(root, unpack_root);
case S_IFCHR:
case S_IFBLK: {
char buffer[32];