#!/bin/bash

##################################################
#                                                #
# SETTING FILE                                   #
# ~/.bashrc ~/.bash_profile                      #
# /etc/fstab-mountrc                             #
# ~/.fstab-mountrc                               #
#                                                #
# FSTAB_MOUNT_DIR = directory                    #
#         default = empty = "$HOME/.fstab-mount" #
#                                                #
# FSTAB_MOUNT_DESKTOP_NO_ICON = 1 or not 1       #
#             default = empty = not 1            #
#  not 1 : make icon in $HOME/Desktop            #
#      1 : do not make icon                      #
#                                                #
##################################################

# this shell script requires
# awk (gawk)
# bash
# grep
# mkdir (coreutils)
# sed
# /sbin/findfs (e2fsprogs)
# zenity

# read /etc/fstab-mountrc
if [ -r "/etc/fstab-mountrc" ] ; then
    source /etc/fstab-mountrc
fi
# read ~/.fstab-mountrc
if [ -r "$HOME/.fstab-mountrc" ] ; then
    source "$HOME/.fstab-mountrc"
fi

# japanese message
if [ -z "$TEXTDOMAIN" ] ; then
    TEXTDOMAIN="fstab-user-mount-tool"
    TEXTDOMAINDIR="/usr/share/locale"
fi

if [ -n "$FSTAB_MOUNT_NO_ZENITY" ] || [ "$TERM" = "linux" ] ; then
    zenity_command=":"
    zenity_command_for_wait=":"
else
    zenity_command="/usr/bin/zenity"
    if [ -n "$FSTAB_MOUNT_WAIT_NO_ZENITY" ] ; then
	zenity_command_for_wait=":"
    else
	zenity_command_for_wait="/usr/bin/zenity"
    fi
fi

if [ -n "$FSTAB_UMOUNT_BEEP" ] ; then
    if [ -n "$FSTAB_BEEP_COMMAND" ] ; then
	function fstab_beep { $FSTAB_BEEP_COMMAND ;}
    else
	function fstab_beep {
	    /usr/bin/setterm -blength 10
	    /bin/echo -e "\a"
	}
    fi
    
    if [ -n "$FSTAB_BEEP_NG_COMMAND" ] ; then
	function fstab_beep_ng { $FSTAB_BEEP_NG_COMMAND ;}
    else
	function fstab_beep_ng {
	    /usr/bin/setterm -blength 10
	    /bin/echo -e "\a"
	    /bin/sleep 0.3
	    /bin/echo -e "\a"
	}
    fi
else
    function fstab_beep { : ; }
    function fstab_beep_ng { : ; }
fi

if [ -z "$FSTAB_UMOUNT_NO_WAIT" ] ; then
    FSTAB_UMOUNT_NO_WAIT=0
fi

# no argument : exit and show error message
if [ -z "$1" ] ; then
    ERROR_MESSAGE_NEED_ARGUMENT=$"This shell script needs one argument.\n\nexample: fstab-umount /dev/fd0"
    /bin/echo -e "$ERROR_MESSAGE_NEED_ARGUMENT" >&2
#    $zenity_command --error --text="$ERROR_MESSAGE_NEED_ARGUMENT" >/dev/null &
    exit 4
fi

# no check
if [ -n "$FSTAB_MOUNT_NO_CHECK" ] ; then
    /bin/umount "$1"
    exit
fi

# nautilus check
if [ "$TERM" = "linux" ] ; then
    NAUTILUS_IS_WORKING=0
else
    NAUTILUS_IS_WORKING="`/usr/bin/pgrep nautilus | /usr/bin/wc -l`"
fi

# directory name
if [ -z "$FSTAB_MOUNT_DIR" ] ; then
    FSTAB_MOUNT_DIR="$HOME/.fstab-mount"
fi

# desktop directory name
if [ "$NAUTILUS_IS_WORKING" -ne "0" ] ; then
    if [ -x /usr/bin/gconftool-2 ] ; then
	if [ "`/usr/bin/gconftool-2 -g /apps/nautilus/preferences/desktop_is_home_dir`" = "true" ] ; then
	    DESKTOP_DIR=$HOME/
	else
	    DESKTOP_DIR=$HOME/Desktop/
	fi
    else
	DESKTOP_DIR=$HOME/Desktop/
    fi
else
    DESKTOP_DIR=$HOME/Desktop/
fi

# directory was not found -> setup
if [ ! -d "$FSTAB_MOUNT_DIR" ] ; then
    SETUP_MESSAGE_START=$"directory \$FSTAB_MOUNT_DIR : $FSTAB_MOUNT_DIR was not found.\nSetup(fstab-user-mount) starts."
    SETUP_MESSAGE_END=$"Setup has been finished.\n"

    SETUP_MESSAGE_ERROR=$"\nerror : Setup has been failed."

    /bin/echo -e "$SETUP_MESSAGE_START"
    if ( ! FSTAB_DO_NOT_OPEN_NAUTILUS=1 /usr/bin/fstab-user-mount ) ; then
	/bin/echo -e "$SETUP_MESSAGE_ERROR"
	exit 3
    fi
    /bin/echo -e "$SETUP_MESSAGE_END"
fi

LOG_FILE="$FSTAB_MOUNT_DIR/umount.log"

if [ -w "$LOG_FILE" ] ; then
    /bin/mv -f "$LOG_FILE" "$LOG_FILE.old"
fi

SCRIPT_NAME="fstab-umount"
function get_oldest_pid {
#    OLDEST_PID=`/bin/ps ax | /usr/bin/awk '{print $1,$5}'| /bin/grep "$SCRIPT_NAME" | /bin/sort -n | /usr/bin/head -n 1`
    OLDEST_PID=`/usr/bin/pgrep "$SCRIPT_NAME" | /bin/sort -n | /usr/bin/head -n 1`
}

get_oldest_pid


MY_PID="$$"
# echo "MY_PID:" "$MY_PID"


