#!/bin/sh
#(c) Copyright Nov 2007 Barry Kauler www.puppylinux.com
#2007 Lesser GPL licence v2 (http://www.fsf.org/licensing/licenses/lgpl.html)
#a complete rewrite for Puppy 'Dingo', Nov 27 2007, Dec 1,5 2007.
#v3.95 4jan2007: -x option for rox.
#v3.96 17jan2008: full install, mounted '/' partition was not shown.
#v3.98 13mar2008: switch probepart and mut2 engines.
#v3.99 7apr2008: fix zombie process prevents partition unmount.
#v4.01 7may2008: allow /sbin/pup_ueventd to kill pmount and cause it to restart.
#v4.01 10may2008: using 'probedisk2' script.
#v4.01 10may2008: redesign of xml generation, much more efficient.
#v4.01 11may2008: passed params sd,sr,mm,fd when called from pup_dock_xx tray applets.
#v4.01 13may2008: introduce 'preferences' button, add toggle tabbed-normal view.
#v4.01 17may2008: make sure top tab stays on top when mount/unmount.
#v4.01 18may2008: auto launch of pmount when a drive plugged is now confgurable, see prefs.
#v4.02 31may2008: refresh desktop icons when mount/unmount (see pup_eventd).
#v404 11jul08: unipup, disable unmount button correctly.
#v407 mut bugfix.
#v408 bugfix, a drive with no valid partitions crashed pmount.
#v409 jesse: bugfix for floppy detection when using mut2 engine.
#v410 catch case no valid partitions/drvs in a category, remove that category.
#v411 added 'quiet' option for vfat, suppresses error msg when file attribs not preserved on copy.
#v412, no, do not exit if only a warning error msg.

#using ${$} which is pid of script...
MYPID=${$}

. /etc/rc.d/PUPSTATE #v3.96
PMOUNT="pmount" #name of this executable.
MINIFOLDERXPM='/usr/local/lib/X11/mini-icons/mini-filemgr.xpm'
. /etc/rc.d/functions4puppy4 #v4.02


yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "Puppy - Монтирование дисков

Пожалуйста, ждите, проверка устройств..." &
X1PID=$!

#v4.01 passed param, choose which tab to be "on top"...
TOPTAB=''
if [ $1 ];then
 TOPTAB="$1" #also allow full tab names usbdrv,optical,drive,card,floppy to be passed.
 [ "$1" = "any" ] && TOPTAB="drive" #see pup_eventd
 #pup_eventd calls pmount with just two letters...
 [ "$1" = "sd" ] && TOPTAB="usbdrv"
 [ "$1" = "sr" ] && TOPTAB="optical"
 [ "$1" = "mm" ] && TOPTAB="card"
 [ "$1" = "fd" ] && TOPTAB="floppy"
fi

#v3.98... 
HAVEMUT2='no'
[ -f /usr/sbin/mut ] && [ "`file /usr/sbin/mut | grep 'ELF 32-bit LSB executable'`" != "" ] && HAVEMUT2='yes'
PMOUNTENGINE='default'
PROBEPART="probepart"
PROBEDISK="probedisk2" #v4.01
ENGINEFLAG='false'
if [ "$HAVEMUT2" = "yes" ];then
 [ -f /root/.pmountengine ] && PMOUNTENGINE="`cat /root/.pmountengine`"
 if [ "$PMOUNTENGINE" = "mut2" ];then
  PROBEPART='mut --noserv probepart' #v407
  PROBEDISK='mut --noserv probedisk2' #v407
  ENGINEFLAG='true'
 fi
fi

#v4.01 toggle tabbed interface...
SINGLEFLAG="false" #default tabbed interface.
[ -f /root/.pmountsingle ] && SINGLEFLAG="`cat /root/.pmountsingle`"

