]> pilppa.org Git - familiar-h63xx-build.git/blob - org.handhelds.familiar/packages/unionfs/unionroot-utils/mount.unionroot
OE tree imported from monotone branch org.openembedded.oz354fam083 at revision 8b12e3...
[familiar-h63xx-build.git] / org.handhelds.familiar / packages / unionfs / unionroot-utils / mount.unionroot
1 #!/bin/sh
2
3 #set -x
4
5 ROOTMOUNTPT=/media/realroot
6 REALMOUNT=/bin/mount.busybox
7 UNIONMOUNT=$0
8 INCDIRS="^/media/\|^/mnt/"
9 DEVICE="\/dev\/"
10
11 newargs=""
12
13 ONESHIFTARGS='aVhvfFilnsrw'
14 TWOSHIFTARGS="pLUtOo"
15 IGNOREARGS='--bind --move'
16
17 resolvelink () {
18         if test -h $1; then
19                 echo `readlink $1`
20         else
21                 echo $1
22         fi
23 }
24
25 # Retrieves arguments/mount-point
26 for var in $@; do
27         if [ -z "$SKIP" ]; then
28                 if echo $var | grep -q "^-.*"; then
29                         # argument is an option
30                         if echo $var | grep -q "[$TWOSHIFTARGS]"; then
31                                 SKIP="yes"
32                         fi
33                         # mount -a
34                         if echo $var | grep -q "^-[^- ]*a"; then
35                                 DO_FSTAB="yes"
36                         fi
37                         ARGS="$ARGS $var"
38                 else
39                         if [ -z "$MOUNT_POINT" ]; then
40                                 # argument apears to be the mountpoint
41                                 MOUNT_POINT=$var
42                         else
43                                 # A mountpoint was found earlier, so the other non-option
44                                 # must be the real mountpoint, and the first non-option is a device
45                                 DEV_PATH="$MOUNT_POINT"
46                                 MOUNT_POINT="$var"
47                         fi
48                 fi
49         else
50                 ARGS="$ARGS $var"
51                 unset SKIP
52         fi
53 done
54
55 # Parse fstab if -a is used
56 if ! [ -z "$DO_FSTAB" ]; then
57         # FIXME: This doesn't handle -t or -O
58         awk '/^[^ #]/ {print "-t " $3 " -o " $4 " " $1 " " $2}' /etc/fstab |
59         while read line; do
60                 ${UNIONMOUNT} $line
61         done
62         exit 0
63 fi
64
65 # Get mount-point for device name, if device name is given
66 if echo "$MOUNT_POINT" | grep -q "^${DEVICE}"; then
67         MOUNT_POINT_TEMP=`echo $MOUNT_POINT | sed -e "s/\//\\\\\\\\\//g"`
68         NEW_MOUNT_POINT=`awk "/$MOUNT_POINT_TEMP/ {print "'$2'"}" /etc/fstab`
69         if ! [ -z "$NEW_MOUNT_POINT" ]; then
70                 MOUNT_POINT=$NEW_MOUNT_POINT
71         fi
72 fi
73
74 # Mount anything but /media/* and / with the real mount
75 if ! (echo "$MOUNT_POINT" | grep -q "$INCDIRS" || [ "$MOUNT_POINT" = "/" ]); then
76         exec ${REALMOUNT} $@
77 fi
78
79 # Replace requests to mount '/' (from init scripts and such)
80 # with mount ROOTMOUNTPT (the real-root mount point for the
81 # unionfs'd system).
82 packagedir=""
83 if ([ "$MOUNT_POINT" = "/" ] || [ "$MOUNT_POINT" = "${ROOTMOUNTPT}" ]); then
84         MOUNT_POINT=${ROOTMOUNTPT}
85 else
86         # FIXME: A hard-coded path is bad - see ipkg-link
87         PACKAGE_DIR="/packages"
88         x=a
89 fi
90
91 # Finally, mount and union-mount
92 #echo "<<DEBUG>> Running command: [${REALMOUNT} $ARGS $DEV_PATH $MOUNT_POINT]"
93 if ${REALMOUNT} $ARGS $DEV_PATH $MOUNT_POINT; then
94         if mkdir -p $MOUNT_POINT$PACKAGE_DIR; then
95                 #echo "<<DEBUG>> Running command: [unionctl /. --add --after ${ROOTMOUNTPT} --mode rw `resolvelink $MOUNT_POINT`$PACKAGE_DIR]"
96                 #unionctl /. --add --after ${ROOTMOUNTPT} --mode rw `resolvelink $MOUNT_POINT`$PACKAGE_DIR
97                 unionctl /. --add `resolvelink $MOUNT_POINT`$PACKAGE_DIR
98         fi
99 fi