home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / share / hal / scripts / hal-system-storage-unmount < prev   
Encoding:
Text File  |  2006-08-30  |  3.7 KB  |  129 lines

  1. #!/bin/bash
  2.  
  3. # Copyright (C) 2005, Kay Sievers <kay.sievers@vrfy.org>
  4. # Copyright (C) 2006, David Zeuthen <david@fubar.dk>
  5. #
  6. # This program is free software; you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License version 2.
  8.  
  9. # Check for environment variables
  10. if [ "$HAL_PROP_BLOCK_DEVICE" == "" ] || [ "$HAL_PROP_INFO_UDI" == "" ] ; then
  11.     echo "Missing or empty environment variable(s)." >&2
  12.     echo "This script should be started by hald." >&2
  13.     exit 1
  14. fi
  15.  
  16. # check validity of user id
  17. if [ "$HAL_METHOD_INVOKED_BY_UID" = "0" ]; then
  18.     echo "Script was called with HAL_METHOD_INVOKED_BY_UID=0, aborting." >&2
  19.     exit 1
  20. fi
  21. PWD=`getent passwd "$HAL_METHOD_INVOKED_BY_UID"` || {
  22.     echo "User id $HAL_METHOD_INVOKED_BY_UID does not exist." >&2
  23.     exit 1
  24. }
  25. USER="`echo "$PWD" | cut -f 1 -d:`"
  26.  
  27. su -c "pumount \"$HAL_PROP_BLOCK_DEVICE\"" "$USER"
  28. exit $?
  29.  
  30. MOUNT_POINT="$HAL_PROP_INFO_HAL_MOUNT_CREATED_MOUNT_POINT"
  31. if [ "$MOUNT_POINT" == "" ]; then
  32.     MOUNT_POINT="$HAL_PROP_VOLUME_MOUNT_POINT"
  33.     if [ "$MOUNT_POINT" == "" ]; then
  34.     echo "org.freedesktop.Hal.Device.Volume.NotMounted" >&2
  35.     echo "Cannot figure out where device is mounted." >&2
  36.     exit 1
  37.     fi
  38. fi
  39.  
  40. if [ "$HAL_PROP_STORAGE_MEDIA_CHECK_ENABLED" != "false" ]; then
  41.     if [ "$HAL_PROP_VOLUME_IS_MOUNTED" != "true" ]; then
  42.     echo "org.freedesktop.Hal.Device.Volume.NotMounted" >&2
  43.     echo "Device is not mounted." >&2
  44.     exit 1
  45.     fi
  46. fi
  47.  
  48. if [ "$HAL_METHOD_INVOKED_BY_UID" != "0" ]; then
  49.     if [ "$HAL_METHOD_INVOKED_BY_UID" != "$HAL_PROP_INFO_HAL_MOUNT_MOUNTED_BY_UID" ]; then
  50.     UID_MOUNTED="$HAL_PROP_INFO_HAL_MOUNT_MOUNTED_BY_UID"
  51.     if [ "$UID_MOUNTED" == "" ]; then
  52.         UID_MOUNTED="UNKNOWN"
  53.     fi
  54.     echo "org.freedesktop.Hal.Device.Volume.PermissionDenied" >&2
  55.     echo "Volume mounted by uid $UID_MOUNTED cannot be unmounted by uid $HAL_METHOD_INVOKED_BY_UID." >&2
  56.     exit 1
  57.     fi
  58. fi
  59.  
  60. # read parameters
  61. # "lazy\tforce\n"
  62. # Only allow ^a-zA-Z0-9_= in the string because otherwise someone may
  63. # pass e.g. umask=0600,suid,dev or umask=`/bin/evil`
  64.  
  65. read GIVEN_UNMOUNTOPTIONS
  66. GIVEN_UNMOUNTOPTIONS=${GIVEN_UNMOUNTOPTIONS//[^a-zA-Z0-9_=[:space:]]/_}
  67.  
  68. if [ "$GIVEN_UNMOUNTOPTIONS" != "" ]; then
  69.     for OPTION in $GIVEN_UNMOUNTOPTIONS; do
  70.     OPTION_WAS_OK="0"
  71.     for VALID_OPTION in $HAL_PROP_VOLUME_UNMOUNT_VALID_OPTIONS; do
  72.         if [ "$OPTION" == "$VALID_OPTION" ]; then
  73.         OPTION_WAS_OK="1"
  74.         break
  75.         fi
  76.     done
  77.  
  78.     if [ "$OPTION_WAS_OK" == "1" ]; then
  79.         case "$OPTION" in
  80.             "lazy")
  81.             UNMOUNTOPTIONS="$UNMOUNTOPTIONS -l"
  82.             OPTION_WAS_OK="1"
  83.             ;;
  84.             "force")
  85.             UNMOUNTOPTIONS="$UNMOUNTOPTIONS -f"
  86.             OPTION_WAS_OK="1"
  87.             ;;
  88.             *)
  89.             echo "org.freedesktop.Hal.Device.Volume.UnsupportedUnmountOption" >&2
  90.             echo "The option '$OPTION' is not supported" >&2
  91.             exit 1
  92.         esac
  93.     else
  94.         echo "org.freedesktop.Hal.Device.Volume.InvalidUnmountOption" >&2
  95.         echo "The option '$OPTION' is invalid" >&2
  96.         exit 1
  97.     fi
  98.     done
  99. fi
  100.  
  101. RESULT=$(umount $UNMOUNTOPTIONS "$MOUNT_POINT"  2>&1)
  102. if [ $? -ne 0 ]; then
  103.     case "$RESULT" in
  104.     *busy*)
  105.         echo "org.freedesktop.Hal.Device.Volume.Busy" >&2
  106.         echo "Device is busy." >&2
  107.         ;;
  108.     *"not mounted"*)
  109.         echo "org.freedesktop.Hal.Device.Volume.NotMounted" >&2
  110.         echo "Device is not mounted." >&2
  111.         ;;
  112.     *)
  113.         echo "org.freedesktop.Hal.Device.Volume.UnknownFailure" >&2
  114.         echo "Unknown failure." >&2
  115.     esac
  116.     exit 1
  117. fi
  118.  
  119. # remove directory only if HAL has created it
  120. if [ -e "$MOUNT_POINT/.created-by-hal" ]; then
  121.   rm -f "$MOUNT_POINT/.created-by-hal"
  122.   rmdir --ignore-fail-on-non-empty "$MOUNT_POINT"
  123. fi
  124.  
  125. hal-set-property --udi $UDI --key info.hal_mount.created_mount_point --remove > /dev/null 2>&1
  126. hal-set-property --udi $UDI --key info.hal_mount.mounted_by_uid --remove > /dev/null 2>&1
  127.  
  128. exit 0
  129.