svn commit: r247052 - head/usr.sbin/makefs

Brooks Davis brooks at FreeBSD.org
Wed Feb 20 19:32:32 UTC 2013


Author: brooks
Date: Wed Feb 20 19:32:31 2013
New Revision: 247052
URL: http://svnweb.freebsd.org/changeset/base/247052

Log:
  Support hardlinks in manifest files by the same logic as the treewalk
  code.
  
  Reviewed by:	marcel
  Sponsored by:	DARPA, AFRL

Modified:
  head/usr.sbin/makefs/makefs.h
  head/usr.sbin/makefs/mtree.c
  head/usr.sbin/makefs/walk.c

Modified: head/usr.sbin/makefs/makefs.h
==============================================================================
--- head/usr.sbin/makefs/makefs.h	Wed Feb 20 19:05:13 2013	(r247051)
+++ head/usr.sbin/makefs/makefs.h	Wed Feb 20 19:32:31 2013	(r247052)
@@ -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.
  */

Modified: head/usr.sbin/makefs/mtree.c
==============================================================================
--- head/usr.sbin/makefs/mtree.c	Wed Feb 20 19:05:13 2013	(r247051)
+++ head/usr.sbin/makefs/mtree.c	Wed Feb 20 19:32:31 2013	(r247052)
@@ -779,6 +779,24 @@ read_mtree_keywords(FILE *fp, fsnode *no
 		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;

Modified: head/usr.sbin/makefs/walk.c
==============================================================================
--- head/usr.sbin/makefs/walk.c	Wed Feb 20 19:05:13 2013	(r247051)
+++ head/usr.sbin/makefs/walk.c	Wed Feb 20 19:32:31 2013	(r247052)
@@ -59,7 +59,6 @@ static	void	 apply_specdir(const char *,
 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 at netbsd.org
  */
-static fsinode *
+fsinode *
 link_check(fsinode *entry)
 {
 	static struct entry {


More information about the svn-src-head mailing list