summaryrefslogtreecommitdiff
path: root/lib/common/inode_stat.c
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2019-10-07 13:54:24 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2019-10-07 13:54:24 +0200
commit1fad07ce86fc2a506c59501d7fb7c7d7481525f6 (patch)
tree6ba41c514e2ddc692cb95a0fb2070dd222897c7c /lib/common/inode_stat.c
parent5597dca9c6053cd19104e18d88edb199b32e3743 (diff)
Rename libsqfshelper to libcommon
That is IMO less confusing and express what it is (i.e. what it has become) more clearly, i.e. common code shared by the utilities. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/common/inode_stat.c')
-rw-r--r--lib/common/inode_stat.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/lib/common/inode_stat.c b/lib/common/inode_stat.c
new file mode 100644
index 0000000..a73436b
--- /dev/null
+++ b/lib/common/inode_stat.c
@@ -0,0 +1,76 @@
+/* SPDX-License-Identifier: GPL-3.0-or-later */
+/*
+ * inode_stat.c
+ *
+ * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
+ */
+#include "common.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+int inode_stat(const sqfs_tree_node_t *node, struct stat *sb)
+{
+ memset(sb, 0, sizeof(*sb));
+
+ sb->st_mode = node->inode->base.mode;
+ sb->st_uid = node->uid;
+ sb->st_gid = node->gid;
+ sb->st_atime = node->inode->base.mod_time;
+ sb->st_mtime = node->inode->base.mod_time;
+ sb->st_ctime = node->inode->base.mod_time;
+ sb->st_ino = node->inode->base.inode_number;
+ sb->st_nlink = 1;
+ sb->st_blksize = 512;
+
+ switch (node->inode->base.type) {
+ case SQFS_INODE_BDEV:
+ case SQFS_INODE_CDEV:
+ sb->st_rdev = node->inode->data.dev.devno;
+ sb->st_nlink = node->inode->data.dev.nlink;
+ break;
+ case SQFS_INODE_EXT_BDEV:
+ case SQFS_INODE_EXT_CDEV:
+ sb->st_rdev = node->inode->data.dev_ext.devno;
+ sb->st_nlink = node->inode->data.dev_ext.nlink;
+ break;
+ case SQFS_INODE_FIFO:
+ case SQFS_INODE_SOCKET:
+ sb->st_nlink = node->inode->data.ipc.nlink;
+ break;
+ case SQFS_INODE_EXT_FIFO:
+ case SQFS_INODE_EXT_SOCKET:
+ sb->st_nlink = node->inode->data.ipc_ext.nlink;
+ break;
+ case SQFS_INODE_SLINK:
+ sb->st_size = node->inode->data.slink.target_size;
+ sb->st_nlink = node->inode->data.slink.nlink;
+ break;
+ case SQFS_INODE_EXT_SLINK:
+ sb->st_size = node->inode->data.slink_ext.target_size;
+ sb->st_nlink = node->inode->data.slink_ext.nlink;
+ break;
+ case SQFS_INODE_FILE:
+ sb->st_size = node->inode->data.file.file_size;
+ break;
+ case SQFS_INODE_EXT_FILE:
+ sb->st_size = node->inode->data.file_ext.file_size;
+ sb->st_nlink = node->inode->data.file_ext.nlink;
+ break;
+ case SQFS_INODE_DIR:
+ sb->st_size = node->inode->data.dir.size;
+ sb->st_nlink = node->inode->data.dir.nlink;
+ break;
+ case SQFS_INODE_EXT_DIR:
+ sb->st_size = node->inode->data.dir_ext.size;
+ sb->st_nlink = node->inode->data.dir_ext.nlink;
+ break;
+ }
+
+ sb->st_blocks = sb->st_size / sb->st_blksize;
+ if (sb->st_size % sb->st_blksize)
+ sb->st_blocks += 1;
+
+ return 0;
+}