# wait other process ?
if [ "$FSTAB_UMOUNT_NO_WAIT" -ne "1" ] ; then

    ##############################
    # setup for waiting other process

    # zenity message and echo message
    device_name_in_title=`/bin/basename "$1"`

    ZENITY_FSTAB_UMOUNT_WAIT_TITLE=$"Please wait ( umount $device_name_in_title )"
    ZENITY_FSTAB_UMOUNT_WAIT_MESSAGE=$"other fstab-umount is working.\n\nIf you want to start now,\nclick Cancel Button.\n\nHINT: If you do not want to wait,\nset FSTAB_UMOUNT_NO_WAIT=1\nin $HOME/.fstab-mountrc."

    CONSOLE_FSTAB_UMOUNT_WAIT_TITLE="$ZENITY_FSTAB_UMOUNT_WAIT_TITLE"
    CONSOLE_FSTAB_UMOUNT_WAIT_MESSAGE=$"other fstab-umount is working.\n\nIf you want to cancel now,\nCtrl+C.\n\nHINT: If you do not want to wait,\nset FSTAB_UMOUNT_NO_WAIT=1\nin $HOME/.fstab-mountrc."


    # lock file for exiting until loop
    LOCK_FILE="$FSTAB_MOUNT_DIR/fstab-umount.lock.$MY_PID"

    
    # for trap (cancel with Ctrl+C)
    ZENITY_NO_WAIT_CANCEL_MESSAGE=$"fstab-umount (umount $device_name_in_title) : PID:$MY_PID : cancelled."
    function cancel_with_CTRL_C {

	# remove LOCK_FILE for exiting until loop
	if [ -e "$LOCK_FILE" ] ; then /bin/rm "$LOCK_FILE" ; fi

	/bin/echo -e "\n\n*******\n$ZENITY_NO_WAIT_CANCEL_MESSAGE\n*******"
	$zenity_command --info --text="$ZENITY_NO_WAIT_CANCEL_MESSAGE" &
	exit
    }
    
    # set up ok
    ##############################
    
    
    # process id check
    if [ "$OLDEST_PID" -ne "$MY_PID" ] ; then

	# wating other process start

	/bin/touch "$LOCK_FILE" || exit 2

	# message to console
	/bin/echo -e "$CONSOLE_FSTAB_UMOUNT_WAIT_TITLE"
	/bin/echo -e "$CONSOLE_FSTAB_UMOUNT_WAIT_MESSAGE"

	# until loop is in background for trap.
	(
	    until [ ! -e "$LOCK_FILE" ] || [ "$OLDEST_PID" -eq "$MY_PID" ] ;
	    do
		get_oldest_pid
		/bin/sleep 1
		
		# echo "OLDEST_PID:" "$OLDEST_PID"
		# echo "MY_PID:" "$MY_PID"
		
    		# echo for zenity
		/bin/echo ""

	    # 2>/dev/null for "Broken pipe" message from echo (by zenity's Cancel button)
	    done 2>/dev/null | $zenity_command_for_wait --progress --pulsate --auto-close --title="$ZENITY_FSTAB_UMOUNT_WAIT_TITLE" --text="$ZENITY_FSTAB_UMOUNT_WAIT_MESSAGE" >/dev/null
	) &
    fi 
fi

# trap for Ctrl+C
trap "cancel_with_CTRL_C" 2

# trap -p

# wait for until loop
# 1>/dev/null for Interrupt message
# 2>/dev/null for hung up message (from zenity)
wait >/dev/null 2>&1

# If zenity is cancelled by Cancel button,
# I need to finish until loop.
if [ -e "$LOCK_FILE" ] ; then
    /bin/rm "$LOCK_FILE"
fi

# clear trap for 2 (SIGINT = Ctrl+C)
trap 2

# trap -p

# directory check
if ( ! /bin/mkdir -p "$FSTAB_MOUNT_DIR" ) ; then
    ERROR_MESSAGE_DIRECTORY_CREATE=$"error : cannot create temporal directory\n\$FSTAB_MOUNT_DIR : $FSTAB_MOUNT_DIR"
    /bin/echo -e "$ERROR_MESSAGE_DIRECTORY_CREATE" >/dev/stderr
    exit 3
fi

LOG_FILE="$FSTAB_MOUNT_DIR/umount.log.$$"

date >"$LOG_FILE" 2>&1

device_name="$1"

# echo "device_name is $device_name"

#######################
# check name step1
# cut "$FSTAB_MOUNT_DIR" from $1
if [ `/bin/echo "$device_name" | /bin/grep -c "^$FSTAB_MOUNT_DIR"` -gt '0' ] ; then
    device_name="`/bin/echo $1 | /bin/sed -e s@$FSTAB_MOUNT_DIR@@ -e s@^/@@`"
fi

# echo "step1 device_name is $device_name"

#######################
# check name step2
# cut "$DESKTOP_DIR" from $1
if [ `/bin/echo "$device_name" | /bin/grep -c "^$DESKTOP_DIR"` -gt '0' ] ; then
    device_name="`/bin/echo $1 | /bin/sed s@$DESKTOP_DIR@@`"
fi

# echo "step2 device_name is $device_name"

#######################
# check name step3
# rename _dev_ /dev/ $device_name
if [ `/bin/echo "$device_name" | /bin/grep -c "^_dev_"` -gt "0" ] ; then
    device_name="`/bin/echo $device_name | /bin/sed s@_dev_@/dev/@`"
fi

# echo "step3 device_name is $device_name"

#######################
# save device_name for findfs
if [ `/bin/echo "$device_name" | /bin/grep -c "^/dev/"` -gt "0" ] ; then
    device_name_for_LABEL_UUID_check="$device_name"
    # echo "device_name_for_LABEL_UUID_check:" "$device_name_for_LABEL_UUID_check"
fi	


#######################
# check name step4
# rename _mnt_ /mnt/ $device_name
if [ `/bin/echo "$device_name" | /bin/grep -c "^_mnt_"` -gt "0" ] ; then
    device_name="`/bin/echo $device_name | /bin/sed s@_mnt_@/mnt/@`"
fi

# echo "step4 device_name is $device_name"

#######################
# check name step4-2
# rename _media_ /media/ $device_name
if [ `/bin/echo "$device_name" | /bin/grep -c "^_media_"` -gt "0" ] ; then
    device_name="`/bin/echo $device_name | /bin/sed s@_media_@/media/@`"
fi

# echo "step4-2 device_name is $device_name"

#######################
# check name step5
# LABEL?
if [ `/bin/echo "$device_name" | grep -c "^LABEL="` -eq "1" ] ; then

    device_name_tmp="`/bin/echo $device_name | sed s@/\$\@@`"
    LABEL_device="`/sbin/findfs $device_name_tmp 2>/dev/null`"
    if [ -n "$LABEL_device" ] ; then
	if [ -z "$device_name_for_LABEL_UUID_check" ] ; then
	    device_name_for_LABEL_UUID_check="$LABEL_device"
	    # echo "device_name_for_LABEL_UUID_check:" "$device_name_for_LABEL_UUID_check"
	fi
    else
	/bin/cat "$LOG_FILE" >&2
    fi
fi

# echo "step5 LABEL_device is $LABEL_device"

#######################
# check name step6
# UUID?
if [ `/bin/echo "$device_name" | grep -c "^UUID="` -eq "1" ] ; then

    device_name_tmp="`/bin/echo $device_name | sed s@/\$\@@`"
    UUID_device="`/sbin/findfs $device_name_tmp 2>/dev/null`"
    if [ -n "$UUID_device" ] ; then
	if [ -z "$device_name_for_LABEL_UUID_check" ] ; then
	    device_name_for_LABEL_UUID_check="$UUID_device"
	    # echo "device_name_for_LABEL_UUID_check:" "$device_name_for_LABEL_UUID_check"
	fi
    else
	/bin/cat "$LOG_FILE" >&2
    fi
fi

# echo "step6 UUID_device is $UUID_device"

# now 2 case
# 1 $device_name is device name
# 2 $device_name is mount point

# + 2 case
# LABEL_device is set
# UUID_device is set

#########################################
#########################################
# function for set umount_name from fstab


# ***** umount_name is DEVICE NAME *****
# 1 -> 1
# search device name on fstab by devicename
# keyword is in field 1 (device name) , print field 1 (device name)
function get_device_name_from_fstab_with_device_name {
    if [ -z "$device_name_in_fstab" ] ; then
	device_name_in_fstab=`/usr/bin/awk -F "\#" '{print \$1}' /etc/fstab |\
	/usr/bin/awk "\\$1 ~ \"^\$device_name$\" && \\$4 ~ /user|owner|group/ {print \\$1}" `
	
	if [ -n "$device_name_in_fstab" ] ; then
	    # echo "device_name_in_fstab:" "$device_name_in_fstab" "in_get_dn_from_fstab_with_dn"
	    
	    if [ -z "$umount_name" ] ; then
		umount_name="$device_name_in_fstab"
	    fi
	    # echo "umount_name:" "$umount_name" "in_get_dn_from_fstab_with_dn"
	fi
    fi
}

