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