#!/bin/csh -f # diskutil_eject # ----------------------------------------------------------------------------- # Shell script to eject an external drive. # ----------------------------------------------------------------------------- # Usage: See Usage section below or run with -h or --help to see usage. # Assumptions: # Effects: # - Ejects the drive # Notes: # Implementation Notes: # Portability Issues: # Revision History: # $Log$ # ----------------------------------------------------------------------------- set retry_max = 10 set retry_delay = 1 while ($#argv > 0) if ("$1" == "-h" || "$1" == "--help") then echo "Usage: $0:t [options] drive_name" echo "Options:" echo " -h = Show this help text" echo " --help = Show this help text" echo " -r number = Number of retries. Default: $retry_max" echo " --retry-max number" echo " = Number of retries. Default: $retry_max" echo " -d seconds = Delay before retry. Default: $retry_delay" echo " --retry-delay seconds" echo " = Delay before retry. Default: $retry_delay" exit 1 else if ("$1" == "-r" || "$1" == "--retry-max") then shift if ("$1" == "") then beep "Error: Missing argument to -r or --retry-max option" $0 --help exit 1 else set option_retry_max = "$1" # Convert to number #?? Check for non-digits and other errors here @ retry_max = $option_retry_max shift endif else if ("$1" == "-d" || "$1" == "--retry-delay") then shift if ("$1" == "") then beep "Error: Missing argument to -d or --retry-delay option" $0 --help exit 1 else set option_retry_delay = "$1" # Convert to number #?? Check for non-digits and other errors here @ retry_delay = $option_retry_delay shift endif else if ("-" == "`echo $1:q | cut -c 1`") then beep "Error: Invalid option: $1:q" $0 --help exit 1 else # Not a recognized option. Assume it's the first argument break endif end # Collect command line arguments if ($#argv < 1) then beep "Error: No drive_name specified." $0:t --help exit 1 else if ($#argv > 1) then beep "Error: Too many arguments specified." $0:t --help exit 1 endif set drive_name = "$1" set drive = "/Volumes/$drive_name" if (! -d "${drive}") then beep "Error: $drive does not exist." $0:t --help exit 1 endif set original_drive_name = "$drive_name" set drive_id = `get_external_drive_id "$drive_name"` if ("$drive_id" == "") then set drive_name = `echo "$drive_name" | uppercase` if ("$original_drive_name" != "$drive_name") then echo -n "Warning: Unable to get drive_id of $drive. " set drive = "/Volumes/$drive_name" echo "Trying $drive." set drive_id = `get_external_drive_id "$drive_name"` endif endif if ("$drive_id" == "") then set drive_name = `echo "$drive_name" | lowercase` if ("$original_drive_name" != "$drive_name") then echo -n "Warning: Unable to get drive_id of $drive. " set drive = "/Volumes/$drive_name" echo "Trying $drive." set drive_id = `get_external_drive_id "$drive_name"` endif endif if ("$drive_id" == "") then beep "Error: Unable to get drive_id of $drive." exit 1 endif @ count = 0 while (1 == 1) @ count++ echo -n "`date`" echo ": Attempt $count to eject $drive... " diskutil eject $drive_id set rc = $status if ($rc == 0) then echo "Success." break else echo -n "Error $rc. " if ($count < $retry_max) then set secs_string = "seconds" if ($retry_delay == 1) set secs_string = "second" echo "Waiting $retry_delay $secs_string before retry..." sleep $retry_delay else beep "Failed $retry_max times. Eject the drive manually." break endif endif end exit $rc