Support hardlinks in manifest files by the same logic as the treewalk
code. Reviewed by: marcel Sponsored by: DARPA, AFRL
This commit is contained in:
parent
954349a63c
commit
1f0ed3c00e
@ -280,6 +280,8 @@ extern struct timespec start_time;
|
||||
struct fs;
|
||||
void ffs_fragacct_swap(struct fs *, int, int32_t [], int, int);
|
||||
|
||||
fsinode *link_check(fsinode *);
|
||||
|
||||
/*
|
||||
* Declarations for compat routines.
|
||||
*/
|
||||
|
@ -779,6 +779,24 @@ read_mtree_keywords(FILE *fp, fsnode *node)
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for hardlinks. If the contents key is used, then the check
|
||||
* will only trigger if the contents file is a link even if it is used
|
||||
* by more than one file
|
||||
*/
|
||||
if (sb.st_nlink > 1) {
|
||||
fsinode *curino;
|
||||
|
||||
st->st_ino = sb.st_ino;
|
||||
st->st_dev = sb.st_dev;
|
||||
curino = link_check(node->inode);
|
||||
if (curino != NULL) {
|
||||
free(node->inode);
|
||||
node->inode = curino;
|
||||
node->inode->nlink++;
|
||||
}
|
||||
}
|
||||
|
||||
free(node->contents);
|
||||
node->contents = name;
|
||||
st->st_size = sb.st_size;
|
||||
|
@ -59,7 +59,6 @@ static void apply_specdir(const char *, NODE *, fsnode *, int);
|
||||
static void apply_specentry(const char *, NODE *, fsnode *);
|
||||
static fsnode *create_fsnode(const char *, const char *, const char *,
|
||||
struct stat *);
|
||||
static fsinode *link_check(fsinode *);
|
||||
|
||||
|
||||
/*
|
||||
@ -644,7 +643,7 @@ inode_type(mode_t mode)
|
||||
/* This was borrowed from du.c and tweaked to keep an fsnode
|
||||
* pointer instead. -- dbj@netbsd.org
|
||||
*/
|
||||
static fsinode *
|
||||
fsinode *
|
||||
link_check(fsinode *entry)
|
||||
{
|
||||
static struct entry {
|
||||
|
Loading…
Reference in New Issue
Block a user