#v4.02 quit immediately after choosing to mount/umount a partition... v404 change to false
PMOUNTQUIT="false" #"true" v404 change to false
[ -f /root/.pmountquit ] && PMOUNTQUIT="`cat /root/.pmountquit`"
#but if starting pmount from menu or 'drives' icon, do not quit...
[ "$1" = "any" -o "$1" = "" ] && PMOUNTQUIT="false"

#v3.96 'mount' misreports which partition mounted on '/'...
ROOTDEV2=""
[ "$PUPMODE" = "2" ] && ROOTDEV2="`df | grep ' /$' | grep '^/dev/' | cut -f 1 -d ' '`"

DISKINFO="`$PROBEDISK | sort -k 2 --field-separator='|'`" #v4.01
PARTSINFO="`$PROBEPART -k | grep -v 'none' | tr ' ' '_' | tr '\t' '_' | cut -f 1-3 -d '|'`" #v3.98 fix for mut2.

#add floppy drive, if any (note, zip detected by probedisk/probepart)...
if [ "$PMOUNTENGINE" != "mut2" ];then #v409
 if [ -e /sys/block/fd0 ];then
  DISKINFO="/dev/fd0|floppy|floppy disk drive
$DISKINFO"
  PARTSINFO="/dev/fd0|vfat|1440
$PARTSINFO"
 fi
fi
#v409 mut2 lets us know if there are any floppy drives.
if [ "$PMOUNTENGINE" = "mut2" ];then
  FINDFLOPPY="`echo \"$DISKINFO\" | grep /dev/fd | cut -f 1 -d '|' | tr '\n' ' '`";
  echo "FINDFLOPPY $FINDFLOPPY"
  for FDDRIVE in $FINDFLOPPY
  do
    PARTSINFO="$FDDRIVE|vfat|1440
$PARTSINFO"
  done
fi

#v4.01 reoganise so that a particular tab is on top...
if [ "$TOPTAB" != "" ];then
 toptabPATTERN='|'"$TOPTAB"'|'
 TOPDISKS="`echo "$DISKINFO" | grep "$toptabPATTERN"`"
 if [ "$TOPDISKS" != "" ];then
  DISKINFO="${TOPDISKS}
`echo "$DISKINFO" | grep -v "$toptabPATTERN"`"
 fi
fi

#v410 catch case no valid partitions/drvs in a category, remove that category...
echo -n "" > /tmp/pmount_cat_test1
for ONEDISK in `echo "$DISKINFO" | cut -f 1,2 -d '|' | tr '\n' ' '`
do
 ONEDRVNAME="`echo -n "$ONEDISK" | cut -f 1 -d '|'`"
 ONEDRVCAT="`echo -n "$ONEDISK" | cut -f 2 -d '|'`"
 if [ "`echo "$PARTSINFO" | grep "$ONEDRVNAME" | grep -v '|none|'`" != "" ];then
  echo "$ONEDRVCAT" >> /tmp/pmount_cat_test1
 fi
done
for ONECAT in `echo "$DISKINFO" | cut -f 2 -d '|' | sort -u | tr '\n' ' '`
do
 if [ "`grep "$ONECAT" /tmp/pmount_cat_test1`" = "" ];then
  diPATTERN="|${ONECAT}|"
  NEWDISKINFO="`echo "$DISKINFO" | grep -v "$diPATTERN"`"
  DISKINFO="$NEWDISKINFO"
 fi
done

#v4.01 find the tabs...
#old probedisk has: cdrom, disk, floppy, Direct-Access.
#probedisk2 has: drive, optical, usbdrv, card, floppy
TABLIST="`echo -n "$DISKINFO" | cut -f 2 -d '|' | uniq | tr '\n' '|' | sed -e 's/|$//'`"
CURRENTTAB=''

#v408 v410 moved up...
VALIDPARTS="`echo "$PARTSINFO" | grep -E 'vfat|msdos|ntfs|minix|ext2|ext3|ext4|reiser|xfs|iso9660'`"

#get actual top tab...
TOPACTUAL="`echo "$TABLIST" | cut -f 1 -d '|'`"