# ***** umount_name is MOUNT POINT ******
# 2 -> 2
# search mount point on fstab by mountpoint
# keyword is in field 2 , print field 2
function get_mount_point_from_fstab_with_mount_point {
    if [ -z "$mount_point_in_fstab" ] ; then
	mount_point_in_fstab=`/usr/bin/awk -F "\#" '{print \$1}' /etc/fstab |\
	/usr/bin/awk "\\$2 ~ \"^\$device_name$\" && \\$4 ~ /user|owner|group/ {print \\$2}" `
	
	if [ -n "$mount_point_in_fstab" ] ; then
	    # echo "mount_point_in_fstab:" "$mount_point_in_fstab" "in get_mp_from_fstab_with_mp"

	    if [ -z "$umount_name" ] ; then	    
		umount_name="$mount_point_in_fstab"
	    fi
	    # echo "umount_name:" "$umount_name" "in get_mp_from_fstab_with_mp"
	fi
    fi
}

# ***** umount_name is MOUNT POINT ******
# 1 -> 2
# search mount point on fstab by devicename
# keyword is in field 1 , print field 2
function get_mount_point_from_fstab_with_device_name {
    if [ -z "$mount_point_in_fstab" ] ; then
	mount_point_in_fstab=`/usr/bin/awk -F "\#" '{print \$1}' /etc/fstab |\
	/usr/bin/awk "\\$1 ~ \"^\$device_name$\" && \\$4 ~ /user|owner|group/ {print \\$2}" `
	
	if [ -n "$mount_point_in_fstab" ] ; then
	    # echo "mount_point_in_fstab:" "$mount_point_in_fstab" "in get_mp_from_fstab_with_dn"
	    
	    if [ -z "$umount_name" ] ; then
		umount_name="$mount_point_in_fstab"
	    fi
	    device_name_in_fstab="$device_name"
	    
	    # echo "umount_name:" "$umount_name" "in get_mp_from_fstab_with_dn"
	fi
    fi
}

# ***** umount_name is MOUNT POINT ******
# 2 -> 1
# search device name on fstab by mountpoint
# keyword is in field 2 (mount point) , print field 1 (device name)
function get_device_name_from_fstab_with_mount_point {
    if [ -z "$device_name_in_fstab" ] ; then
	device_name_in_fstab=`/usr/bin/awk -F "\#" '{print \$1}' /etc/fstab |\
	/usr/bin/awk "\\$2 ~ \"^\$device_name$\" && \\$4 ~ /user|owner|group/ {print \\$1}" `
	
	if [ -n "$device_name_in_fstab" ] ; then
	    # echo "device_name_in_fstab:" "$device_name_in_fstab" "in get_dn_from_fstab_with_mp"
	    
	    if [ -z "$umount_name" ] ; then
		umount_name="$device_name_in_fstab"
	    fi		
	    # echo "umount_name:" "$umount_name" "in get_dn_from_fstab_with_mp"
	fi
    fi
}

# ***** $1 is DEVICE NAME *****
# device_name -> LABEL_name
# check LABEL name with blkid
# keyword is device name , print LABEL_name
function get_LABEL_name_from_blkid_command_with_device_name_for_LABEL_UUID_check {
    # echo "$device_name_for_LABEL_UUID_check"
    if [ -n "$device_name_for_LABEL_UUID_check" ] && [ -z "$LABEL_device" ] ; then
	LABEL=`/sbin/blkid -s LABEL "$device_name_for_LABEL_UUID_check" | awk '{print $2}'`
	if [ -n "$LABEL" ] ; then
	    LABEL_device="$LABEL"
	    # remove two double quotes for awk ( LABEL="HOGE" -> LABEL=HOGE )
	    device_name="`/bin/echo $LABEL_device | sed s/\\"//g`"
	fi
	# echo "LABEL_device:" "$LABEL_device"
	# echo "device_name:" "$device_name"
    fi
}

# ***** $1 is DEVICE NAME *****
# device_name -> UUID_name
# check UUID name with blkid
# keyword is device name , print UUID_name
function get_UUID_name_from_blkid_command_with_device_name_for_LABEL_UUID_check {
    # echo "$device_name_for_LABEL_UUID_check"

    if [ `/bin/echo "$device_name" | /bin/grep -c "^/dev/"` -ne "1" ] ; then
	if [ -n "$device_name_for_LABEL_UUID_check" ] && [ -z "$UUID_device" ] ; then
	    UUID=`/sbin/blkid -s UUID "$device_name_for_LABEL_UUID_check" | awk '{print $2}'`
	    if [ -n "$UUID" ] ; then
		UUID_device="$UUID"
		# remove two double quotes for awk ( UUID="1234-5678" -> UUID=1234-5678 )
		device_name="`/bin/echo $UUID_device | sed s/\\"//g `"
	fi
	    # echo "UUID_device:" "$UUID_device"
	    # echo "device_name:" "$device_name"
    fi
    fi
}


#######################
# set umount_name

function all_check {
    get_device_name_from_fstab_with_device_name
    get_mount_point_from_fstab_with_mount_point
    
    get_mount_point_from_fstab_with_device_name
    get_device_name_from_fstab_with_mount_point
}

all_check

# echo "##### after first check"
# echo "device_name:" "$device_name"
# echo "umount_name:" "$umount_name"

# echo "device_name_in_fstab:" "$device_name_in_fstab"
# echo "mount_point_in_fstab:" "$mount_point_in_fstab"

# echo "device_name_for_LABEL_UUID_check:" "$device_name_for_LABEL_UUID_check"

# echo "LABEL_device:" "$LABEL_device"
# echo "UUID_device:" "$UUID_device"


# rename /mnt/hoge/ /mnt/hoge
if [ -z "$umount_name" ] ; then
    device_name="`/bin/echo $device_name|sed s@/\\$@@`"
    
    all_check
fi

# echo "##### after remove /"
# echo "device_name:" "$device_name"
# echo "umount_name:" "$umount_name"

# echo "device_name_in_fstab:" "$device_name_in_fstab"
# echo "mount_point_in_fstab:" "$mount_point_in_fstab"

# echo "device_name_for_LABEL_UUID_check:" "$device_name_for_LABEL_UUID_check"

# echo "LABEL_device:" "$LABEL_device"
# echo "UUID_device:" "$UUID_device"


# LABEL

if [ -z "$umount_name" ] && [ -n "LABEL_device" ] ; then
    
    device_name="$LABEL_device"

    all_check
fi

# echo "##### after LABEL"
# echo "device_name:" "$device_name"
# echo "umount_name:" "$umount_name"

# echo "device_name_in_fstab:" "$device_name_in_fstab"
# echo "mount_point_in_fstab:" "$mount_point_in_fstab"

# echo "device_name_for_LABEL_UUID_check:" "$device_name_for_LABEL_UUID_check"

# echo "LABEL_device:" "$LABEL_device"
# echo "UUID_device:" "$UUID_device"


# UUID

if [ -z "$umount_name" ] && [ -n "$UUID_device" ] ; then
    
    device_name="$UUID_device"

    all_check
fi

# echo "##### after UUID"
# echo "device_name:" "$device_name"
# echo "umount_name:" "$umount_name"

# echo "device_name_in_fstab:" "$device_name_in_fstab"
# echo "mount_point_in_fstab:" "$mount_point_in_fstab"

