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:
Brooks Davis 2013-02-20 19:32:31 +00:00
parent 954349a63c
commit 1f0ed3c00e
3 changed files with 21 additions and 2 deletions

View File

@ -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.
*/

View File

@ -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;

View File

@ -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 {