bluez-tools: Add package bluezetools
[feed/packages.git] / utils / uvol / files / ubi.sh
1 #!/bin/sh
2
3 cmd="$1"
4 shift
5
6 if [ "$cmd" = "name" ]; then
7 echo "UBI"
8 return 0
9 fi
10
11 test -e /sys/class/ubi/version || return 0
12 read -r ubiver < /sys/class/ubi/version
13 [ "$ubiver" = "1" ] || return 1
14 test -e /sys/devices/virtual/ubi || return 0
15
16 ubidev=$(ls -1 /sys/devices/virtual/ubi | head -n 1)
17
18 read -r ebsize < "/sys/devices/virtual/ubi/${ubidev}/eraseblock_size"
19
20 . /lib/functions/uvol.sh
21
22 freebytes() {
23 read -r availeb < "/sys/devices/virtual/ubi/${ubidev}/avail_eraseblocks"
24 echo $((availeb * ebsize))
25 }
26
27 totalbytes() {
28 read -r totaleb < "/sys/devices/virtual/ubi/${ubidev}/total_eraseblocks"
29 echo $((totaleb * ebsize))
30 }
31
32 getdev() {
33 local voldir volname
34 for voldir in "/sys/devices/virtual/ubi/${ubidev}/${ubidev}_"*; do
35 read -r volname < "${voldir}/name"
36 case "$volname" in
37 uvol-[rw][owpd]-$1)
38 basename "$voldir"
39 break
40 ;;
41 *)
42 continue
43 ;;
44 esac
45 done
46 }
47
48 vol_is_mode() {
49 local voldev="$1"
50 local volname
51 read -r volname < "/sys/devices/virtual/ubi/${ubidev}/${voldev}/name"
52 case "$volname" in
53 uvol-$2-*)
54 return 0
55 ;;
56 esac
57 return 1
58 }
59
60 getstatus() {
61 local voldev
62 voldev="$(getdev "$@")"
63 [ "$voldev" ] || return 2
64 vol_is_mode "$voldev" wo && return 22
65 vol_is_mode "$voldev" wp && return 16
66 vol_is_mode "$voldev" wd && return 1
67 vol_is_mode "$voldev" ro && [ ! -e "/dev/ubiblock${voldev:3}" ] && return 1
68 return 0
69 }
70
71 getsize() {
72 local voldev
73 voldev="$(getdev "$@")"
74 [ "$voldev" ] || return 2
75 cat "/sys/devices/virtual/ubi/${ubidev}/${voldev}/data_bytes"
76 }
77
78 getuserdev() {
79 local voldev
80 voldev="$(getdev "$@")"
81 [ "$voldev" ] || return 2
82 if vol_is_mode "$voldev" ro ; then
83 echo "/dev/ubiblock${voldev:3}"
84 elif vol_is_mode "$voldev" rw ; then
85 echo "/dev/$voldev"
86 fi
87 }
88
89 mkubifs() {
90 local tmp_mp
91 tmp_mp="$(mktemp -d)"
92 mount -t ubifs "$1" "$tmp_mp" || return $?
93 umount "$tmp_mp" || return $?
94 rmdir "$tmp_mp" || return $?
95 return 0
96 }
97
98 createvol() {
99 local mode ret voldev
100 voldev=$(getdev "$@")
101 [ "$voldev" ] && return 17
102 case "$3" in
103 ro|wo)
104 mode=wo
105 ;;
106 rw)
107 mode=wp
108 ;;
109 *)
110 return 22
111 ;;
112 esac
113 ubimkvol "/dev/$ubidev" -N "uvol-$mode-$1" -s "$2" || return $?
114 ret=$?
115 [ $ret -eq 0 ] || return $ret
116 voldev="$(getdev "$@")"
117 ubiupdatevol -t "/dev/$voldev" || return $?
118 [ "$mode" = "wp" ] || return 0
119 mkubifs "/dev/$voldev" || return $?
120 uvol_uci_add "$1" "/dev/$voldev" "rw"
121 ubirename "/dev/$ubidev" "uvol-wp-$1" "uvol-wd-$1" || return $?
122 }
123
124 removevol() {
125 local voldev volnum
126 voldev=$(getdev "$@")
127 [ "$voldev" ] || return 2
128 vol_is_mode "$voldev" rw && return 16
129 vol_is_mode "$voldev" ro && return 16
130 volnum="${voldev#${ubidev}_}"
131 ubirmvol "/dev/$ubidev" -n "$volnum" || return $?
132 uvol_uci_remove "$1"
133 uvol_uci_commit "$1"
134 }
135
136 block_hotplug() {
137 export ACTION="$1"
138 export DEVNAME="$2"
139 /sbin/block hotplug
140 }
141
142 activatevol() {
143 local voldev
144 voldev="$(getdev "$@")"
145 [ "$voldev" ] || return 2
146 vol_is_mode "$voldev" rw && return 0
147 vol_is_mode "$voldev" ro && return 0
148 vol_is_mode "$voldev" wo && return 22
149 vol_is_mode "$voldev" wp && return 16
150 uvol_uci_commit "$1"
151 if vol_is_mode "$voldev" rd; then
152 ubirename "/dev/$ubidev" "uvol-rd-$1" "uvol-ro-$1" || return $?
153 ubiblock --create "/dev/$voldev" || return $?
154 return 0
155 elif vol_is_mode "$voldev" wd; then
156 ubirename "/dev/$ubidev" "uvol-wd-$1" "uvol-rw-$1" || return $?
157 block_hotplug add "$voldev"
158 return 0
159 fi
160 }
161
162 disactivatevol() {
163 local voldev
164 voldev="$(getdev "$@")"
165 [ "$voldev" ] || return 2
166 vol_is_mode "$voldev" rd && return 0
167 vol_is_mode "$voldev" wd && return 0
168 vol_is_mode "$voldev" wo && return 22
169 vol_is_mode "$voldev" wp && return 16
170 if vol_is_mode "$voldev" ro; then
171 /sbin/block umount "ubiblock${voldev:3}"
172 ubiblock --remove "/dev/$voldev"
173 ubirename "/dev/$ubidev" "uvol-ro-$1" "uvol-rd-$1" || return $?
174 return 0
175 elif vol_is_mode "$voldev" rw; then
176 /sbin/block umount "$voldev"
177 ubirename "/dev/$ubidev" "uvol-rw-$1" "uvol-wd-$1" || return $?
178 block_hotplug remove "$voldev"
179 return 0
180 fi
181 }
182
183 updatevol() {
184 local voldev
185 voldev="$(getdev "$@")"
186 [ "$voldev" ] || return 2
187 [ "$2" ] || return 22
188 vol_is_mode "$voldev" wo || return 22
189 ubiupdatevol -s "$2" "/dev/$voldev" -
190 ubiblock --create "/dev/$voldev"
191 uvol_uci_add "$1" "/dev/ubiblock${voldev:3}" "ro"
192 ubiblock --remove "/dev/$voldev"
193 ubirename "/dev/$ubidev" "uvol-wo-$1" "uvol-rd-$1"
194 }
195
196 listvols() {
197 local volname volmode volsize json_output json_notfirst
198 if [ "$1" = "-j" ]; then
199 json_output=1
200 shift
201 echo "["
202 fi
203 for voldir in "/sys/devices/virtual/ubi/${ubidev}/${ubidev}_"*; do
204 read -r volname < "$voldir/name"
205 case "$volname" in
206 uvol-[rw][wod]*)
207 read -r volsize < "$voldir/data_bytes"
208 ;;
209 *)
210 continue
211 ;;
212 esac
213 volmode="${volname:5:2}"
214 volname="${volname:8}"
215 if [ "$json_output" = "1" ]; then
216 [ "$json_notfirst" = "1" ] && echo ","
217 echo -e "\t{"
218 echo -e "\t\t\"name\": \"$volname\","
219 echo -e "\t\t\"mode\": \"$volmode\","
220 echo -e "\t\t\"size\": $volsize"
221 echo -n -e "\t}"
222 json_notfirst=1
223 else
224 echo "$volname $volmode $volsize"
225 fi
226 done
227
228 if [ "$json_output" = "1" ]; then
229 [ "$json_notfirst" = "1" ] && echo
230 echo "]"
231 fi
232 }
233
234 bootvols() {
235 local volname volmode volsize voldev fstype
236 for voldir in "/sys/devices/virtual/ubi/${ubidev}/${ubidev}_"*; do
237 read -r volname < "$voldir/name"
238 voldev="$(basename "$voldir")"
239 fstype=
240 case "$volname" in
241 uvol-ro-*)
242 ubiblock --create "/dev/$voldev" || return $?
243 ;;
244 *)
245 continue
246 ;;
247 esac
248 volmode="${volname:5:2}"
249 volname="${volname:8}"
250 done
251 }
252
253 detect() {
254 local volname voldev volmode voldev fstype tmpdev=""
255 for voldir in "/sys/devices/virtual/ubi/${ubidev}/${ubidev}_"*; do
256 read -r volname < "$voldir/name"
257 voldev="$(basename "$voldir")"
258 fstype=
259 case "$volname" in
260 uvol-r[od]-*)
261 if ! [ -e "/dev/ubiblock${voldev:3}" ]; then
262 ubiblock --create "/dev/$voldev" || return $?
263 fi
264 case "$volname" in
265 uvol-rd-*)
266 tmpdev="$tmpdev $voldev"
267 ;;
268 esac
269 ;;
270 *)
271 continue
272 ;;
273 esac
274 volmode="${volname:5:2}"
275 volname="${volname:8}"
276 done
277
278 uvol_uci_init
279
280 for voldir in "/sys/devices/virtual/ubi/${ubidev}/${ubidev}_"*; do
281 read -r volname < "$voldir/name"
282 voldev="$(basename "$voldir")"
283 case "$volname" in
284 uvol-[rw][wod]*)
285 true
286 ;;
287 *)
288 continue
289 ;;
290 esac
291 volmode="${volname:5:2}"
292 volname="${volname:8}"
293 case "$volmode" in
294 "ro" | "rd")
295 uvol_uci_add "$volname" "/dev/ubiblock${voldev:3}" "ro"
296 ;;
297 "rw" | "wd")
298 uvol_uci_add "$volname" "/dev/${voldev}" "rw"
299 ;;
300 esac
301 done
302
303 uvol_uci_commit
304
305 for voldev in $tmpdev ; do
306 ubiblock --remove "/dev/$voldev" || return $?
307 done
308 }
309
310 case "$cmd" in
311 align)
312 echo "$ebsize"
313 ;;
314 free)
315 freebytes
316 ;;
317 total)
318 totalbytes
319 ;;
320 detect)
321 detect
322 ;;
323 boot)
324 bootvols
325 ;;
326 list)
327 listvols "$@"
328 ;;
329 create)
330 createvol "$@"
331 ;;
332 remove)
333 removevol "$@"
334 ;;
335 device)
336 getuserdev "$@"
337 ;;
338 size)
339 getsize "$@"
340 ;;
341 up)
342 activatevol "$@"
343 ;;
344 down)
345 disactivatevol "$@"
346 ;;
347 status)
348 getstatus "$@"
349 ;;
350 write)
351 updatevol "$@"
352 ;;
353 *)
354 echo "unknown command"
355 return 1
356 ;;
357 esac