# echo "device_name_for_LABEL_UUID_check:" "$device_name_for_LABEL_UUID_check"

# echo "LABEL_device:" "$LABEL_device"
# echo "UUID_device:" "$UUID_device"


if [ -z "$umount_name" ] ; then
    
    # $1 is a file ?
    if [ -e "$1" ] ; then
	device_name_tmp=`/usr/bin/readlink -m "$1"`
	if [ -e "$device_name_tmp" ] ; then
	    device_name="$device_name_tmp"
	fi

	if [ "$1" != "$device_name" ] ; then
	    # cd /dev
	    # fstab-mount hda1
	    # hda1 --readlink--> /dev/hda1
	    
	    WARNING_READ_LINK=1
	    WARNING_MESSAGE_READ_LINK=$"$1 is linked to $device_name.\nI use $device_name instead of $1.\n"
	    
	    /bin/echo -e "$WARNING_MESSAGE_READ_LINK" >> "$LOG_FILE" 2>&1
	    /bin/echo -e "$WARNING_MESSAGE_READ_LINK" >&2
	    
	    all_check

	    if [ `/bin/echo "$device_name_for_LABEL_UUID_check" | /bin/grep -c "^/dev/"` -ne "1" ] ; then
		device_name_for_LABEL_UUID_check="$device_name"
	    else
		device_name_for_LABEL_UUID_check="`/usr/bin/readlink -m $device_name_for_LABEL_UUID_check`"
	    fi
	fi
    fi
fi

# echo "##### after READ LINK"
# echo "device_name:" "$device_name"
# echo "umount_name:" "$umount_name"

# echo "device_name_in_fstab:" "$device_name_in_fstab"
# echo "mount_point_in_fstab:" "$mount_point_in_fstab"

# echo "device_name_for_LABEL_UUID_check:" "$device_name_for_LABEL_UUID_check"

# echo "LABEL_device:" "$LABEL_device"
# echo "UUID_device:" "$UUID_device"


# echo "device_name:" "$device_name"
all_check


if [ -z "$umount_name" ] ; then
    if [ -z "$LABEL_device" ] ; then
	# device_name_in_fstab is LABEL ?

	# set LABEL_name
        get_LABEL_name_from_blkid_command_with_device_name_for_LABEL_UUID_check

	# device_name is LABEL_name
	
	all_check
    fi
fi

# echo "##### after get LABEL"
# echo "device_name:" "$device_name"
# echo "umount_name:" "$umount_name"

# echo "device_name_in_fstab:" "$device_name_in_fstab"
# echo "mount_point_in_fstab:" "$mount_point_in_fstab"

# echo "device_name_for_LABEL_UUID_check:" "$device_name_for_LABEL_UUID_check"

# echo "LABEL_device:" "$LABEL_device"
# echo "UUID_device:" "$UUID_device"


if [ -z "$umount_name" ] ; then
    # device_name_in_fstab is UUID ?
    
    # set UUID_name
    get_UUID_name_from_blkid_command_with_device_name_for_LABEL_UUID_check
    
    # device_name is UUID_name
    
    all_check
fi

# echo "##### after get UUID"
# echo "device_name:" "$device_name"
# echo "umount_name:" "$umount_name"

# echo "device_name_in_fstab:" "$device_name_in_fstab"
# echo "mount_point_in_fstab:" "$mount_point_in_fstab"

# echo "device_name_for_LABEL_UUID_check:" "$device_name_for_LABEL_UUID_check"

# echo "LABEL_device:" "$LABEL_device"
# echo "UUID_device:" "$UUID_device"


if [ -z "$device_name_for_LABEL_UUID_check" ] ; then
    if [ `/bin/echo "$device_name_in_fstab" | /bin/grep -c "^/dev/"` -gt "0" ] ; then
	device_name_for_LABEL_UUID_check="$device_name_in_fstab"
    else
	device_name_for_LABEL_UUID_check="`/sbin/findfs $device_name_in_fstab 2>/dev/null`"
    fi
    #echo "device_name_for_LABEL_UUID_check:" "$device_name_for_LABEL_UUID_check"
fi

#########################
# check mount option users , user , owner , group

YOU_CAN_UMOUNT=0

if [ -n "$device_name_in_fstab" ] ; then
    # users
    users_in_fstab=`/usr/bin/awk -F "\#" '{print \$1}' /etc/fstab |\
	/usr/bin/awk "\\$1 ~ \"^$device_name_in_fstab$\" && \\$4 ~ /users/ {print \\$1}"`

    # echo "users_in_fstab:" "$users_in_fstab"

    if [ -n "$users_in_fstab" ] ; then
	YOU_CAN_UMOUNT=1
    fi

    # user
    if [ -z "$users_in_fstab" ] ; then
	user_in_fstab=`/usr/bin/awk -F "\#" '{print \$1}' /etc/fstab |\
	/usr/bin/awk "\\$1 ~ \"^$device_name_in_fstab$\" && \\$4 ~ /user/ && \\$4 !~ /users/ && \\$4 !~ /nouser/ {print \\$1}"`

	# echo "user_in_fstab:" "$user_in_fstab"

	if [ -n "$user_in_fstab" ] ; then
	    # check who mounted device

	    # mount and pmount write user name on /etc/mtab.
	    MY_NAME=`/usr/bin/id -nu`
	    # gnome-mount     writes user id   on /etc/mtab.
	    MY_NUM=`/usr/bin/id -u`

	    WHO_MOUNT=`/usr/bin/awk "\\$1 ~ \"^\$device_name_for_LABEL_UUID_check$\" {print \\$4}" /etc/mtab | /usr/bin/awk -F "user=" "{print \\$2}"`

	    # echo "WHO_MOUNT:" "$WHO_MOUNT"

	    # not mounted -> WHO_MOUNT=empty
	    if [ -z "$WHO_MOUNT" ] || [ "$MY_NAME" = "$WHO_MOUNT" ] || [ "$MY_NUM" = "$WHO_MOUNT" ] ; then
		YOU_CAN_UMOUNT=1
	    fi
	fi
    fi

    # owner
    # owner + user,users -> user,users
    if [ -z "$users_in_fstab" ] && [ -z "$user_in_fstab" ] ; then
	owner_in_fstab=`/usr/bin/awk -F "\#" '{print \$1}' /etc/fstab |\
	/usr/bin/awk "\\$1 ~ \"^$device_name_in_fstab$\" && \\$4 ~ /owner/ {print \\$1}"`
	
	# echo "owner_in_fstab:" "$owner_in_fstab"

	if [ -n "$owner_in_fstab" ] ; then
	    # check owner of device
	    MY_NAME=`/usr/bin/id -nu`
	    
	    # echo "owner_in_fstab:" "$owner_in_fstab"
	    # echo "device_name_for_LABEL_UUID_check:" "$device_name_for_LABEL_UUID_check"
	    OWNER_OF_DEVICE="`/usr/bin/stat --printf %U $device_name_for_LABEL_UUID_check`"
	    
	    if [ "$OWNER_OF_DEVICE" = "$MY_NAME" ] ; then
		OWNER_OK=1
		YOU_CAN_UMOUNT=1
	    fi
	fi
    fi

    # group
    # group + user,users -> user,users
    if [ -z "$users_in_fstab" ] && [ -z "$user_in_fstab" ] ; then
	group_in_fstab=`/usr/bin/awk -F "\#" '{print \$1}' /etc/fstab |\
	/usr/bin/awk "\\$1 ~ \"^$device_name_in_fstab$\" && \\$4 ~ /group/ {print \\$1}"`
	
	# echo "group_in_fstab:" "$group_in_fstab"
	
	if [ -n "$group_in_fstab" ] ; then
	    # check group of device
	    MY_GROUP=`/usr/bin/id -nG`
	    GROUP_OF_DEVICE=`/usr/bin/stat --print "%G" "$device_name_for_LABEL_UUID_check"`
	    
	    for GROUP in $MY_GROUP ;
	    do
		# echo "$GROUP"
		if [ "$GROUP" = "$GROUP_OF_DEVICE" ] ; then
		    YOU_CAN_UMOUNT=1
		fi
	    done
	fi
    fi
