summaryrefslogtreecommitdiffstats
path: root/etc/autofs/special_media
blob: 08b75bc176090b5311a3091048a027c65fc8d004 (plain)
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

OpenPOWER on IntegriCloud