diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-06-17 11:35:04 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-06-17 11:35:04 +0200 |
commit | e5694858eac4c199022b822f41bc40d769f5aed9 (patch) | |
tree | 94e8b81812c7c3775dd0f7b54d371711c71775f8 /lib/fstree/fstree.c | |
parent | ad83b0f167f3e65a2aa04cf358d1f995f1241a3c (diff) |
libfstree: add generic function to add node from struct stat
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/fstree/fstree.c')
-rw-r--r-- | lib/fstree/fstree.c | 28 |
1 files changed, 28 insertions, 0 deletions
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) { |