diff options
Diffstat (limited to 'include/fstree.h')
-rw-r--r-- | include/fstree.h | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/include/fstree.h b/include/fstree.h index aff3952..7f81cf5 100644 --- a/include/fstree.h +++ b/include/fstree.h @@ -17,6 +17,9 @@ #include "sqfs/predef.h" #include "compat.h" +#define FSTREE_MODE_HARD_LINK (0) +#define FSTREE_MODE_HARD_LINK_RESOLVED (1) + typedef struct tree_node_t tree_node_t; typedef struct file_info_t file_info_t; typedef struct dir_info_t dir_info_t; @@ -40,6 +43,9 @@ struct dir_info_t { /* Set to true for implicitly generated directories. */ bool created_implicitly; + + /* Used by recursive tree walking code to avoid hard link loops */ + bool visited; }; /* A node in a file system tree */ @@ -68,12 +74,13 @@ struct tree_node_t { Generated on the fly when writing inodes. */ sqfs_u64 inode_ref; - /* Type specific data. Pointers are into payload area blow. */ + /* Type specific data. "target" pointer is into payload area below. */ union { dir_info_t dir; file_info_t file; char *target; sqfs_u64 devno; + tree_node_t *target_node; } data; sqfs_u8 payload[]; @@ -156,13 +163,15 @@ int fstree_from_file(fstree_t *fs, const char *filename, FILE *fp); /* This function performs all the necessary post processing steps on the file system tree, i.e. recursively sorting all directory entries by name, - allocating inode numbers and stringing all files nodes together into a - linked list. + allocating inode numbers, resolving hard links and stringing all files nodes + together into a linked list. The total inode count is stored in unique_inode_count. The head of the file list is pointed to by fs->files. + + Returns 0 on success, prints to stderr on failure. */ -void fstree_post_process(fstree_t *fs); +int fstree_post_process(fstree_t *fs); /* Generate a string holding the full path of a node. Returned @@ -205,4 +214,17 @@ int canonicalize_name(char *filename); */ bool is_filename_sane(const char *name, bool check_os_specific); +/* + Add a hard link node. Returns NULL on failure and sets errno. + */ +tree_node_t *fstree_add_hard_link(fstree_t *fs, const char *path, + const char *target); + +/* + Resolve a hard link node and replace it with a direct pointer to the target. + + Returns 0 on success. On failure, errno is set. + */ +int fstree_resolve_hard_link(fstree_t *fs, tree_node_t *node); + #endif /* FSTREE_H */ |