diff options
author | brooks <brooks@FreeBSD.org> | 2013-02-20 19:32:31 +0000 |
---|---|---|
committer | brooks <brooks@FreeBSD.org> | 2013-02-20 19:32:31 +0000 |
commit | 518d1fe89bb5998f5c172f5f2cb6c169a6bfb31c (patch) | |
tree | d240191ba576148f727d724e020192045e876e8f /usr.sbin | |
parent | 4778623d426b579d28de62ccf6bd1e9aeba0c58f (diff) | |
download | FreeBSD-src-518d1fe89bb5998f5c172f5f2cb6c169a6bfb31c.zip FreeBSD-src-518d1fe89bb5998f5c172f5f2cb6c169a6bfb31c.tar.gz |
Support hardlinks in manifest files by the same logic as the treewalk
code.
Reviewed by: marcel
Sponsored by: DARPA, AFRL
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/makefs/makefs.h | 2 | ||||
-rw-r--r-- | usr.sbin/makefs/mtree.c | 18 | ||||
-rw-r--r-- | usr.sbin/makefs/walk.c | 3 |
3 files changed, 21 insertions, 2 deletions
diff --git a/usr.sbin/makefs/makefs.h b/usr.sbin/makefs/makefs.h index 6146376..c6707d9 100644 --- a/usr.sbin/makefs/makefs.h +++ b/usr.sbin/makefs/makefs.h @@ -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. */ diff --git a/usr.sbin/makefs/mtree.c b/usr.sbin/makefs/mtree.c index 2f2400a..c90c974 100644 --- a/usr.sbin/makefs/mtree.c +++ b/usr.sbin/makefs/mtree.c @@ -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; diff --git a/usr.sbin/makefs/walk.c b/usr.sbin/makefs/walk.c index 0664c84..7af92bb 100644 --- a/usr.sbin/makefs/walk.c +++ b/usr.sbin/makefs/walk.c @@ -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 { |