#v4.01 PARTSINFO has to be sorted in same order as the categories in DISKINFO...
PARTSGUI=""
FRAMEFLAG="off"
DEV2TAB=""
OLDDISKNAME=''
for ONEDISK in `echo "$DISKINFO" | cut -f 1 -d '|' | tr '\n' ' '`
do

 #v408 bug fix, a drive with no valid partitions, skip it...
 [ "`echo "$VALIDPARTS" | grep "$ONEDISK"`" = "" ] && continue
 
 ONEDISKNAME="`echo "$ONEDISK" | cut -f 3 -d '/'`"
 DSKPATTERN="^${ONEDISK}|"
 #ONEDISKDESCR="`echo "$DISKINFO" | grep "$DSKPATTERN" | cut -f 3 -d '|' | tr '<' '_' | tr '>' '_'`"
 ONEDISKDESCR="`echo "$DISKINFO" | grep "$DSKPATTERN" | cut -f 3 -d '|' | tr '\-' '@' | sed -e 's/[^a-zA-Z0-9 @_]//g' | tr '@' '-'`"
 xDSKPATTERN="^${ONEDISK}"
 cutPARTSINFO="`echo "$PARTSINFO" | grep "$xDSKPATTERN" | tr '\n' ' '`"
 [ "$cutPARTSINFO" = "" ] && continue #fix for superfloppy-drv with unknown f.s.
 [ "$cutPARTSINFO" = " " ] && continue #v408 er, there will be a single space.
 #group one or more frames in same tab...
 ONECATEGORY="`echo "$DISKINFO" | grep "$DSKPATTERN" | cut -f 2 -d '|'`" #drive,optical,usbdrv,card,floppy
 if [ "$CURRENTTAB" = "" ];then
  PARTSGUI="${PARTSGUI}<vbox>"
  TABFLAG="on"
 else
  [ "$CURRENTTAB" != "$ONECATEGORY" ] && PARTSGUI="${PARTSGUI}</vbox><vbox>"
 fi
 CURRENTTAB="$ONECATEGORY"
 PARTSGUI="${PARTSGUI}<frame ${ONEDISKDESCR}>"
