diff --git a/sbin/Makefile b/sbin/Makefile index 3a656fca4d3e..17ecce4037ed 100644 --- a/sbin/Makefile +++ b/sbin/Makefile @@ -38,6 +38,7 @@ SUBDIR= adjkerntz \ mdconfig \ mdmfs \ mknod \ + mksnap_ffs \ mount \ mount_cd9660 \ mount_ext2fs \ diff --git a/sbin/mksnap_ffs/Makefile b/sbin/mksnap_ffs/Makefile new file mode 100644 index 000000000000..3c08f565225d --- /dev/null +++ b/sbin/mksnap_ffs/Makefile @@ -0,0 +1,14 @@ +# $FreeBSD$ + +PROG= mksnap_ffs +MAN= mksnap_ffs.8 + +.if defined(NOSUID) +BINMODE=550 +.else +BINMODE=4550 +BINOWN= root +.endif +BINGRP= operator + +.include diff --git a/sbin/mksnap_ffs/mksnap_ffs.8 b/sbin/mksnap_ffs/mksnap_ffs.8 new file mode 100644 index 000000000000..b20e435a0791 --- /dev/null +++ b/sbin/mksnap_ffs/mksnap_ffs.8 @@ -0,0 +1,75 @@ +.\" +.\" Copyright (c) 2003 Networks Associates Technology, Inc. +.\" All rights reserved. +.\" +.\" This software was developed for the FreeBSD Project by Marshall +.\" Kirk McKusick and Network Associates Laboratories, the Security +.\" Research Division of Network Associates, Inc. under DARPA/SPAWAR +.\" contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA CHATS +.\" research program. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior written +.\" permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd January 19, 2003 +.Dt MKSNAP_FFS 8 +.Os +.Sh NAME +.Nm mksnap_ffs +.Nd take a filesystem snapshot +.Sh SYNOPSIS +.Nm +.Ar mountpoint +.Ar snapshot_name +.Sh DESCRIPTION +The +.Nm +command creates a snapshot named +.Ar snapshot_name +on the filesystem mounted at +.Ar mountpoint . +The +.Ar snapshot_name +argument must be contained within the filesystem mounted at +.Ar mountpoint . +.Pp +The group ownership of the file is set to +.Dq operator ; +the owner of the file remains +.Dq root . +The mode of the snapshot is set to be readable by the owner +or members of the +.Dq operator +group. +.Sh SEE ALSO +.Xr chmod 2 , +.Xr chown 8 , +.Xr mount_ffs 8 +.Sh HISTORY +A +.Nm +command first appeared in +.Fx 5.0 . diff --git a/sbin/mksnap_ffs/mksnap_ffs.c b/sbin/mksnap_ffs/mksnap_ffs.c new file mode 100644 index 000000000000..8f33cde47471 --- /dev/null +++ b/sbin/mksnap_ffs/mksnap_ffs.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2003 Networks Associates Technology, Inc. + * All rights reserved. + * + * This software was developed for the FreeBSD Project by Marshall + * Kirk McKusick and Network Associates Laboratories, the Security + * Research Division of Network Associates, Inc. under DARPA/SPAWAR + * contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA CHATS + * research program. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The names of the authors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void +usage() +{ + + fprintf(stderr, "usage: mksnap_ffs mountpoint file\n"); + exit(EX_USAGE); +} + +int +main(int argc, char **argv) +{ + const char *dir; + struct ufs_args args; + struct group *grp; + + if (argc != 3) + usage(); + + dir = argv[1]; + args.fspec = argv[2]; + + if ((grp = getgrnam("operator")) == NULL) + errx(1, "Cannot retrieve operator gid"); + if (mount("ffs", dir, MNT_UPDATE | MNT_SNAPSHOT, &args) < 0) + err(1, "Cannot create %s", args.fspec); + if (chown(args.fspec, -1, grp->gr_gid) != 0) + err(1, "Cannot chown %s", args.fspec); + if (chmod(args.fspec, S_IRUSR | S_IRGRP) != 0) + err(1, "Cannot chmod %s", args.fspec); + + exit(EXIT_SUCCESS); +}