fi

#  change umount name LABEL,UUID -> /dev/???
if [ `/bin/echo "$umount_name" | grep -c -e "^LABEL=" -e "^UUID="` -eq "1" ] ; then
    # echo "umount_name:" "$umount_name"
    if [ -n "$device_name_for_LABEL_UUID_check" ] ; then
	umount_name="$device_name_for_LABEL_UUID_check"
	# echo "umount_name:" "$umount_name"
    fi
fi

# echo "YOU_CAN_UMOUNT:" "$YOU_CAN_UMOUNT"

if [ -z "$umount_name" ] ; then
    YOU_CAN_UMOUNT=0
    umount_name="$1"
fi

# echo "##### after ALL"
# echo "device_name:" "$device_name"
# echo "umount_name:" "$umount_name"

# echo "device_name_in_fstab:" "$device_name_in_fstab"
# echo "mount_point_in_fstab:" "$mount_point_in_fstab"

# echo "device_name_for_LABEL_UUID_check:" "$device_name_for_LABEL_UUID_check"

# echo "LABEL_device:" "$LABEL_device"
# echo "UUID_device:" "$UUID_device"

######################################
# umount_name is set
######################################


#########################################
#########################################
# * after umount *
# function for set umount_name from mtab

# case 1: one device is mounted in two mount points
# mount /dev/fd0 /mnt/floppy  (/etc/fstab) -> umount
# mount /dev/fd0 /mnt/3.5inch (other)
# /dev/fd0 is mounted

# case 2: two devices use one mount point
# mount /dev/fd0 /mnt/floppy (/etc/fstab)
# mount /dev/fd1 /mnt/floppy (other)
# /mnt/floppy is used

# 1 -> 2
# search mount point on mtab by device name
# keyword is in field 1 , print field 2
function get_mount_point_from_mtab_with_device_name {
    other_mount_point=`/usr/bin/awk "\\$1 ~ \"^\$device_name_in_fstab$\" {print \\$2}" /etc/mtab`

    number_of_mount_point=0
    if [ -n "$other_mount_point" ] ; then
	number_of_mount_point=1
	# echo "other_mount_point:" "$other_mount_point"
    fi
}

# 2 -> 1
# search device name on mtab by mount point
# keyword is in field 2 , print field 1
function get_umount_device_from_mtab_with_mount_point {
    other_mounted_device=`/usr/bin/awk "\\$2 ~ \"^\$mount_point_in_fstab$\" {print \\$1}" /etc/mtab`

    number_of_mounted_device=0
    if [ -n "$other_mounted_device" ] ; then
	number_of_mounted_device=1
	# echo "other_umounted_device:" "$other_mounted_device"
    fi
}

function mount_check {
    get_mount_point_from_mtab_with_device_name
    get_umount_device_from_mtab_with_mount_point

    MOUNTED=0

    # echo "number_of_mount_point:" "$number_of_mount_point"
    # echo "number_of_mounted_device:" "$number_of_mounted_device"

    if [ "$number_of_mount_point" -eq "1" ] || [ "$number_of_mounted_device" -eq "1" ] ; then
	MOUNTED=1
    fi
}

function get_zenity_window_width {
    LOG_FILE_WIDTH="`while read line ; do /bin/echo $line | /usr/bin/wc -m ; done < "$LOG_FILE" | /bin/sort -n |/usr/bin/tail -n 1`"
    ZENITY_WINDOW_WIDTH=$((LOG_FILE_WIDTH+10))
}

# echo "YOU_CAN_UMOUNT:" "$YOU_CAN_UMOUNT"