###############################################################################
for ONEPART in $cutPARTSINFO
do
 ONEDEV="`echo -n "$ONEPART" | cut -f 1 -d '|'`"
 DEVNAME="`echo -n "$ONEDEV" | cut -f 3 -d '/'`"
 DEV2TAB="${DEV2TAB} ${DEVNAME}|${CURRENTTAB}" #remember which tab a partition is in.
 ONEFS="`echo -n "$ONEPART" | cut -f 2 -d '|'`"
 [ "$ONEFS" = "swap" ] && continue
 #DRIVEXPM='/usr/local/lib/X11/mini-icons/mini-hdisk.xpm'

 ONESIZEK=`echo -n "$ONEPART" | cut -f 3 -d '|'`
 if [ $ONESIZEK -gt 1048576 ];then #1024*1024
  ONESIZE="`dc $ONESIZEK 1048576 \/ p`"
  ONESIZE="`printf "%.1f" $ONESIZE`Гб"
 else
  if [ $ONESIZEK -gt 99 ];then
   ONESIZE="`expr $ONESIZEK \/ 1024`Mб"
  else
   ONESIZE="`dc $ONESIZEK 1024 \/ p`"
   ONESIZE="`printf "%.1f" $ONESIZE`Mб"
  fi
 fi
 [ "$ONESIZE" = "0.0M" ] && ONESIZE=""
 DEVPATTERN="^${ONEDEV} "
 ONEMNTPT="`mount | grep "$DEVPATTERN" | cut -f 3 -d ' '`"
 [ "$ROOTDEV2" != "" ] && [ "$ROOTDEV2" = "$ONEDEV" ] && ONEMNTPT='/' #v3.96
 if [ "$ONEMNTPT" = "" ];then #not mounted.
  #[ "$ONEFS" = "iso9660" ] && DRIVEXPM='/usr/local/lib/X11/mini-icons/mini-cd.xpm'
  #<input file>${DRIVEXPM}</input>
  PARTSGUI="${PARTSGUI}<hbox><text><label>${DEVNAME} ${ONEFS} ${ONESIZE}</label></text><button><label>МОНТИРОВАТЬ</label><action type=\"exit\">DOMOUNT_${ONEDEV}_${ONEFS}</action></button></hbox>"
 else
  #DRIVEXPM='/usr/local/lib/X11/mini-icons/mini-hdisk-green.xpm'
  #[ "$ONEFS" = "iso9660" ] && DRIVEXPM='/usr/local/lib/X11/mini-icons/mini-cd-green.xpm'
  FREEK=`df -k | tr -s ' ' | grep "$DEVPATTERN" | cut -f 4 -d ' '`
  if [ $FREEK -gt 1048576 ];then #1024*1024
   ONEFREE="`dc $FREEK 1048576 \/ p`"
   ONEFREE="`printf "%.1f" $ONEFREE`Гб"
  else
   if [ $FREEK -gt 99 ];then
    ONEFREE="`expr $FREEK \/ 1024`Mб"
   else
    ONEFREE="`dc $FREEK 1024 \/ p`"
    ONEFREE="`printf "%.1f" $ONEFREE`Гб"
   fi
  fi
  FREEINSERT="<text><label>Свободно: ${ONEFREE}</label></text>"
  [ "$ONEFREE" = "0.0M" ] && FREEINSERT=""
  #in some cases prevent unmounting...
  INVISBUT=""
  [ "`echo -n "$ONEMNTPT" | grep '^/initrd'`" -o "$ONEMNTPT" = "/" ] && INVISBUT='<visible>disabled</visible>'
  #v404 unipup, cannot unmount anything mntd in /.mnt...
  case $PUPMODE in
  16|24|17|25)
   [ "`echo -n "$ONEMNTPT" | grep '^/\.mnt'`" ] && INVISBUT='<visible>disabled</visible>'
   #usr_xxx.sfs was not copied to ram, still on partition...
   [ "`losetup | grep -o ' /.*/usr_.*\.sfs' | cut -f 1-3 -d '/' | cut -f 2 -d ' '`" = "$ONEMNTPT" ] && INVISBUT='<visible>disabled</visible>'
  ;;
  esac
  
  #if 'home' partition, substitute /mnt/home...
  if [ -L /mnt/home -a "`echo "$ONEMNTPT" | grep '/initrd/'`" != "" ];then
   HOMELINK="`readlink /mnt/home`"
   [ "$HOMELINK" = "$ONEMNTPT" ] && ONEMNTPT="/mnt/home"
  fi
  
  #<input file>${DRIVEXPM}</input>
  PARTSGUI="${PARTSGUI}<hbox><button><input file>${MINIFOLDERXPM}</input><action>rox -d ${ONEMNTPT} &</action></button><text><label>${DEVNAME} ${ONEFS} ${ONESIZE}</label></text>${FREEINSERT}<button><label>РАЗМОНТИРОВ.</label>${INVISBUT}<action type=\"exit\">UNMOUNT_${ONEDEV}_${ONEFS}_${ONEMNTPT}</action></button></hbox>"
 fi
done
########################################################################
 PARTSGUI="${PARTSGUI}</frame>"
 OLDDISKNAME="$ONEDISKNAME"
done


if [ "$TABFLAG" = "on" ];then #v4.01
 PARTSGUI="${PARTSGUI}</vbox>"
fi

#if [ "$HAVEMUT2" = "yes" ];then
 PREFSBUTTON="
   <button><label>Параметры</label>
    <action type=\"exit\">SETPREFS</action>
   </button>"
#fi

NOTEBOOKHEAD=""
NOTEBOOKTAIL=""
if [ "$SINGLEFLAG" = "false" ];then #default
 NOTEBOOKHEAD="<notebook labels=\"${TABLIST}\">"
 NOTEBOOKTAIL="</notebook>"
fi

