kernel - Remove SMP bottlenecks on uidinfo, descriptors, and lockf (2)
[dragonfly.git] / etc / autofs / special_media
blob07c11af77d0298b3feb3554e71fdd4a7c382b2ee
1 #!/bin/sh
3 # $FreeBSD$
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
11 for _p in ${DEVICES}; do
12 # XXX: Ingore /dev/md*
13 if [ "`echo ${_p} | sed -n '/^md/p'`" != "" ]; then
14 continue
17 _fstype_and_label="$(fstyp -l "/dev/${_p}" 2> /dev/null)"
18 if [ $? -ne 0 ]; then
19 # Ignore devices for which we were unable
20 # to determine filesystem type.
21 continue
24 _fstype="${_fstype_and_label%% *}"
25 if [ "${_fstype}" != "${_fstype_and_label}" ]; then
26 _label="${_fstype_and_label#* }"
27 # Replace plus signs and slashes with minuses;
28 # leading plus signs have special meaning in maps,
29 # and multi-component keys are just not supported.
30 _label="$(echo ${_label} | sed 's,[+/],-,g')"
31 echo "${_label}"
32 continue
35 echo "${_p}"
36 done
39 # Print a single map entry.
40 print_map_entry() {
41 local _fstype _p
43 _fstype="$1"
44 _p="$2"
46 case "${_fstype}" in
47 "exfat")
48 if [ -f "/usr/local/sbin/mount.exfat" ]; then
49 echo "-mountprog=/usr/local/sbin/mount.exfat,fstype=${_fstype},nosuid :/dev/${_p}"
50 else
51 /usr/bin/logger -p info -t "special_media[$$]" \
52 "Cannot mount ${_fstype} formatted device /dev/${_p}: Install sysutils/fusefs-exfat first"
53 exit 1
56 "ntfs")
57 if [ -f "/usr/local/bin/ntfs-3g" ]; then
58 echo "-mountprog=/usr/local/bin/ntfs-3g,fstype=${_fstype},nosuid :/dev/${_p}"
59 else
60 /usr/bin/logger -p info -t "special_media[$$]" \
61 "Cannot mount ${_fstype} formatted device /dev/${_p}: Install sysutils/fusefs-ntfs first"
62 exit 1
65 "ext2fs" | "msdosfs")
66 echo "-fstype=${_fstype},nosuid,async :/dev/${_p}"
69 echo "-fstype=${_fstype},nosuid :/dev/${_p}"
71 esac
74 # Determine map entry contents for the given key and print out the entry.
75 print_one() {
76 local _fstype _fstype_and_label _label _key _p
78 _key="$1"
80 _fstype="$(fstyp "/dev/${_key}" 2> /dev/null)"
81 if [ $? -eq 0 ]; then
82 print_map_entry "${_fstype}" "${_key}"
83 return
86 for _p in ${DEVICES}; do
87 # XXX: Ingore /dev/md*
88 if [ "`echo ${_p} | sed -n '/^md/p'`" != "" ]; then
89 continue
92 _fstype_and_label="$(fstyp -l "/dev/${_p}" 2> /dev/null)"
93 if [ $? -ne 0 ]; then
94 # Ignore devices for which we were unable
95 # to determine filesystem type.
96 continue
99 _fstype="${_fstype_and_label%% *}"
100 if [ "${_fstype}" = "${_fstype_and_label}" ]; then
101 # No label, try another device.
102 continue
105 _label="${_fstype_and_label#* }"
106 # Replace plus signs and slashes with minuses;
107 # leading plus signs have special meaning in maps,
108 # and multi-component keys are just not supported.
109 _label="$(echo ${_label} | sed 's,[+/],-,g')"
110 if [ "${_label}" != "${_key}" ]; then
111 # Labels don't match, try another device.
112 continue
115 print_map_entry "${_fstype}" "${_p}"
116 done
118 # No matching device - don't print anything, autofs will handle it.
121 # XXX: Find a better way to get a list of media devices
122 KERN_DISKS=`sysctl kern.disks`
123 if [ $? -ne 0 ]; then
124 exit 1
126 DEVICES=`echo ${KERN_DISKS} | awk '{$1=""; print substr($0,2)}' | awk '{gsub(" ", "\n"); print}' | sort`
128 if [ $# -eq 0 ]; then
129 print_available
130 exit 0
133 print_one "$1"
134 exit 0