xref: /dflybsd-src/sbin/mount_udf/mount_udf.c (revision a92dccf2f68888b6649e676eb322672fba722c21)
12e2da476SJoerg Sonnenberger /*
22e2da476SJoerg Sonnenberger  * Copyright (c) 1992, 1993, 1994
32e2da476SJoerg Sonnenberger  *      The Regents of the University of California.  All rights reserved.
42e2da476SJoerg Sonnenberger  *
52e2da476SJoerg Sonnenberger  * This code is derived from software contributed to Berkeley
62e2da476SJoerg Sonnenberger  * by Pace Willisson (pace@blitz.com).  The Rock Ridge Extension
72e2da476SJoerg Sonnenberger  * Support code is derived from software contributed to Berkeley
82e2da476SJoerg Sonnenberger  * by Atsushi Murai (amurai@spec.co.jp).
92e2da476SJoerg Sonnenberger  *
102e2da476SJoerg Sonnenberger  * Redistribution and use in source and binary forms, with or without
112e2da476SJoerg Sonnenberger  * modification, are permitted provided that the following conditions
122e2da476SJoerg Sonnenberger  * are met:
132e2da476SJoerg Sonnenberger  * 1. Redistributions of source code must retain the above copyright
142e2da476SJoerg Sonnenberger  *    notice, this list of conditions and the following disclaimer.
152e2da476SJoerg Sonnenberger  * 2. Redistributions in binary form must reproduce the above copyright
162e2da476SJoerg Sonnenberger  *    notice, this list of conditions and the following disclaimer in the
172e2da476SJoerg Sonnenberger  *    documentation and/or other materials provided with the distribution.
18dc71b7abSJustin C. Sherrill  * 3. Neither the name of the University nor the names of its contributors
192e2da476SJoerg Sonnenberger  *    may be used to endorse or promote products derived from this software
202e2da476SJoerg Sonnenberger  *    without specific prior written permission.
212e2da476SJoerg Sonnenberger  *
222e2da476SJoerg Sonnenberger  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
232e2da476SJoerg Sonnenberger  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
242e2da476SJoerg Sonnenberger  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
252e2da476SJoerg Sonnenberger  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
262e2da476SJoerg Sonnenberger  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
272e2da476SJoerg Sonnenberger  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
282e2da476SJoerg Sonnenberger  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
292e2da476SJoerg Sonnenberger  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
302e2da476SJoerg Sonnenberger  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
312e2da476SJoerg Sonnenberger  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
322e2da476SJoerg Sonnenberger  * SUCH DAMAGE.
332e2da476SJoerg Sonnenberger  *
342e2da476SJoerg Sonnenberger  *      @(#)mount_cd9660.c	8.7 (Berkeley) 5/1/95
352e2da476SJoerg Sonnenberger  *
362e2da476SJoerg Sonnenberger  * @(#) Copyright (c) 1992, 1993, 1994 The Regents of the University of California.  All rights reserved.
372e2da476SJoerg Sonnenberger  * @(#)mount_cd9660.c	8.7 (Berkeley) 5/1/95
382e2da476SJoerg Sonnenberger  * $FreeBSD: src/sbin/mount_cd9660/mount_cd9660.c,v 1.15.2.3 2001/03/14 12:05:01 bp Exp $
392e2da476SJoerg Sonnenberger  */
402e2da476SJoerg Sonnenberger 
412e2da476SJoerg Sonnenberger #include <sys/cdio.h>
422e2da476SJoerg Sonnenberger #include <sys/file.h>
432e2da476SJoerg Sonnenberger #include <sys/param.h>
442e2da476SJoerg Sonnenberger #include <sys/mount.h>
454a77c3abSDavid Rhodus #include <vfs/udf/udf_mount.h>
462e2da476SJoerg Sonnenberger 
472e2da476SJoerg Sonnenberger #include <err.h>
482e2da476SJoerg Sonnenberger #include <errno.h>
492dc55a02SSascha Wildner #include <mntopts.h>
502e2da476SJoerg Sonnenberger #include <stdlib.h>
512e2da476SJoerg Sonnenberger #include <stdio.h>
522e2da476SJoerg Sonnenberger #include <string.h>
532e2da476SJoerg Sonnenberger #include <sysexits.h>
542e2da476SJoerg Sonnenberger #include <unistd.h>
552e2da476SJoerg Sonnenberger 
565e16e4d0SSascha Wildner static struct mntopt mopts[] = {
572e2da476SJoerg Sonnenberger 	MOPT_STDOPTS,
582e2da476SJoerg Sonnenberger 	MOPT_UPDATE,
59fa729c86SSascha Wildner 	MOPT_NULL
602e2da476SJoerg Sonnenberger };
612e2da476SJoerg Sonnenberger 
62*a92dccf2SSascha Wildner static void	usage(void) __dead2;
632e2da476SJoerg Sonnenberger 
642e2da476SJoerg Sonnenberger int
main(int argc,char ** argv)652e2da476SJoerg Sonnenberger main(int argc, char **argv)
662e2da476SJoerg Sonnenberger {
672e2da476SJoerg Sonnenberger 	struct udf_args args;
682e2da476SJoerg Sonnenberger 	int ch, mntflags, opts;
692e2da476SJoerg Sonnenberger 	char *dev, *dir, mntpath[MAXPATHLEN];
702e2da476SJoerg Sonnenberger 	struct vfsconf vfc;
712e2da476SJoerg Sonnenberger 	int error, verbose;
722e2da476SJoerg Sonnenberger 
732e2da476SJoerg Sonnenberger 	mntflags = opts = verbose = 0;
742e2da476SJoerg Sonnenberger 	memset(&args, 0, sizeof args);
752e2da476SJoerg Sonnenberger 	while ((ch = getopt(argc, argv, "o:v")) != -1)
762e2da476SJoerg Sonnenberger 		switch (ch) {
772e2da476SJoerg Sonnenberger 		case 'o':
782e2da476SJoerg Sonnenberger 			getmntopts(optarg, mopts, &mntflags, &opts);
792e2da476SJoerg Sonnenberger 			break;
802e2da476SJoerg Sonnenberger 		case 'v':
812e2da476SJoerg Sonnenberger 			verbose++;
822e2da476SJoerg Sonnenberger 			break;
832e2da476SJoerg Sonnenberger 		case '?':
842e2da476SJoerg Sonnenberger 		default:
852e2da476SJoerg Sonnenberger 			usage();
862e2da476SJoerg Sonnenberger 		}
872e2da476SJoerg Sonnenberger 	argc -= optind;
882e2da476SJoerg Sonnenberger 	argv += optind;
892e2da476SJoerg Sonnenberger 
902e2da476SJoerg Sonnenberger 	if (argc != 2)
912e2da476SJoerg Sonnenberger 		usage();
922e2da476SJoerg Sonnenberger 
932e2da476SJoerg Sonnenberger 	dev = argv[0];
942e2da476SJoerg Sonnenberger 	dir = argv[1];
952e2da476SJoerg Sonnenberger 
962e2da476SJoerg Sonnenberger 	/*
972e2da476SJoerg Sonnenberger 	 * Resolve the mountpoint with realpath(3) and remove unnecessary
982e2da476SJoerg Sonnenberger 	 * slashes from the devicename if there are any.
992e2da476SJoerg Sonnenberger 	 */
1007cee7052SSascha Wildner 	checkpath(dir, mntpath);
1017cee7052SSascha Wildner 	rmslashes(dev, dev);
1022e2da476SJoerg Sonnenberger 
1032e2da476SJoerg Sonnenberger #define DEFAULT_ROOTUID	-2
1042e2da476SJoerg Sonnenberger 	/*
1052e2da476SJoerg Sonnenberger 	 * UDF filesystems are not writeable.
1062e2da476SJoerg Sonnenberger 	 */
1072e2da476SJoerg Sonnenberger 	mntflags |= MNT_RDONLY;
1082e2da476SJoerg Sonnenberger 	args.export.ex_flags = MNT_EXRDONLY;
1092e2da476SJoerg Sonnenberger 	args.fspec = dev;
1102e2da476SJoerg Sonnenberger 	args.export.ex_root = DEFAULT_ROOTUID;
1112e2da476SJoerg Sonnenberger 	args.flags = opts;
1122e2da476SJoerg Sonnenberger 
1132e2da476SJoerg Sonnenberger 	error = getvfsbyname("udf", &vfc);
1142e2da476SJoerg Sonnenberger 	if (error && vfsisloadable("udf")) {
1152e2da476SJoerg Sonnenberger 		if (vfsload("udf"))
1162e2da476SJoerg Sonnenberger 			err(EX_OSERR, "vfsload(udf)");
1172e2da476SJoerg Sonnenberger 		endvfsent();	/* flush cache */
1182e2da476SJoerg Sonnenberger 		error = getvfsbyname("udf", &vfc);
1192e2da476SJoerg Sonnenberger 	}
1202e2da476SJoerg Sonnenberger 	if (error)
1212e2da476SJoerg Sonnenberger 		errx(1, "UDF filesystem is not available");
1222e2da476SJoerg Sonnenberger 
1232e2da476SJoerg Sonnenberger 	if (mount(vfc.vfc_name, mntpath, mntflags, &args) < 0)
1242e2da476SJoerg Sonnenberger 		err(1, "%s", args.fspec);
1252e2da476SJoerg Sonnenberger 	exit(0);
1262e2da476SJoerg Sonnenberger }
1272e2da476SJoerg Sonnenberger 
1285e16e4d0SSascha Wildner static void
usage(void)1292e2da476SJoerg Sonnenberger usage(void)
1302e2da476SJoerg Sonnenberger {
1317cee7052SSascha Wildner 	fprintf(stderr, "usage: mount_udf [-o options] special node\n");
1322e2da476SJoerg Sonnenberger 	exit(EX_USAGE);
1332e2da476SJoerg Sonnenberger }
134