export PMOUNTGUI="
<window title=\"Puppy - Монтирование дисков\" icon-name=\"gtk-harddisk\">
 <vbox>
  <text use-markup=\"true\">
  <label>\"<b>НЕ ОТКЛЮЧАЙТЕ СМОНТИРОВАННЫЕ УСТРОЙСТВА</b>\"</label></text>

  ${NOTEBOOKHEAD}
  ${PARTSGUI}
  ${NOTEBOOKTAIL}

  <hbox>
   ${PREFSBUTTON}
   <button><input file stock=\"gtk-refresh\"></input><label>ОБНОВИТЬ</label>
    <action type=\"exit\">REFRESH</action>
   </button>
   <button><input file stock=\"gtk-quit\"></input><label>ВЫХОД</label></button>
  </hbox>
 </vbox>
</window>"

echo "$PMOUNTGUI" > /tmp/pmountdlg.txt_${MYPID}

kill $X1PID

#RETPARAMS="`gtkdialog3 --file=/tmp/pmountdlg.txt_${MYPID} --center`"

#v4.01...
[ ! -e /tmp/gtkdialog_pmount ] && ln -s /usr/sbin/gtkdialog3 /tmp/gtkdialog_pmount
/tmp/gtkdialog_pmount --file=/tmp/pmountdlg.txt_${MYPID} --center >/tmp/pmountdlg_${MYPID} 2>/tmp/pmounterr
#[ -s /tmp/pmounterr ] && exit
#v412, no, do not exit if only a warning error msg...
if [ -s /tmp/pmounterr ];then
 [ "`grep -v 'WARNING' /tmp/pmounterr`" != "" ] && exit
fi
rm -f /tmp/pmountdlg.txt_${MYPID}
#if gui killed by pup_eventd, then file will be empty. restart pmount...
if [ ! -s /tmp/pmountdlg_${MYPID} ];then
 rm -f /tmp/pmountdlg_${MYPID}
 #exec /usr/sbin/$PMOUNT
 #...no, exit here, restart from pup_eventd as it can pass a param...
 exit
fi
RETPARAMS="`cat /tmp/pmountdlg_${MYPID}`"


#echo "$RETPARAMS"
#echo "DEV2TAB=$DEV2TAB" #TEST

eval "$RETPARAMS"

[ "$EXIT" = "REFRESH" ] && exec /usr/sbin/$PMOUNT $TOPACTUAL

if [ "$EXIT" = "SETPREFS" ];then
 DLGSETENG="
<wtitle>Pmount: Выбор параметров</wtitle>
 <vbox>
  <text><label>По умолчанию для определения дисков Puppy использует утилиты 'probedisk' и 'probepart'. Jesse Liley в качестве альтернативы разработал утилиту 'mut', которая выполняет множество функций, эквивалентных стандартными. Если Вы заметите, что стандартные утилиты определяют диски неправильно, переключитесь на 'mut' или проверьте исправность самих устройств.</label></text>
  <checkbox>
   <label>Использовать 'mut'</label>
   <default>${ENGINEFLAG}</default>
   <variable>NEWENGINEFLAG</variable>
  </checkbox>

  <text><label>Если у Вас небольшое количество дисков и разделов, удобнее просматривать их в одной вкладке. Установите 'флажок' для отображения информации в единственной вкладке или снимите для использования нескольких:</label></text>
  <checkbox>
   <label>Отображать на одной вкладке</label>
   <default>${SINGLEFLAG}</default>
   <variable>NEWSINGLEFLAG</variable>
  </checkbox>

  <text><label>При установленном 'флажке' окно Pmount закрывается немедленно по окончании операции монтирования/размонтирования. Если требуется, чтобы Pmount постоянно был включен, снимите 'флажок':</label></text>
  <checkbox>
   <label>Закрывать Pmount по окончании монтирования/размонтирования</label>
   <default>${PMOUNTQUIT}</default>
   <variable>NEWPMOUNTQUIT</variable>
  </checkbox>

  <hbox>
   <button ok></button>
   <button cancel></button>
  </hbox>
 </vbox>
