]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sbin/init/rc.d/cfumass
UPDATING: Add note about efifb support and serial output
[FreeBSD/FreeBSD.git] / sbin / init / rc.d / cfumass
1 #!/bin/sh
2 #
3 # $FreeBSD$
4 #
5
6 # PROVIDE: cfumass
7 # REQUIRE: var
8 # KEYWORD: nojail
9
10 . /etc/rc.subr
11
12 name="cfumass"
13 desc="Configure the LUN for device mode USB mass storage"
14 rcvar="cfumass_enable"
15
16 start_cmd="${name}_start"
17 stop_cmd="${name}_stop"
18
19 extra_commands="reload"
20 reload_cmd="${name}_start"
21
22 : ${cfumass_dir:=/var/cfumass}
23 : ${cfumass_image:=/var/tmp/cfumass.img}
24 : ${cfumass_vendor:="FreeBSD"}
25 : ${cfumass_product:="cfumass(4)"}
26
27 remove_luns()
28 {
29         local _lun _luns
30
31         _luns=`ctladm devlist -b block -v | awk '
32
33         $1 ~ /^[0-9]+$/ {
34                 lun = $1
35         }
36
37         $1 == "file='"${cfumass_image}"'" {
38                 print lun
39         }'`
40
41         for _lun in ${_luns}; do
42                 ctladm remove -b block -l "${_lun}" > /dev/null
43         done
44 }
45
46 cfumass_start()
47 {
48         local err _files _template _new_template
49
50         if [ ! -d "${cfumass_dir}" ]; then
51                 warn "${cfumass_dir} does not exist"
52                 return 1
53         fi
54
55         _files=`find "${cfumass_dir}" -newer "${cfumass_image}" -print 2> /dev/null`
56         if [ ! -e "${cfumass_image}" -o -n "${_files}" ]; then
57                 # The image doesn't exist or is out of date.
58                 makefs -t cd9660 -o label="${cfumass_vendor}" \
59                     -o rockridge "${cfumass_image}" "${cfumass_dir}"
60                 err=$?
61                 if [ "${err}" -ne 0 ]; then
62                         warn "unable to create ${cfumass_image}"
63                         return "${err}"
64                 fi
65         fi
66
67         remove_luns
68
69         ctladm create -b block -o file="${cfumass_image}" -o readonly=on \
70             -o vendor="${cfumass_vendor}" -o product="${cfumass_product}" \
71             -S 0 > /dev/null
72         err=$?
73         if [ "${err}" -ne 0 ]; then
74                 warn "unable to create CTL LUN"
75                 return "${err}"
76         fi
77
78         load_kld -e cfumass cfumass
79
80         # If the template is already switched to Mass Storage, then reset
81         # it to -1 to force the host to reenumerate it; otherwise it might
82         # not notice the new LUN.
83         _template=`sysctl -n hw.usb.template`
84         if [ "${_template}" -eq 0 ]; then
85                 sysctl hw.usb.template=-1 > /dev/null
86                 err=$?
87                 if [ "${err}" -ne 0 ]; then
88                         warn "unable to set hw.usb.template sysctl"
89                         return "${err}"
90                 fi
91         fi
92
93         # Set the template number based on the current one.
94         _template=`sysctl -n hw.usb.template`
95         case "${_template}" in
96         -1)
97                 _new_template="0"
98                 ;;
99         8)
100                 _new_template="10"
101                 ;;
102         *)
103                 warn "hw.usb.template sysctl set to neither -1 nor 8; not changing"
104                 _new_template=""
105                 ;;
106         esac
107                 
108         if [ -n "${_new_template}" ]; then
109                 sysctl hw.usb.template="${_new_template}" > /dev/null
110                 err=$?
111                 if [ "${err}" -ne 0 ]; then
112                         warn "unable to set hw.usb.template sysctl to ${_new_template}"
113                         return "${err}"
114                 fi
115         fi
116 }
117
118 cfumass_stop()
119 {
120         local err _template _new_template
121
122         remove_luns
123
124         _template=`sysctl -n hw.usb.template`
125         case "${_template}" in
126         0)
127                 _new_template="-1"
128                 ;;
129         10)
130                 _new_template="8"
131                 ;;
132         *)
133                 warn "hw.usb.template sysctl set to neither 0 nor 10; not changing"
134                 _new_template=""
135                 ;;
136         esac
137                 
138         if [ -n "${_new_template}" ]; then
139                 sysctl hw.usb.template="${_new_template}" > /dev/null
140                 err=$?
141                 if [ "${err}" -ne 0 ]; then
142                         warn "unable to set hw.usb.template sysctl to ${_new_template}"
143                         return "${err}"
144                 fi
145         fi
146 }
147
148 load_rc_config $name
149 run_rc_command "$1"