1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
#!/bin/sh
#
# $FreeBSD$
#
# Print newline-separated list of devices available for mounting.
# If there is a filesystem label - use it, otherwise use device name.
print_available() {
local _fstype _fstype_and_label _label _p
for _p in ${providers}; do
_fstype_and_label="$(fstyp -l "/dev/${_p}" 2> /dev/null)"
if [ $? -ne 0 ]; then
# Ignore devices for which we were unable
# to determine filesystem type.
continue
fi
_fstype="${_fstype_and_label%% *}"
if [ "${_fstype}" != "${_fstype_and_label}" ]; then
_label="${_fstype_and_label#* }"
# Replace plus signs and slashes with minuses;
# leading plus signs have special meaning in maps,
# and multi-component keys are just not supported.
_label="$(echo ${_label} | sed 's,[+/],-,g')"
echo "${_label}"
continue
fi
echo "${_p}"
done
}
# Print a single map entry.
print_map_entry() {
local _fstype _p
_fstype="$1"
_p="$2"
case "${_fstype}" in
"exfat")
if [ -f "/usr/local/sbin/mount.exfat" ]; then
echo "-mountprog=/usr/local/sbin/mount.exfat,fstype=${_fstype},nosuid :/dev/${_p}"
else
/usr/bin/logger -p info -t "special_media[$$]" \
"Cannot mount ${_fstype} formatted device /dev/${_p}: Install sysutils/fusefs-exfat first"
exit 1
fi
;;
"ntfs")
if [ -f "/usr/local/bin/ntfs-3g" ]; then
echo "-mountprog=/usr/local/bin/ntfs-3g,fstype=${_fstype},nosuid :/dev/${_p}"
else
/usr/bin/logger -p info -t "special_media[$$]" \
"Cannot mount ${_fstype} formatted device /dev/${_p}: Install sysutils/fusefs-ntfs first"
exit 1
fi
;;
"ext2fs" | "msdosfs")
echo "-fstype=${_fstype},nosuid,async :/dev/${_p}"
;;
*)
echo "-fstype=${_fstype},nosuid :/dev/${_p}"
;;
esac
}
# Determine map entry contents for the given key and print out the entry.
print_one() {
local _fstype _fstype_and_label _label _key _p
_key="$1"
_fstype="$(fstyp "/dev/${_key}" 2> /dev/null)"
if [ $? -eq 0 ]; then
print_map_entry "${_fstype}" "${_key}"
return
fi
for _p in ${providers}; do
_fstype_and_label="$(fstyp -l "/dev/${_p}" 2> /dev/null)"
if [ $? -ne 0 ]; then
# Ignore devices for which we were unable
# to determine filesystem type.
continue
fi
_fstype="${_fstype_and_label%% *}"
if [ "${_fstype}" = "${_fstype_and_label}" ]; then
# No label, try another device.
continue
fi
_label="${_fstype_and_label#* }"
# Replace plus signs and slashes with minuses;
# leading plus signs have special meaning in maps,
# and multi-component keys are just not supported.
_label="$(echo ${_label} | sed 's,[+/],-,g')"
if [ "${_label}" != "${_key}" ]; then
# Labels don't match, try another device.
continue
fi
print_map_entry "${_fstype}" "${_p}"
done
# No matching device - don't print anything, autofs will handle it.
}
# Obtain a list of (geom-provider-name, access-count) pairs, turning this:
#
# z0xfffff80005085d00 [shape=hexagon,label="ada0\nr2w2e3\nerr#0\nsector=512\nstripe=0"];
#
# Into this:
#
# ada0 r2w2e3
#
# XXX: It would be easier to use kern.geom.conftxt instead, but it lacks
# access counts.
pairs=$(sysctl kern.geom.confdot | sed -n 's/^.*hexagon,label="\([^\]*\)\\n\([^\]*\).*/\1 \2/p')
# Obtain a list of GEOM providers that are not already open - not mounted,
# and without other GEOM class, such as gpart, attached. In other words,
# grep for "r0w0e0". Skip providers with names containing slashes; we're
# not interested in geom_label(4) creations.
providers=$(echo "$pairs" | awk '$2 == "r0w0e0" && $1 !~ /\// { print $1 }')
if [ $# -eq 0 ]; then
print_available
exit 0
fi
print_one "$1"
exit 0
|