1/*	$OpenBSD: mount_ext2fs.c,v 1.20 2022/12/04 23:50:46 cheloha Exp $	*/
2/*	$NetBSD: mount_ffs.c,v 1.3 1996/04/13 01:31:19 jtc Exp $	*/
3
4/*-
5 * Copyright (c) 1993, 1994
6 *	The Regents of the University of California.  All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the University nor the names of its contributors
17 *    may be used to endorse or promote products derived from this software
18 *    without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33#include <sys/types.h>
34#include <sys/mount.h>
35
36#include <err.h>
37#include <errno.h>
38#include <stdio.h>
39#include <stdlib.h>
40#include <string.h>
41#include <unistd.h>
42#include <limits.h>
43
44#include "mntopts.h"
45
46void	ext2fs_usage(void);
47
48static const struct mntopt mopts[] = {
49	MOPT_STDOPTS,
50	MOPT_UPDATE,
51	{ NULL }
52};
53
54int
55main(int argc, char *argv[])
56{
57	struct ufs_args args;		/* XXX ffs_args */
58	int ch, mntflags;
59	char fs_name[PATH_MAX], *errcause;
60
61	mntflags = 0;
62	optind = optreset = 1;		/* Reset for parse of new argv. */
63	while ((ch = getopt(argc, argv, "o:")) != -1)
64		switch (ch) {
65		case 'o':
66			getmntopts(optarg, mopts, &mntflags);
67			break;
68		default:
69			ext2fs_usage();
70		}
71	argc -= optind;
72	argv += optind;
73
74	if (argc != 2)
75		ext2fs_usage();
76
77	args.fspec = argv[0];		/* The name of the device file. */
78	if (realpath(argv[1], fs_name) == NULL)	/* The mount point. */
79		err(1, "realpath %s", argv[1]);
80
81#define DEFAULT_ROOTUID	-2
82	args.export_info.ex_root = DEFAULT_ROOTUID;
83	if (mntflags & MNT_RDONLY)
84		args.export_info.ex_flags = MNT_EXRDONLY;
85	else
86		args.export_info.ex_flags = 0;
87
88	if (mount(MOUNT_EXT2FS, fs_name, mntflags, &args) == -1) {
89		switch (errno) {
90		case EMFILE:
91			errcause = "mount table full";
92			break;
93		case EINVAL:
94			errcause =
95			    "specified device does not match mounted device";
96			break;
97		case EOPNOTSUPP:
98			errcause = "filesystem not supported by kernel";
99			break;
100		default:
101			errcause = strerror(errno);
102			break;
103		}
104		errx(1, "%s on %s: %s", args.fspec, fs_name, errcause);
105	}
106	exit(0);
107}
108
109void
110ext2fs_usage(void)
111{
112	(void)fprintf(stderr,
113		"usage: mount_ext2fs [-o options] special node\n");
114	exit(1);
115}
116