etc/autofs: Sync special_media with FreeBSD
[dragonfly.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 ${DEVICES}; do
12                 # XXX: Ingore /dev/md*
13                 if [ "`echo ${_p} | sed -n '/^md/p'`" != "" ]; then
14                         continue
15                 fi
16
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
22                 fi
23
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
33                 fi
34
35                 echo "${_p}"
36         done
37 }
38
39 # Print a single map entry.
40 print_map_entry() {
41         local _fstype _p
42
43         _fstype="$1"
44         _p="$2"
45
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
54                 fi
55                 ;;
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
63                 fi
64                 ;;
65         "ext2fs" | "msdosfs")
66                 echo "-fstype=${_fstype},nosuid,async   :/dev/${_p}" 
67                 ;;
68         *)
69                 echo "-fstype=${_fstype},nosuid :/dev/${_p}" 
70                 ;;
71         esac
72 }
73
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
77
78         _key="$1"
79
80         _fstype="$(fstyp "/dev/${_key}" 2> /dev/null)"
81         if [ $? -eq 0 ]; then
82                 print_map_entry "${_fstype}" "${_key}"
83                 return
84         fi
85
86         for _p in ${DEVICES}; do
87                 # XXX: Ingore /dev/md*
88                 if [ "`echo ${_p} | sed -n '/^md/p'`" != "" ]; then
89                         continue
90                 fi
91
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
97                 fi
98
99                 _fstype="${_fstype_and_label%% *}"
100                 if [ "${_fstype}" = "${_fstype_and_label}" ]; then
101                         # No label, try another device.
102                         continue
103                 fi
104
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
113                 fi
114
115                 print_map_entry "${_fstype}" "${_p}"
116         done
117
118         # No matching device - don't print anything, autofs will handle it.
119 }
120
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
125 fi
126 DEVICES=`echo ${KERN_DISKS} | awk '{$1=""; print substr($0,2)}' | awk '{gsub(" ", "\n"); print}' | sort`
127
128 if [ $# -eq 0 ]; then
129         print_available
130         exit 0
131 fi
132
133 print_one "$1"
134 exit 0
135