"
 NEWENGINEFLAG=""
 RETPARAMS="`echo "$DLGSETENG" | gtkdialog2 --stdin`"
 eval "$RETPARAMS"
 if [ "$EXIT" = "OK" ];then
  [ "$NEWENGINEFLAG" = "true" ] && echo -n "mut2" > /root/.pmountengine
  [ "$NEWENGINEFLAG" = "false" ] && echo -n "default" > /root/.pmountengine
  echo "$NEWSINGLEFLAG" > /root/.pmountsingle
  echo "$NEWPMOUNTQUIT" > /root/.pmountquit
 fi
 exec /usr/sbin/$PMOUNT $TOPACTUAL
fi

if [ "`echo -n "$EXIT" | grep 'DOMOUNT'`" != "" ];then
 DODEV="`echo -n "$EXIT" | cut -f 2 -d '_'`"
 DEVNAME="`echo -n "$DODEV" | cut -f 3 -d '/'`"
 DOFS="`echo -n "$EXIT" | cut -f 3 -d '_'`"
 devPATTERN='^'"$DEVNAME"'|'
 TOPACTUAL="`echo "$DEV2TAB" | tr ' ' '\n' | grep "$devPATTERN" | cut -f 2 -d '|'`" #find top tab.
 mkdir -p /mnt/$DEVNAME
 case $DOFS in
  ntfs)
   #'mount' is a script that takes care of mounting ntfs...
   mount -t ntfs $DODEV /mnt/$DEVNAME
   RETVAL1=$?
   ;;
  vfat)
   mount -t vfat -o shortname=mixed,quiet $DODEV /mnt/$DEVNAME #v411 added quiet.
   RETVAL1=$?
   ;;
  *)
   mount -t $DOFS $DODEV /mnt/$DEVNAME
   RETVAL1=$?
   ;;
 esac
 if [ $RETVAL1 -eq 0 ];then
 
  #v4.02 now doing this in /bin/mount...
  ##v4.02 if there is a desktop icon (see pup_eventd), then refresh it...
  #DRVNAME="`echo -n "$DEVNAME" | cut -b 1-3`"
  ##special case, SD card /dev/mmcblk0p1...
  #[ "$DRVNAME" = "mmc" ] && DRVNAME="`echo -n "$DEVNAME" | sed -e 's/p[0-9]$//'`"
  #if [ -f /usr/local/bin/drive_${DRVNAME} ];then
  # icon_mounted_func $DRVNAME $TOPACTUAL #see functions4puppy4
  #fi
  
  if [ "$PMOUNTQUIT" = "false" ];then #v4.0.2
   #now restart pmount, but want rox window on top... 
   /usr/sbin/$PMOUNT $TOPACTUAL &
   NEWPID="$!"
   while [ ! -f /tmp/pmountdlg.txt_${NEWPID} ];do
    usleep 200000
   done
   usleep 100000
  fi
  #v3.95 -x option to rescan...
  exec rox -x /mnt/$DEVNAME -d /mnt/$DEVNAME #want this window on top.
 else
  xmessage -bg red -center -title "Pmount" "ОШИБКА: невозможно смонтировать $DEVNAME"
  exec /usr/sbin/$PMOUNT $TOPACTUAL
 fi 
fi

