]> pilppa.org Git - familiar-h63xx-build.git/blob - org.handhelds.familiar/packages/unionfs/unionroot-utils/umount.unionroot
OE tree imported from monotone branch org.openembedded.oz354fam083 at revision 8b12e3...
[familiar-h63xx-build.git] / org.handhelds.familiar / packages / unionfs / unionroot-utils / umount.unionroot
1 #!/bin/sh
2
3 #set -x
4
5 ROOTMOUNTPT=/media/realroot
6 REALUMOUNT=/bin/umount.busybox
7 UNIONUMOUNT=$0
8 INCDIRS="^/media/\|^/mnt/"
9 DEVICE="\/dev\/"
10
11 newargs=""
12
13 ONESHIFTARGS='adflnrv'
14 TWOSHIFTARGS="tO"
15
16 resolvelink () {
17         if test -h $1; then
18                 echo `readlink $1`
19         else
20                 echo $1
21         fi
22 }
23
24 # Retrieves arguments/mount-point
25 for var in $@; do
26         if [ -z "$SKIP" ]; then
27                 if echo $var | grep -q "^-.*"; then
28                         if echo $var | grep -q "[$TWOSHIFTARGS]"; then
29                                 SKIP="yes"
30                         fi
31                         if echo $var | grep -q "^-[^- ]*a"; then
32                                 DO_FSTAB="yes"
33                         fi
34                         ARGS="$ARGS $var"
35                 else
36                         if [ -z "$MOUNT_POINT" ]; then
37                                 MOUNT_POINT=$var
38                         else
39                                 # This really shouldn't happen when unmounting
40                                 DEV_PATH="$MOUNT_POINT"
41                                 MOUNT_POINT="$var"
42                         fi
43                 fi
44         else
45                 ARGS="$ARGS $var"
46                 unset SKIP
47         fi
48 done
49
50 # Parse fstab if -a is used
51 if ! [ -z "$DO_FSTAB" ]; then
52         # FIXME: This doesn't handle -t or -O
53         awk '/^[^ #]/ {print $1}' /etc/fstab |
54         while read line; do
55                 ${UNIONUMOUNT} $line
56         done
57         exit 0
58 fi
59
60 # Get mount-point for device name, if device name is given
61 if echo "$MOUNT_POINT" | grep -q "^${DEVICE}"; then
62         MOUNT_POINT_TEMP=`echo $MOUNT_POINT | sed -e "s/\//\\\\\\\\\//g"`
63         NEW_MOUNT_POINT=`awk "/$MOUNT_POINT_TEMP/ {print "'$2'"}" /etc/fstab`
64         if ! [ -z "$NEW_MOUNT_POINT" ]; then
65                 MOUNT_POINT=$NEW_MOUNT_POINT
66         fi
67 fi
68
69 if ! (echo "$MOUNT_POINT" | grep -q "$INCDIRS"||[ "$MOUNT_POINT" = "/" ]); then
70         exec ${REALMOUNT} $@
71 fi
72
73 # Replace requests to mount '/' (from init scripts and such)
74 # with mount ROOTMOUNTPT (the real-root mount point for the
75 # unionfs'd system).
76 packagedir=""
77 if ([ "$MOUNT_POINT" = "/" ]||[ "$MOUNT_POINT" = "${ROOTMOUNTPT}" ]); then
78         MOUNT_POINT=${ROOTMOUNTPT}
79 else
80         PACKAGE_DIR="/packages"
81 fi
82
83 # Finally, umount and union-umount
84 unionctl /. --remove `resolvelink $MOUNT_POINT`$PACKAGE_DIR
85 exec ${REALUMOUNT} $ARGS $MOUNT_POINT
86