if [ "$YOU_CAN_UMOUNT" -eq "1" ] ; then
    
    ######################################
    # umount
    ######################################

    # zenity message and echo message
    device_name_in_title=`/bin/basename "$1"`
    
    ZENITY_WAIT_TITLE=$"Please wait ( now unmounting $device_name_in_title )"
    ZENITY_WAIT_MESSAGE=$"now unmounting $device_name_in_title.\n\nYou can close this window with Cancel button.\n\nPlease wait for a new information window."
    
    
    if ( /bin/umount "$umount_name" >>"$LOG_FILE" 2>&1 ); then
	# umount ok
	
	ERROR=0
	WARNING=0
	
	# beep
	fstab_beep
	
	MESSAGE_UMOUNT_OK=$"umount $umount_name has been finished."
	
	MESSAGE="$MESSAGE_UMOUNT_OK"
	/bin/echo -e "$MESSAGE"
	
	/bin/date >> "$FSTAB_MOUNT_DIR"/mount.log 2>&1
	/bin/df -hT >> "$FSTAB_MOUNT_DIR"/mount.log 2>&1

	get_mount_point_from_mtab_with_device_name
	get_umount_device_from_mtab_with_mount_point
	
	if [ "$number_of_mount_point" -ne "0" ] ; then
	    fstab_beep_ng
	    sleep 1
	    MESSAGE_DONT_EJECT=$"\nWarning: $device_name_in_fstab is STILL MOUNTED in $other_mount_point."
	    /bin/echo -e "$MESSAGE_DONT_EJECT"
	fi
	if [ "$number_of_mounted_device" -ne "0" ] ; then
	    if [ "$number_of_mount_point" -eq "0" ] ; then
		fstab_beep_ng
		sleep 1
	    fi
	    MESSAGE_MOUNT_POINT=$"\nWarning: mount point $mount_point_in_fstab is STILL USED by $other_mounted_device.\n"
	    /bin/echo -e "$MESSAGE_MOUNT_POINT"
	fi
	
	if [ -n "$MESSAGE_DONT_EJECT" ] ; then
	    MESSAGE="$MESSAGE\n$MESSAGE_DONT_EJECT"
	    WARNING=1
	fi
	
	if [ -n "$MESSAGE_MOUNT_POINT" ] ; then
	    MESSAGE="$MESSAGE\n$MESSAGE_MOUNT_POINT"
	    WARNING=1
	fi
	
	if [ "$WARNING" -eq "1" ] ; then
	    $zenity_command --warning --text="$MESSAGE" >/dev/null &
	else
	    $zenity_command --info --text="$MESSAGE" >/dev/null &
	fi
	
	
	if [ -z "$FSTAB_MOUNT_DESKTOP_NO_ICON" ] || [ "$FSTAB_MOUNT_DESKTOP_NO_ICON" -ne "1" ] ; then
	    # remove link icon in $HOME/Desktop
	    
	    icon_name1="`/bin/echo $device_name_in_fstab | sed -e 's@/dev/@_dev_@'`"
	    icon_name2="`/bin/echo $mount_point_in_fstab | sed -e 's@/mnt/@_mnt_@' -e 's@/media/@_media_@'`"

	    for desktop_icon_name in "$DESKTOP_DIR$icon_name1" "$DESKTOP_DIR$icon_name2";
	    do
		# echo "desktop_icon_name:" "$desktop_icon_name"
		
		link_target="`/usr/bin/readlink -m $desktop_icon_name`"
		
		if [ "`/usr/bin/dirname $link_target`" = "/dev" ] ; then
		    test -L "$desktop_icon_name" && /bin/rm "$desktop_icon_name"
		elif [ "`/usr/bin/dirname $link_target`" = "/mnt" ] ; then
		    test -L "$desktop_icon_name" && /bin/rm "$desktop_icon_name"
		elif [ "`/usr/bin/dirname $link_target`" = "/media" ] ; then
		    test -L "$desktop_icon_name" && /bin/rm "$desktop_icon_name"
		fi
	    done
	    
	fi
	
	# error or warning and FSTAB_MOUNT_SAVE_LOG is set
	# save log file
	if [ "$ERROR" -eq "0" ] && [ "$WARNING" -eq "0" ] ; then
	    if [ -z "$FSTAB_MOUNT_SAVE_LOG" ] ; then
		# LOG_FILE="$FSTAB_MOUNT_DIR/umount.log.$$"
		/bin/mv -f "$LOG_FILE" "$FSTAB_MOUNT_DIR/umount.log"
	    fi
	fi
	
    else
	# cannot umount
	
	ERROR=1
	WARNING=0
	
	fstab_beep_ng
	
	ERROR_MESSAGE_UMOUNT_NG=$"You can NOT umount $device_name_in_title."
	
	/bin/echo "$ERROR_MESSAGE_UMOUNT_NG" >&2
	
	/bin/cat "$LOG_FILE" >&2
	ERROR_MESSAGE_IN_LOG_FILE=`/bin/cat "$LOG_FILE"`

	get_mount_point_from_mtab_with_device_name
	get_umount_device_from_mtab_with_mount_point
	
	if [ "$number_of_mount_point" -ne "0" ] ; then
	    fstab_beep_ng
	    sleep 1
	    MESSAGE_DONT_EJECT=$"\nWarning: $device_name_in_fstab is STILL MOUNTED in $other_mount_point."
	    /bin/echo -e "$MESSAGE_DONT_EJECT"
	    WARNING=1
	fi
	if [ "$number_of_mounted_device" -ne "0" ] ; then
	    if [ "$number_of_mount_point" -eq "0" ] ; then
		fstab_beep_ng
		sleep 1
	    fi
	    MESSAGE_MOUNT_POINT=$"\nWarning: mount point $mount_point_in_fstab is STILL USED by $other_mounted_device.\n"
	    /bin/echo -e "$MESSAGE_MOUNT_POINT"
	    WARNING=1
	fi
	
	ZENITY_ERROR_MESSAGE_TEXT="$ERROR_MESSAGE_UMOUNT_NG\n\n$ERROR_MESSAGE_IN_LOG_FILE"
	
	if [ -n "$MESSAGE_DONT_EJECT" ] ; then
	    ZENITY_ERROR_MESSAGE_TEXT="$ZENITY_ERROR_MESSAGE_TEXT\n$MESSAGE_DONT_EJECT"
	fi
	
	if [ -n "$MESSAGE_MOUNT_POINT" ] ; then
	    ZENITY_ERROR_MESSAGE_TEXT="$ZENITY_ERROR_MESSAGE_TEXT\n$MESSAGE_MOUNT_POINT"
	fi
	
	$zenity_command --error --title="$ERROR_MESSAGE_UMOUNT_NG" --text="$ZENITY_ERROR_MESSAGE_TEXT" >/dev/null &
	
	if [ -z "$FSTAB_MOUNT_SAVE_LOG" ] ; then
	    # LOG_FILE="$FSTAB_MOUNT_DIR/umount.log.$$"
	    /bin/mv -f "$LOG_FILE" "$FSTAB_MOUNT_DIR/umount.log"
	fi
	
    fi &
    
    while ( killall -0 umount 2>/dev/null ) ;
    do
	/bin/sleep 1
	/bin/echo ""
    done 2>/dev/null | $zenity_command --progress --pulsate --auto-close --title="$ZENITY_WAIT_TITLE" --text="$ZENITY_WAIT_MESSAGE" >/dev/null
    
    wait
    
    exit
