home *** CD-ROM | disk | FTP | other *** search
- #!/bin/bash
-
- # Copyright (C) 2005, Kay Sievers <kay.sievers@vrfy.org>
- # Copyright (C) 2006, David Zeuthen <david@fubar.dk>
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License version 2.
-
- # Check for environment variables
- if [ "$HAL_PROP_BLOCK_DEVICE" == "" ] || [ "$HAL_PROP_INFO_UDI" == "" ] ; then
- echo "Missing or empty environment variable(s)." >&2
- echo "This script should be started by hald." >&2
- exit 1
- fi
-
- # check validity of user id
- if [ "$HAL_METHOD_INVOKED_BY_UID" = "0" ]; then
- echo "Script was called with HAL_METHOD_INVOKED_BY_UID=0, aborting." >&2
- exit 1
- fi
- PWD=`getent passwd "$HAL_METHOD_INVOKED_BY_UID"` || {
- echo "User id $HAL_METHOD_INVOKED_BY_UID does not exist." >&2
- exit 1
- }
- USER="`echo "$PWD" | cut -f 1 -d:`"
-
- su -c "pumount \"$HAL_PROP_BLOCK_DEVICE\"" "$USER"
- exit $?
-
- MOUNT_POINT="$HAL_PROP_INFO_HAL_MOUNT_CREATED_MOUNT_POINT"
- if [ "$MOUNT_POINT" == "" ]; then
- MOUNT_POINT="$HAL_PROP_VOLUME_MOUNT_POINT"
- if [ "$MOUNT_POINT" == "" ]; then
- echo "org.freedesktop.Hal.Device.Volume.NotMounted" >&2
- echo "Cannot figure out where device is mounted." >&2
- exit 1
- fi
- fi
-
- if [ "$HAL_PROP_STORAGE_MEDIA_CHECK_ENABLED" != "false" ]; then
- if [ "$HAL_PROP_VOLUME_IS_MOUNTED" != "true" ]; then
- echo "org.freedesktop.Hal.Device.Volume.NotMounted" >&2
- echo "Device is not mounted." >&2
- exit 1
- fi
- fi
-
- if [ "$HAL_METHOD_INVOKED_BY_UID" != "0" ]; then
- if [ "$HAL_METHOD_INVOKED_BY_UID" != "$HAL_PROP_INFO_HAL_MOUNT_MOUNTED_BY_UID" ]; then
- UID_MOUNTED="$HAL_PROP_INFO_HAL_MOUNT_MOUNTED_BY_UID"
- if [ "$UID_MOUNTED" == "" ]; then
- UID_MOUNTED="UNKNOWN"
- fi
- echo "org.freedesktop.Hal.Device.Volume.PermissionDenied" >&2
- echo "Volume mounted by uid $UID_MOUNTED cannot be unmounted by uid $HAL_METHOD_INVOKED_BY_UID." >&2
- exit 1
- fi
- fi
-
- # read parameters
- # "lazy\tforce\n"
- # Only allow ^a-zA-Z0-9_= in the string because otherwise someone may
- # pass e.g. umask=0600,suid,dev or umask=`/bin/evil`
-
- read GIVEN_UNMOUNTOPTIONS
- GIVEN_UNMOUNTOPTIONS=${GIVEN_UNMOUNTOPTIONS//[^a-zA-Z0-9_=[:space:]]/_}
-
- if [ "$GIVEN_UNMOUNTOPTIONS" != "" ]; then
- for OPTION in $GIVEN_UNMOUNTOPTIONS; do
- OPTION_WAS_OK="0"
- for VALID_OPTION in $HAL_PROP_VOLUME_UNMOUNT_VALID_OPTIONS; do
- if [ "$OPTION" == "$VALID_OPTION" ]; then
- OPTION_WAS_OK="1"
- break
- fi
- done
-
- if [ "$OPTION_WAS_OK" == "1" ]; then
- case "$OPTION" in
- "lazy")
- UNMOUNTOPTIONS="$UNMOUNTOPTIONS -l"
- OPTION_WAS_OK="1"
- ;;
- "force")
- UNMOUNTOPTIONS="$UNMOUNTOPTIONS -f"
- OPTION_WAS_OK="1"
- ;;
- *)
- echo "org.freedesktop.Hal.Device.Volume.UnsupportedUnmountOption" >&2
- echo "The option '$OPTION' is not supported" >&2
- exit 1
- esac
- else
- echo "org.freedesktop.Hal.Device.Volume.InvalidUnmountOption" >&2
- echo "The option '$OPTION' is invalid" >&2
- exit 1
- fi
- done
- fi
-
- RESULT=$(umount $UNMOUNTOPTIONS "$MOUNT_POINT" 2>&1)
- if [ $? -ne 0 ]; then
- case "$RESULT" in
- *busy*)
- echo "org.freedesktop.Hal.Device.Volume.Busy" >&2
- echo "Device is busy." >&2
- ;;
- *"not mounted"*)
- echo "org.freedesktop.Hal.Device.Volume.NotMounted" >&2
- echo "Device is not mounted." >&2
- ;;
- *)
- echo "org.freedesktop.Hal.Device.Volume.UnknownFailure" >&2
- echo "Unknown failure." >&2
- esac
- exit 1
- fi
-
- # remove directory only if HAL has created it
- if [ -e "$MOUNT_POINT/.created-by-hal" ]; then
- rm -f "$MOUNT_POINT/.created-by-hal"
- rmdir --ignore-fail-on-non-empty "$MOUNT_POINT"
- fi
-
- hal-set-property --udi $UDI --key info.hal_mount.created_mount_point --remove > /dev/null 2>&1
- hal-set-property --udi $UDI --key info.hal_mount.mounted_by_uid --remove > /dev/null 2>&1
-
- exit 0
-