1/*-
2 * SPDX-License-Identifier: BSD-3-Clause
3 *
4 * Copyright (c) 1992, 1993, 1994
5 *	The Regents of the University of California.  All rights reserved.
6 *
7 * This code is derived from software donated to Berkeley by
8 * Jan-Simon Pendry.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 * 3. Neither the name of the University nor the names of its contributors
19 *    may be used to endorse or promote products derived from this software
20 *    without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 */
34
35#ifndef lint
36static const char copyright[] =
37"@(#) Copyright (c) 1992, 1993, 1994\n\
38	The Regents of the University of California.  All rights reserved.\n";
39#endif /* not lint */
40
41#ifndef lint
42#if 0
43static char sccsid[] = "@(#)mount_fs.c	8.6 (Berkeley) 4/26/95";
44#endif
45static const char rcsid[] =
46	"$FreeBSD$";
47#endif /* not lint */
48
49#include <sys/param.h>
50#include <sys/mount.h>
51
52#include <err.h>
53#include <getopt.h>
54#include <libgen.h>
55#include <stdio.h>
56#include <stdlib.h>
57#include <string.h>
58#include <unistd.h>
59
60#include "extern.h"
61#include "mntopts.h"
62
63static struct mntopt mopts[] = {
64	MOPT_STDOPTS,
65	MOPT_END
66};
67
68static void
69usage(void)
70{
71	(void)fprintf(stderr,
72		"usage: mount [-t fstype] [-o options] target_fs mount_point\n");
73	exit(1);
74}
75
76int
77mount_fs(const char *vfstype, int argc, char *argv[])
78{
79	struct iovec *iov;
80	int iovlen;
81	int mntflags = 0;
82	int ch;
83	char *dev, *dir, mntpath[MAXPATHLEN];
84	char fstype[32];
85	char errmsg[255];
86	char *p, *val;
87
88	strlcpy(fstype, vfstype, sizeof(fstype));
89	memset(errmsg, 0, sizeof(errmsg));
90
91	getmnt_silent = 1;
92	iov = NULL;
93	iovlen = 0;
94
95	optind = optreset = 1;		/* Reset for parse of new argv. */
96	while ((ch = getopt(argc, argv, "o:")) != -1) {
97		switch(ch) {
98		case 'o':
99			getmntopts(optarg, mopts, &mntflags, 0);
100			p = strchr(optarg, '=');
101			val = NULL;
102			if (p != NULL) {
103				*p = '\0';
104				val = p + 1;
105			}
106			build_iovec(&iov, &iovlen, optarg, val, (size_t)-1);
107			break;
108		case '?':
109		default:
110			usage();
111		}
112	}
113
114	argc -= optind;
115	argv += optind;
116	if (argc != 2)
117		usage();
118
119	dev = argv[0];
120	dir = argv[1];
121
122	if (checkpath(dir, mntpath) != 0) {
123		warn("%s", mntpath);
124		return (1);
125	}
126	(void)rmslashes(dev, dev);
127
128	build_iovec(&iov, &iovlen, "fstype", fstype, (size_t)-1);
129	build_iovec(&iov, &iovlen, "fspath", mntpath, (size_t)-1);
130	build_iovec(&iov, &iovlen, "from", dev, (size_t)-1);
131	build_iovec(&iov, &iovlen, "errmsg", errmsg, sizeof(errmsg));
132
133	if (nmount(iov, iovlen, mntflags) == -1) {
134		if (*errmsg != '\0')
135			warn("%s: %s", dev, errmsg);
136		else
137			warn("%s", dev);
138		return (1);
139	}
140	return (0);
141}
142