summaryrefslogtreecommitdiffstats
path: root/usr.sbin/makefs
diff options
context:
space:
mode:
authorbrooks <brooks@FreeBSD.org>2013-02-20 19:32:31 +0000
committerbrooks <brooks@FreeBSD.org>2013-02-20 19:32:31 +0000
commit518d1fe89bb5998f5c172f5f2cb6c169a6bfb31c (patch)
treed240191ba576148f727d724e020192045e876e8f /usr.sbin/makefs
parent4778623d426b579d28de62ccf6bd1e9aeba0c58f (diff)
downloadFreeBSD-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/makefs')
-rw-r--r--usr.sbin/makefs/makefs.h2
-rw-r--r--usr.sbin/makefs/mtree.c18
-rw-r--r--usr.sbin/makefs/walk.c3
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 {
OpenPOWER on IntegriCloud