mount_tmpfs(8): Add a -C option modeled after mount_mfs(8)'s -C option.
authorSascha Wildner <saw@online.de>
Sat, 18 Sep 2010 22:08:54 +0000 (00:08 +0200)
committerSascha Wildner <saw@online.de>
Sat, 18 Sep 2010 22:11:48 +0000 (00:11 +0200)
It will copy the contents of the underlying mount point directory into
the tmpfs mount.

sbin/mount_tmpfs/Makefile
sbin/mount_tmpfs/mount_tmpfs.8
sbin/mount_tmpfs/mount_tmpfs.c

index c84942f..606b2cc 100644 (file)
@@ -2,12 +2,16 @@
 # $DragonFly: src/sbin/mount_hammer/Makefile,v 1.1 2007/10/10 19:35:19 dillon Exp $
 
 PROG=  mount_tmpfs
-SRCS=  mount_tmpfs.c getmntopts.c
+SRCS=  mount_tmpfs.c fscopy.c getmntopts.c
 MAN=   mount_tmpfs.8
 LDADD+= -lutil
 
 MOUNT= ${.CURDIR}/../mount
-CFLAGS+= -I${.CURDIR}/../../sys -I${MOUNT}
+CFLAGS+=-I${.CURDIR}/../../sys -I${MOUNT}
 .PATH: ${MOUNT}
 
+NEWFS= ${.CURDIR}/../newfs
+CFLAGS+=-I${NEWFS}
+.PATH: ${NEWFS}
+
 .include <bsd.prog.mk>
index d9fcfab..0771543 100644 (file)
@@ -28,7 +28,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd February 13, 2008
+.Dd September 18, 2010
 .Dt MOUNT_TMPFS 8
 .Os
 .Sh NAME
@@ -36,6 +36,7 @@
 .Nd mount an efficient memory file system
 .Sh SYNOPSIS
 .Nm
+.Op Fl C
 .Op Fl f Ar maxfilesize
 .Op Fl g Ar group
 .Op Fl m Ar mode
@@ -62,6 +63,11 @@ described below.
 .Pp
 The following options are supported:
 .Bl -tag -width XoXoptions
+.It Fl C
+Tells
+.Nm
+to copy the underlying file system into the tmpfs mount being created
+over it.
 .It Fl f Ar maxfilesize
 Specifies the maximum file size of the file system.
 .It Fl g Ar group
index 09b2e0d..dafa4d9 100644 (file)
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <sys/cdefs.h>
-#ifndef lint
-#endif /* not lint */
-
 #include <sys/param.h>
 #include <sys/mount.h>
 #include <sys/stat.h>
@@ -53,6 +49,7 @@
 #include <inttypes.h>
 #include <libutil.h>
 
+#include "defs.h"
 #include "mntopts.h"
 #include "mount_tmpfs.h"
 
@@ -73,6 +70,8 @@ static const struct mntopt mopts[] = {
        MOPT_NULL
 };
 
+static int Cflag;
+
 /* --------------------------------------------------------------------- */
 
 static gid_t   a_gid(char *);
@@ -110,8 +109,11 @@ mount_tmpfs_parseargs(int argc, char *argv[],
        modeset = 0; mode = 0;
 
        optind = optreset = 1;
-       while ((ch = getopt(argc, argv, "f:g:m:n:o:s:u:")) != -1 ) {
+       while ((ch = getopt(argc, argv, "Cf:g:m:n:o:s:u:")) != -1 ) {
                switch (ch) {
+               case 'C':
+                       Cflag = 1;
+                       break;
                case 'f':
                        args->ta_maxfsize_max = a_number(optarg);
                        break;
@@ -289,7 +291,7 @@ a_uid(char *s)
 static mode_t
 a_mask(char *s)
 {
-       int done, rv=0;
+       int done, rv = 0;
        char *ep;
 
        done = 0;
@@ -305,7 +307,7 @@ a_mask(char *s)
 static int64_t
 a_number(char *s)
 {
-       int64_t rv=0;
+       int64_t rv = 0;
 
        if (dehumanize_number(s, &rv) < 0 || rv < 0)
                errx(EX_USAGE, "bad number for option: %s", s);
@@ -315,9 +317,9 @@ a_number(char *s)
 static void
 usage(void)
 {
-       (void)fprintf(stderr,
-           "Usage: %s [-g group] [-m mode] [-n nodes] [-o options] [-s size]\n"
-           "           [-u user] [-f maxfilesize]  tmpfs mountpoint\n", getprogname());
+       fprintf(stderr,
+           "Usage: %s [-C] [-g group] [-m mode] [-n nodes] [-o options] [-s size]\n"
+           "           [-u user] [-f maxfilesize] tmpfs mountpoint\n", getprogname());
        exit(1);
 }
 
@@ -331,11 +333,11 @@ mount_tmpfs(int argc, char *argv[])
        int mntflags;
        struct vfsconf vfc;
        int error;
+       fsnode_t copyroot = NULL, copyhlinks;
 
        mount_tmpfs_parseargs(argc, argv, &args, &mntflags,
            canon_dev, canon_dir);
 
-
        error = getvfsbyname("tmpfs", &vfc);
        if (error && vfsisloadable("tmpfs")) {
                if(vfsload("tmpfs"))
@@ -346,9 +348,15 @@ mount_tmpfs(int argc, char *argv[])
        if (error)
                errx(EX_OSERR, "%s filesystem not available", "tmpfs");
 
+       if (Cflag)
+               copyroot = FSCopy(&copyhlinks, canon_dir);
+
        if (mount(vfc.vfc_name, canon_dir, mntflags, &args) == -1)
                err(EXIT_FAILURE, "tmpfs on %s", canon_dir);
 
+       if (Cflag)
+               FSPaste(canon_dir, copyroot, copyhlinks);
+
        return EXIT_SUCCESS;
 }
 
@@ -356,7 +364,6 @@ mount_tmpfs(int argc, char *argv[])
 int
 main(int argc, char *argv[])
 {
-
        setprogname(argv[0]);
        return mount_tmpfs(argc, argv);
 }