else
    ERROR=1

    ERROR_MESSAGE_CANNOT_UMOUNT=$"You can NOT umount $device_name ($1)."
    ERROR_MESSAGE_IN_LOG_FILE="`/bin/cat $LOG_FILE`"
    MESSAGE_PLEASE_CHECK=$"Please check /etc/fstab."

    LINE_NUMBER_OF_LOG_FILE=`wc -l "$LOG_FILE" | awk '{print $1}'`    
    /bin/umount "$umount_name" >>"$LOG_FILE" 2>&1

    LINE_NUMBER_OF_LOG_FILE_NEW=`wc -l "$LOG_FILE" | awk '{print $1}'`
    LINES=$((LINE_NUMBER_OF_LOG_FILE_NEW-LINE_NUMBER_OF_LOG_FILE))
    
    if [ $LINES -gt 0 ] ; then
	/usr/bin/tail -n $LINES $LOG_FILE >&2
    fi

    get_mount_point_from_mtab_with_device_name
    get_umount_device_from_mtab_with_mount_point
    
    ###################################
    # partition check
    # device name does not have number.
    # example : /dev/hda
    # check /dev/hda1
    
    if [ "`/bin/echo $1 | /bin/grep -c [0-9]$`" -eq "0" ] ; then
	if [ -e "$1"1 ] ; then
	    HINT_TO_LOG=$"${1}1 is exists. I Think $1 has partition number.\nPlease check ${1}*."
	    HINT_TO_ZENITY=$"$1 will have one or more partitions like ${1}1.\nPlease check.\nexample: /bin/ls ${1}*"
	fi
    fi
    
    # mounted
    if [ "$number_of_mount_point" -ne "0" ] || [ "$number_of_mounted_device" -ne "0" ] ; then
	if [ -n "$user_in_fstab" ] ; then
	    HINT_TO_LOG=$"$1 ($device_name_for_LABEL_UUID_check) was mounted by $WHO_MOUNT.\nroot and $WHO_MOUNT only can umount this device."
	    HINT_TO_ZENITY="$HINT_TO_LOG"
	fi
	
	if [ -n "$owner_in_fstab" ] ; then
	    HINT_TO_LOG=$"HINT:You need to be a owner of $device_name_for_LABEL_UUID_check.\nCurrent owner is $OWNER_OF_DEVICE.\n\nIf PAM sets device's owner, you need to login again after all users (including you) logout."
	    HINT_TO_ZENITY="$HINT_TO_LOG"
	fi
	
	if [ -n "$group_in_fstab" ] ; then
	    HINT_TO_LOG=$"HINT:You need to be a member of group:$GROUP_OF_DEVICE."
	    HINT_TO_ZENITY="$HINT_TO_LOG"
	fi
    fi

    # device name and mount point were not found in /etc/fstab
    # gnome-umount and pumount
    if [ -z "$device_name_in_fstab" ] && [ -z "$mount_point_in_fstab" ] ; then
	
	function get_mount_point_from_mtab_with_device_name_not_in_fstab {
	    other_mount_point=`/usr/bin/awk "\\$1 ~ \"^\$device_name$\" {print \\$2}" /etc/mtab`
	    
	    number_of_mount_point=0
	    MOUNTED=0

	    if [ -n "$other_mount_point" ] ; then
		number_of_mount_point=1
		MOUNTED=1
		# echo "other_mount_point:" "$other_mount_point"
	    else
		other_mount_point=`/usr/bin/awk "\\$1 ~ \"^\$umount_name$\" {print \\$2}" /etc/mtab`
		if [ -n "$other_mount_point" ] ; then
		    number_of_mount_point=1
		    MOUNTED=1
		    # echo "other_mount_point:" "$other_mount_point"
		fi
	    fi
	}
	
	function get_umount_device_from_mtab_with_mount_point_not_in_fstab {
	    other_mounted_device=`/usr/bin/awk "\\$2 ~ \"^\$mount_point$\" {print \\$1}" /etc/mtab`
	    
	    number_of_mounted_device=0

	    if [ "$number_of_mount_point" -eq "0" ] ; then
		MOUNTED=0
	    fi

	    if [ -n "$other_mounted_device" ] ; then
		number_of_mounted_device=1
		MOUNTED=1
		# echo "other_umounted_device:" "$other_mounted_device"
	    fi
	}

	function mount_check {
	    get_mount_point_from_mtab_with_device_name_not_in_fstab
	    get_umount_device_from_mtab_with_mount_point_not_in_fstab
	}
	
	device_name_tmp=`/usr/bin/readlink -m "$device_name"`
	if [ -e "$device_name_tmp" ] ; then
	    device_name="$device_name_tmp"
	fi

	MOUNTED=0
	mount_check
	
	device_name="`/bin/echo $device_name |sed -e s/LABEL=//`"
	# echo "device_name:" "$device_name"

	# echo "MOUNTED:" "$MOUNTED"
	# echo "number_of_mount_point:" "$number_of_mount_point"
	# echo "number_of_mounted_device:" "$number_of_mounted_device"
	
	# echo "before gnome-umount and pumount"
	if [ "$MOUNTED" -eq "1" ] ; then
	    
	    LINE_NUMBER_OF_LOG_FILE=`wc -l "$LOG_FILE" | awk '{print $1}'`
	    
	    # echo "before gnome-umount"
	    if [ -z "$FSTAB_MOUNT_WITHOUT_GNOME_MOUNT" ] && [ -x "/usr/bin/gnome-umount" ] ; then
		MESSAGE_BEFORE_GNOME_UMOUNT=$"I try gnome-umount."
		MESSAGE_FOR_GNOME_UMOUNT="\n$MESSAGE_BEFORE_GNOME_UMOUNT /usr/bin/gnome-umount -t -d $device_name"
		/bin/echo -e "$MESSAGE_FOR_GNOME_UMOUNT"
		/bin/echo -e "$MESSAGE_FOR_GNOME_UMOUNT" >> "$LOG_FILE" 2>&1
		
		MESSAGE_FROM_GNOME_UMOUNT="`/usr/bin/gnome-umount -t -d $device_name`"
		/bin/echo -e "$MESSAGE_FROM_GNOME_UMOUNT"
		/bin/echo -e "$MESSAGE_FROM_GNOME_UMOUNT" >> "$LOG_FILE" 2>&1
		
		mount_check

		if [ "$MOUNTED" -eq "1" ] ; then
		    if [ "$device_name" != "$1" ] ; then

			# link to device -> gnome-umount linkfile : OK
			# link to other  -> gnome-umount linkfile : NG , gnome-umount stop and do not finish.
			device_name_tmp=`/usr/bin/readlink -m "$1"`
			if [ -e "$device_name_tmp" ] ; then
			    device_name_new="$device_name_tmp"
			fi

			MESSAGE_FOR_GNOME_UMOUNT2="\n$MESSAGE_BEFORE_GNOME_UMOUNT /usr/bin/gnome-umount -t -d $device_name_new"
			/bin/echo -e "$MESSAGE_FOR_GNOME_UMOUNT2"
			/bin/echo -e "$MESSAGE_FOR_GNOME_UMOUNT2" >> "$LOG_FILE" 2>&1
			
			MESSAGE_FROM_GNOME_UMOUNT2="`/usr/bin/gnome-umount -t -d $device_name_new`"
			/bin/echo -e "$MESSAGE_FROM_GNOME_UMOUNT2"
			/bin/echo -e "$MESSAGE_FROM_GNOME_UMOUNT2" >> "$LOG_FILE" 2>&1
			
			mount_check
		    fi
		fi
	    fi
	    
	    if [ "$MOUNTED" -eq "1" ] ; then
		# echo "before pumount"
		if [ -z "$FSTAB_MOUNT_WITHOUT_PMOUNT" ] && [ -x "/usr/bin/pumount" ] ; then
		    MESSAGE_BEFORE_PUMOUNT=$"I try pumount."
		    MESSAGE_FOR_PUMOUNT="\n$MESSAGE_BEFORE_PUMOUNT /usr/bin/pumount -d $device_name"
		    /bin/echo -e "$MESSAGE_FOR_PUMOUNT"
		    /bin/echo -e "$MESSAGE_FOR_PUMOUNT" >> "$LOG_FILE" 2>&1
		    
		    MESSAGE_FROM_PUMOUNT=`/usr/bin/pumount -d $device_name 2>&1 | grep -e "^resolved" -e "/bin/umount"`
		    
		    /bin/echo -e "$MESSAGE_FROM_PUMOUNT"
		    /bin/echo -e "$MESSAGE_FROM_PUMOUNT" >> "$LOG_FILE" 2>&1

		    mount_check
		    if [ "$MOUNTED" -eq "0" ] ; then
			UMOUNT_METHOD="pumount"
		    fi
		    if [ "$MOUNTED" -eq "1" ] ; then
			if [ "$device_name" != "$1" ] ; then
			    MESSAGE_FOR_PUMOUNT2="\n$MESSAGE_BEFORE_PUMOUNT /usr/bin/pumount -d $1"
			    /bin/echo -e "$MESSAGE_FOR_PUMOUNT2"
			    /bin/echo -e "$MESSAGE_FOR_PUMOUNT2" >> "$LOG_FILE" 2>&1
			    
			    MESSAGE_FROM_PUMOUNT2=`/usr/bin/pumount -d $1 2>&1 | grep -e "^resolved" -e "/bin/umount"`
			    
			    /bin/echo -e "$MESSAGE_FROM_PUMOUNT2"
			    /bin/echo -e "$MESSAGE_FROM_PUMOUNT2" >> "$LOG_FILE" 2>&1
			    
			    mount_check
			    if [ "$MOUNTED" -eq "0" ] ; then
				UMOUNT_METHOD="pumount"
			    fi
			fi
		    fi
		fi
	    else
		# gnome-umount ok
		UMOUNT_METHOD="gnome-umount"
	    fi
	    sleep 4

	    LINE_NUMBER_OF_LOG_FILE_NEW=`wc -l "$LOG_FILE" | awk '{print $1}'`
	    
	    LINES=$((LINE_NUMBER_OF_LOG_FILE_NEW-LINE_NUMBER_OF_LOG_FILE))
	    
	    if [ $LINES -gt 0 ] ; then
		# HINT_TO_LOG="$HINT_TO_LOG\n`/usr/bin/tail -n $LINES $LOG_FILE`"
		HINT_TO_ZENITY="$HINT_TO_LOG\n`/usr/bin/tail -n $LINES $LOG_FILE`"
		ERROR_MESSAGE_IN_LOG_FILE="`/bin/cat $LOG_FILE`"
	    fi
	    
	    # echo "MOUNTED:" "$MOUNTED"
	    # echo "number_of_mount_point:" "$number_of_mount_point"
	    # echo "number_of_mounted_device:" "$number_of_mounted_device"
	fi
    fi

    if [ "$number_of_mount_point" -ne "0" ] ; then
	fstab_beep_ng
	sleep 1
	MESSAGE_DONT_EJECT=$"\nWarning: $device_name_in_fstab is STILL MOUNTED in $other_mount_point."
	WARNING=1

	# /bin/echo -e "$MESSAGE_DONT_EJECT" >&2
	HINT_TO_LOG="$HINT_TO_LOG$MESSAGE_DONT_EJECT"
	HINT_TO_ZENITY="$HINT_TO_ZENITY$MESSAGE_DONT_EJECT"
    else
	if [ -n "$device_name_in_fstab" ] ; then
	    MESSAGE_PLEASE_CHECK=""
	    
	    fstab_beep
	    sleep 1
	    MESSAGE_NOT_MOUNTED_DEVICE_NAME=$"$device_name_in_fstab is not mounted (according to mtab)"
	    # /bin/echo -e "$MESSAGE_NOT_MOUNTED_DEVICE_NAME" >&2
	    WARNING=1
	    
	    HINT_TO_LOG="$HINT_TO_LOG$MESSAGE_NOT_MOUNTED_DEVICE_NAME"
	    HINT_TO_ZENITY="$HINT_TO_ZENITY$MESSAGE_NOT_MOUNTED_DEVICE_NAME"
	fi
    fi

    if [ "$number_of_mounted_device" -ne "0" ] ; then
	if [ "$number_of_mount_point" -eq "0" ] ; then
	    fstab_beep_ng
	    sleep 1
	fi
	MESSAGE_MOUNT_POINT=$"\nWarning: mount point $mount_point_in_fstab is STILL USED by $other_mounted_device.\n"
	WARNING=1

	# /bin/echo -e "$MESSAGE_MOUNT_POINT" >&2
	HINT_TO_LOG="$HINT_TO_LOG$MESSAGE_MOUNT_POINT"
	HINT_TO_ZENITY="$HINT_TO_ZENITY$MESSAGE_MOUNT_POINT"
    else
	if [ -n "$device_name_in_fstab" ] ; then
	    MESSAGE_PLEASE_CHECK=""
	    
	    fstab_beep
	    sleep 1
	    MESSAGE_NOT_MOUNTED_MOUNT_POINT=$"\n$mount_point_in_fstab is not mounted (according to mtab)"
	    WARNING=1
	    
	    # /bin/echo -e "$MESSAGE_NOT_MOUNTED_MOUNT_POINT" >&2
	    HINT_TO_LOG="$HINT_TO_LOG$MESSAGE_NOT_MOUNTED_MOUNT_POINT"
	    HINT_TO_ZENITY="$HINT_TO_ZENITY$MESSAGE_NOT_MOUNTED_MOUNT_POINT"
	fi
    fi


    if [ -z "$device_name_in_fstab" ] ; then
	# gnome-umount pumount ok
	if [ "$number_of_mounted_device" -eq "0" ] || [ "$number_of_mount_point" -eq "0" ] ; then
	    fstab_beep
	    sleep 1
	    
	    get_zenity_window_width
	    
	    if [ -n "$UMOUNT_METHOD" ] ; then
		MESSAGE_UMOUNT_WITH_OTHER_METHOD_OK=$"$UMOUNT_METHOD $umount_name has been finished."
		$zenity_command --width="$ZENITY_WINDOW_WIDTH" --info --text="$MESSAGE_UMOUNT_WITH_OTHER_METHOD_OK\n\n$ERROR_MESSAGE_IN_LOG_FILE\n\n$HINT_TO_LOG" >/dev/null &
		
		/bin/echo -e "$MESSAGE_UMOUNT_WITH_OTHER_METHOD_OK\n\n$HINT_TO_LOG" >> "$LOG_FILE" 2>&1
		/bin/echo -e "$MESSAGE_UMOUNT_WITH_OTHER_METHOD_OK\n\n$HINT_TO_LOG" >&2
	    else
		/bin/echo -e "$ERROR_MESSAGE_CANNOT_UMOUNT"
		ERROR_MESSAGE_IN_LOG_FILE="`/bin/cat $LOG_FILE`"
		$zenity_command --width="$ZENITY_WINDOW_WIDTH" --error --title="$ERROR_MESSAGE_CANNOT_UMOUNT" --text="$ERROR_MESSAGE_IN_LOG_FILE"
	    fi
	    
	    /bin/df -hT >> "$LOG_FILE" 2>&1

	    # error or warning and FSTAB_MOUNT_SAVE_LOG is set
	    # save log file
	    if [ "$ERROR" -eq "1" ] ; then
		if [ -n "$FSTAB_MOUNT_SAVE_LOG" ] ; then
		    exit
		fi
	    fi

	    /bin/mv -f "$LOG_FILE" "$FSTAB_MOUNT_DIR/umount.log"

	    exit
	fi
    fi
    
    # output messages
    
    if [ -n "$HINT_TO_LOG" ] ; then
	get_zenity_window_width
	$zenity_command --width="$ZENITY_WINDOW_WIDTH" --error --title="$ERROR_MESSAGE_CANNOT_UMOUNT" --text="$ERROR_MESSAGE_CANNOT_UMOUNT\n$MESSAGE_PLEASE_CHECK\n\n$HINT_TO_ZENITY" >/dev/null &
	
	/bin/echo -e "$ERROR_MESSAGE_CANNOT_UMOUNT\n$MESSAGE_PLEASE_CHECK\n\n$HINT_TO_LOG" >> "$LOG_FILE" 2>&1
	/bin/echo -e "$ERROR_MESSAGE_CANNOT_UMOUNT\n$MESSAGE_PLEASE_CHECK\n\n$ERROR_MESSAGE_IN_LOG_FILE\n\n$HINT_TO_LOG" >&2

	
    else
	get_zenity_window_width
	$zenity_command --width="$ZENITY_WINDOW_WIDTH" --error --title="$ERROR_MESSAGE_CANNOT_UMOUNT" --text="$ERROR_MESSAGE_CANNOT_UMOUNT\n$MESSAGE_PLEASE_CHECK" >/dev/null &
	
	/bin/echo -e "$ERROR_MESSAGE_CANNOT_UMOUNT\n$MESSAGE_PLEASE_CHECK" >> "$LOG_FILE" 2>&1
	/bin/echo -e "$ERROR_MESSAGE_CANNOT_UMOUNT\n$MESSAGE_PLEASE_CHECK" >&2
    fi


    /bin/df -hT >> "$LOG_FILE" 2>&1

    fstab_beep_ng
fi

# error or warning and FSTAB_MOUNT_SAVE_LOG is set
# save log file
if [ "$ERROR" -eq "1" ] ; then
    if [ -n "$FSTAB_MOUNT_SAVE_LOG" ] ; then
	exit
    fi
fi

# LOG_FILE="$FSTAB_MOUNT_DIR/umount.log.$$"
/bin/mv -f "$LOG_FILE" "$FSTAB_MOUNT_DIR/umount.log"

# EOF

