GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.sbin/amd/amd/mount_fs.c Lines: 0 34 0.0 %
Date: 2016-12-06 Branches: 0 22 0.0 %

Line Branch Exec Source
1
/*
2
 * Copyright (c) 1990 Jan-Simon Pendry
3
 * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
4
 * Copyright (c) 1990, 1993
5
 *	The Regents of the University of California.  All rights reserved.
6
 *
7
 * This code is derived from software contributed to Berkeley by
8
 * Jan-Simon Pendry at Imperial College, London.
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
 *	from: @(#)mount_fs.c	8.1 (Berkeley) 6/6/93
35
 *	$Id: mount_fs.c,v 1.14 2014/10/20 06:55:59 guenther Exp $
36
 */
37
38
#include "am.h"
39
40
#include <unistd.h>
41
#include <sys/stat.h>
42
43
/*
44
 * Standard mount flags
45
 */
46
47
struct opt_tab mnt_flags[] = {
48
	{ "ro",		MNT_RDONLY },
49
	{ "nodev",	MNT_NODEV },
50
	{ "noexec",	MNT_NOEXEC },
51
	{ "nosuid",	MNT_NOSUID },
52
	{ "sync",	MNT_SYNCHRONOUS },
53
	{ 0, 0 }
54
};
55
56
int
57
compute_mount_flags(struct mntent *mnt)
58
{
59
	struct opt_tab *opt;
60
	int flags;
61
	flags = 0;
62
63
	/*
64
	 * Crack basic mount options
65
	 */
66
	for (opt = mnt_flags; opt->opt; opt++)
67
		flags |= hasmntopt(mnt, opt->opt) ? opt->flag : 0;
68
69
	return flags;
70
}
71
72
int
73
mount_fs(struct mntent *mnt, int flags, caddr_t mnt_data, int retry,
74
    const char *type)
75
{
76
	int error = 0;
77
78
#ifdef DEBUG
79
	dlog("%s fstype %s (%s) flags %#x (%s)",
80
		mnt->mnt_dir, type, mnt->mnt_type, flags, mnt->mnt_opts);
81
#endif /* DEBUG */
82
83
	/*
84
	 * Fake some mount table entries for the automounter
85
	 */
86
87
again:
88
	clock_valid = 0;
89
	error = mount(type, mnt->mnt_dir, flags, mnt_data);
90
91
	if (error < 0)
92
		plog(XLOG_ERROR, "%s: mount: %m", mnt->mnt_dir);
93
	if (error < 0 && --retry > 0) {
94
		sleep(1);
95
		goto again;
96
	}
97
	if (error < 0) {
98
#ifdef notdef
99
		if (automount)
100
			going_down(errno);
101
#endif
102
		return errno;
103
	}
104
105
106
	return 0;
107
}
108
109
/*
110
 * Some systems don't provide these to the user,
111
 * but amd needs them, so...
112
 *
113
 * From: Piete Brooks <pb@cl.cam.ac.uk>
114
 */
115
116
#include <ctype.h>
117
118
static char *
119
nextmntopt(char **p)
120
{
121
	char *cp = *p;
122
	char *rp;
123
	/*
124
	 * Skip past white space
125
	 */
126
	while (isspace((unsigned char)*cp))
127
		cp++;
128
	/*
129
	 * Word starts here
130
	 */
131
	rp = cp;
132
	/*
133
	 * Scan to send of string or separator
134
	 */
135
	while (*cp && *cp != ',')
136
		cp++;
137
	/*
138
	 * If separator found the overwrite with nul char.
139
	 */
140
	if (*cp) {
141
		*cp = '\0';
142
		cp++;
143
	}
144
	/*
145
	 * Return value for next call
146
	 */
147
	*p = cp;
148
	return rp;
149
}
150
151
char *
152
hasmntopt(struct mntent *mnt, char *opt)
153
{
154
	char t[MNTMAXSTR];
155
	char *f;
156
	char *o = t;
157
	int l = strlen(opt);
158
159
	strlcpy(t, mnt->mnt_opts, sizeof(t));
160
161
	while (*(f = nextmntopt(&o)))
162
		if (strncmp(opt, f, l) == 0)
163
			return f - t + mnt->mnt_opts;
164
165
	return 0;
166
}