From e5694858eac4c199022b822f41bc40d769f5aed9 Mon Sep 17 00:00:00 2001
From: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Date: Mon, 17 Jun 2019 11:35:04 +0200
Subject: libfstree: add generic function to add node from struct stat

Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
---
 lib/fstree/fstree.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

(limited to 'lib')

diff --git a/lib/fstree/fstree.c b/lib/fstree/fstree.c
index 91c32f8..3f6387a 100644
--- a/lib/fstree/fstree.c
+++ b/lib/fstree/fstree.c
@@ -178,6 +178,34 @@ tree_node_t *fstree_add_file(fstree_t *fs, const char *path, uint16_t mode,
 	return node;
 }
 
+tree_node_t *fstree_add_generic(fstree_t *fs, const char *path,
+				const struct stat *sb, const char *extra)
+{
+	size_t payload = 0;
+	tree_node_t *node;
+
+	if (S_ISREG(sb->st_mode)) {
+		return fstree_add_file(fs, path, sb->st_mode, sb->st_uid,
+				       sb->st_gid, sb->st_size, extra);
+	}
+
+	if (S_ISLNK(sb->st_mode))
+		payload = strlen(extra) + 1;
+
+	node = fstree_add(fs, path, sb->st_mode, sb->st_uid,
+			  sb->st_gid, payload);
+	if (node == NULL)
+		return NULL;
+
+	if (S_ISLNK(sb->st_mode)) {
+		strcpy(node->data.slink_target, extra);
+	} else if (S_ISBLK(sb->st_mode) || S_ISCHR(sb->st_mode)) {
+		node->data.devno = sb->st_rdev;
+	}
+
+	return node;
+}
+
 int fstree_add_xattr(fstree_t *fs, tree_node_t *node,
 		     const char *key, const char *value)
 {
-- 
cgit v1.2.3