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;
|
struct fs;
|
||||||
void ffs_fragacct_swap(struct fs *, int, int32_t [], int, int);
|
void ffs_fragacct_swap(struct fs *, int, int32_t [], int, int);
|
||||||
|
|
||||||
|
fsinode *link_check(fsinode *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Declarations for compat routines.
|
* Declarations for compat routines.
|
||||||
*/
|
*/
|
||||||
|
@ -779,6 +779,24 @@ read_mtree_keywords(FILE *fp, fsnode *node)
|
|||||||
return (0);
|
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);
|
free(node->contents);
|
||||||
node->contents = name;
|
node->contents = name;
|
||||||
st->st_size = sb.st_size;
|
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 void apply_specentry(const char *, NODE *, fsnode *);
|
||||||
static fsnode *create_fsnode(const char *, const char *, const char *,
|
static fsnode *create_fsnode(const char *, const char *, const char *,
|
||||||
struct stat *);
|
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
|
/* This was borrowed from du.c and tweaked to keep an fsnode
|
||||||
* pointer instead. -- dbj@netbsd.org
|
* pointer instead. -- dbj@netbsd.org
|
||||||
*/
|
*/
|
||||||
static fsinode *
|
fsinode *
|
||||||
link_check(fsinode *entry)
|
link_check(fsinode *entry)
|
||||||
{
|
{
|
||||||
static struct entry {
|
static struct entry {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user