if [ "`echo -n "$EXIT" | grep 'UNMOUNT'`" != "" ];then
 DODEV="`echo -n "$EXIT" | cut -f 2 -d '_'`"
 DEVNAME="`echo -n "$DODEV" | cut -f 3 -d '/'`"
 DOFS="`echo -n "$EXIT" | cut -f 3 -d '_'`"
 MNTPT="`echo -n "$EXIT" | cut -f 4 -d '_'`"
 devPATTERN='^'"$DEVNAME"'|'
 TOPACTUAL="`echo "$DEV2TAB" | tr ' ' '\n' | grep "$devPATTERN" | cut -f 2 -d '|'`" #find top tab.
 rox -D $MNTPT
 sync
 umount $MNTPT ; umVAL=$?
 #v3.99 fix zombie process prevents partition unmount, invisible to fuser...
 if [ $umVAL -ne 0 ];then
  ZOMBIES="`ps -H -A | grep '<defunct>' | sed -e 's/  /|/g' | grep -v '|||' | cut -f 1 -d ' ' | tr '\n' ' '`"
  for ONEZOMBIE in $ZOMBIES
  do
   echo "Принудительное завершение зависшего родительского процесса $ONEZOMBIE"
   kill $ONEZOMBIE
  done
  umount $MNTPT ; umVAL=$?
 fi
 #v3.99 rare ocassion, partition got unmounted before umount runs above...
 umPATTERN="${MNTPT} "
 [ "`mount | grep "$umPATTERN"`" = "" ] && umVAL=0
 if [ $umVAL -ne 0 ];then
  EXTRAMSG0="`fuser -v -m $MNTPT`"  
  if [ "$EXTRAMSG0" = "" ];then
   xmessage -bg "#ff8080" -title "Puppy - Монтирование дисков: ОШИБКА" -center "СБОЙ! Если это сменный носитель - причина, скорее
всего, в его неправильном подключении. Попробуйте его
переподключить."
  else
   xmessage -bg "#ff00ff" -title "KILL, KILL..." -center -buttons "ПРИНУДИТЕЛЬНО ЗАВЕРШИТЬ":10,"ВЫХОД":20 "СБОЙ! Один или несколько процессов (программ) в
настоящее время используют раздел. Это:
$EXTRAMSG0

Если нажать кнопку \"ПРИНУДИТЕЛЬНО ЗАВЕРШИТЬ\", Puppy
попытается принудительно завершить работу программы.
Делайте это в самом крайнем случае. Сначала попытайтесь
закрыть все программы вручную, а не давить сразу кнопку
\"ПРИНУДИТЕЛЬНО ЗАВЕРШИТЬ\".
НАЖМИТЕ, ПОЖАЛУЙСТА, КНОПКУ \"ВЫХОД\"!"
   [ $? -eq 10 ] && fuser -k -m $MNTPT
  fi
 else
 
  #v4.02 have moved this to /bin/umount...
  ##v4.02 if there is a desktop icon (see pup_eventd), then refresh it...
  #DRVNAME="`echo -n "$DEVNAME" | cut -b 1-3`"
  ##special case, SD card /dev/mmcblk0p1...
  #[ "$DRVNAME" = "mmc" ] && DRVNAME="`echo -n "$DEVNAME" | sed -e 's/p[0-9]$//'`"
  #if [ -f /usr/local/bin/drive_${DRVNAME} ];then
  # #if any partitions still mounted, leave "MNTD" on icon...
  # drvPATTERN='^/dev/'"${DRVNAME}"
  # #"MNTD" text is intended as a reminder to user that drive needs to be unmounted,
  # #   but partitions in use by Puppy cannot be unmounted.
  # if [ "`mount | cut -f 1,3 -d ' ' | grep "$drvPATTERN" | grep -v ' /initrd/' | grep -v ' /$'`" = "" ];then
  #  if [ "`mount | cut -f 1,3 -d ' ' | grep "$drvPATTERN" | grep -E ' /initrd/| /$'`" != "" ];then
  #   #only a partition left mntd that is in use by puppy, change green->yellow...
  #   icon_mounted_func $DRVNAME $TOPACTUAL #see functions4puppy4
  #  else
  #   #redraw icon without "MNTD" text...
  #   icon_unmounted_func $DRVNAME $TOPACTUAL #see functions4puppy4
  #  fi
  # fi
  #fi
  
  [ "$DOFS" = "iso9660" ] && eject $DODEV
 fi
 [ "$PMOUNTQUIT" = "false" ] && exec /usr/sbin/$PMOUNT $TOPACTUAL
fi

###END###
