#! /bin/sh
# (c) Copyright 2003/2004/2005/2006 Barry Kauler www.puppylinux.com
#2007 Lesser GPL licence v2 (http://www.fsf.org/licensing/licenses/lgpl.html)
# This script has a GUI to mount and unmount partitions. 
# Oct 2005 total rewrite.
# v1.0.7 Nov 2005: bugfix by GuestToo.
# Jan 2006 updated for Puppy2.
# Jan 2007 improvements by Dougal and plinej.
# 19 June 2007 BK: fixed for new probepart script (also made faster!).
# 20 June 2007 BK: load/unload swap partitions, improved user-interface, bug-fixes.

#if [ "`which defaultfilemanager`" = "" ]; then
# echo "#!/bin/bash" > /usr/local/bin/defaultfilemanager
# echo rox \"\$@\" >> /usr/local/bin/defaultfilemanager
# chmod a+x /usr/local/bin/defaultfilemanager
#fi

#v2.17 prevent multiple instances, mucks things up...
CURRPS="`ps`"
[ "`echo "$CURRPS" | grep '/tmp/pmountdlg.txt'`" != "" ] && exit

. /etc/rc.d/PUPSTATE

fsfunc() #f.s. type param passed in
{
 FSTYPE="$1"
 [ "$FSTYPE" = "Ext2" ] && FSTYPE="ext2"
 [ "$FSTYPE" = "ReiserFS" ] && FSTYPE="reiserfs"
 [ "$FSTYPE" = "Ext3" ] && FSTYPE="ext3"
 [ "$FSTYPE" = "FAT12" ] && FSTYPE="vfat"
 [ "$FSTYPE" = "FAT16" ] && FSTYPE="vfat"
 [ "$FSTYPE" = "FAT32" ] && FSTYPE="vfat"
 [ "$FSTYPE" = "NTFS" ] && FSTYPE="ntfs"
 [ "$FSTYPE" = "ISO9660" ] && FSTYPE="iso9660"
}

#/usr/sbin/disk.tcl & #displays partition sizes graphically.
#X0PID=$!


while :; do #BIGLOOP

yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "Puppy Drive Mounter

Please wait, probing hardware..." &
X1PID=$!

DISKINFO="`probedisk 2> /tmp/probediskerr.txt`"
PARTINFO0="`probepart -m 2> /tmp/probeparterr.txt | grep "/dev/" | grep --extended-regexp "ext2|ext3|reiserfs|msdos|vfat|ntfs|iso9660|swap"`"
PARTINFO="`echo "$PARTINFO0" | grep -v '|swap|'`"
PARTSWAP="`echo "$PARTINFO0" | grep '|swap|'`"

#v2.17 removed, probepart now reports superfloppy info...
##v2.0.0
##a drive could be a "superfloppy", with no mbr and no partitions...
##remove partition entries from PARTINFO, replace with one entry...
#for ONEDRIVE in `echo "$DISKINFO" | cut -f 1 -d '|' | cut -f 3 -d '/' | tr "\n" " "`
#do
# DISKTYPE="`disktype /dev/$ONEDRIVE 2> /dev/null`"
# SUPERFLOPPYFS="`echo "$DISKTYPE" | grep "file system" | grep "^[a-zA-Z]" | head -n 1 | cut -f 1 -d " "`"
# if [ "$SUPERFLOPPYFS" ];then
#  fsfunc $SUPERFLOPPYFS #returns FSTYPE
#  SUPERSIZM="`echo "$DISKTYPE" | grep "Block device" | tr -s " " | cut -f 4 -d " "`"
#  PARTTMP="`echo "$PARTINFO" | grep -v "/dev/$ONEDRIVE"`"
#  PARTINFO="$PARTTMP
#/dev/${ONEDRIVE}|${FSTYPE}|${SUPERSIZM}|Superfloppy drive"
# fi
#done

#v2.17 puppy no longer using scsi-emulation for ide cd-drives...
##one tricky thing about probedisk is it returns both ide and scsi names for scsi-emulated drive...
##if cd/dvd drive is scsi-emul, screen out the line with ide name...
#if [ -f /etc/cdburnerdevice ];then
# BURNERDEVICE="/dev/`cat /etc/cdburnerdevice`"
# if [ -f /etc/scsiemul ];then
#  if [ "`cat /etc/scsiemul`" = "on" ];then
#   TITLESTRING="`echo "$DISKINFO" | grep "$BURNERDEVICE" | cut -f 3 -d '|'`"
#   IDEDEVICE="`echo "$DISKINFO" | grep "$TITLESTRING" | grep -v "$BURNERDEVICE" | head -n 1 | cut -f 1 -d '|'`"
#   [ "$IDEDEVICE" ] && DISKINFO="`echo -n "$DISKINFO" | grep -v "$IDEDEVICE"`"
#  fi
# fi
#fi

#kill $X1PID

#v2.17...
#if a removable drive is mounted, check that it hasn't been removed...
if [ -s /tmp/probediskerr.txt ];then
 kill $X1PID 2>/dev/null
 ERRDEVS="`cat /tmp/probediskerr.txt | grep -o 'PROBEDISK ERROR.*' | cut -f 5 -d ' ' | tr '\n' ' '`"
 gxmessage -bg "#ff8080" -title "Puppy drive mounter: エラー" -center -buttons OKAY:10,"強制的にアンマウント":12,"Pmount を終了":11 "マウント中にこのドライブが抜かれました:
 $ERRDEVS

リムーバブルドライブは取り外す前にアンマウントしなければなりません。

残念ながら、もしこれがUSBドライブなら、差し込み直す事はできません。
カーネルは $ERRDEVS は使用中と判断し、新しく差し込んだドライブに
新しいデバイス名を割り当てます。これは悪い状況です。ここでどうする
か名案が浮かばなければ、「QUIT」（終了）ボタンを押してPCを再起動する事を
お勧めします。あるいは「強制的にアンマウント」ボタンで実際には
存在しないデバイスのアンマウントを試して下さい。
-- デバイスを差し込まないで「強制的にアンマウント」をクリックです...

CD/DVDの場合は、すぐにもう一度挿入して「OKAY」をクリックです..."
 RETERRTAG=$?
 [ $RETERRTAG -eq 10 ] && continue
 [ $RETERRTAG -ne 12 ] && exit
 for ONEERR in $ERRDEVS
 do
  UNPATTERN="^/dev/$ONEERR"
  for ONEERRMNT in `mount | grep "$UNPATTERN" | cut -f 3 -d ' ' | tr '\n' ' '`
  do
   sync
   echo "Killing processes using $ONEERRMNT..."
   fuser -k -m $ONEERRMNT
   echo "Unmounting $ONEERRMNT..."
   umount -f $ONEERRMNT
  done
 done
 continue
fi

export PMOUNTGUI="
<window title=\"Pmount パピードライブマウンタ \"icon-name=\"gtk-harddisk\">
<vbox>
 <text use-markup=\"true\">
 <label>\"<b>マウントしたメディアを取り外したり抜いたりしないで下さい</b>\"</label></text>
"

#######FLOPPY###########
#v2.17 zygo had a problem at cold boot, did not get 'Floppy'...
#if [ ! "`cat /var/log/messages | grep "Floppy drive" | grep "fd0"`" = "" ];then
#if [ ! "`cat /var/log/messages | grep " drive" | grep " fd0 "`" = "" ];then
if [ -e /sys/block/fd0 ];then #Dougal suggested this test.
 DEVFD0="/dev/fd0"
 MNTFD0="`mount | grep "/dev/fd0" | cut -f 3 -d ' ' | tr -s ' '`"
 PMOUNTGUI="$PMOUNTGUI <frame Floppy drive>"
 if [ "$MNTFD0" ];then
  PMOUNTGUI="$PMOUNTGUI
  <hbox>
   <button>
    <input file>/usr/local/lib/X11/mini-icons/mini-ofolder.xpm</input>
    <action>rox -d /mnt/floppy &</action>
   </button>
   <text use-markup=\"true\"><label>\"<b>/mnt/floppy</b>\"</label></text>
   <text><label>\"   \"</label></text>
   <text><label>\"/dev/fd0 msdos\"</label></text>
   <button>
    <input file>/usr/local/lib/X11/mini-icons/mini-diskette.xpm</input>
    <action>echo 'EXIT=/dev/fd0_/mnt/floppy_GREEN'</action>
   </button>
  </hbox>"
 else
  PMOUNTGUI="$PMOUNTGUI
  <hbox>
   <text><label>/dev/fd0</label></text>
   <button>
    <input file>/usr/local/lib/X11/mini-icons/mini-diskette.xpm</input>
    <action>echo 'EXIT=/dev/fd0_/mnt/floppy_RED'</action>
   </button>
  </hbox>"
 fi
 PMOUNTGUI="$PMOUNTGUI </frame>"
fi
#######END FLOPPY###########

#v2.0.0
#######ZIP/LS120 IDE FLOPPY###########
#v2.17 this code now a bit redundant as probepart now detects zip partitions...
if [ ! "`cat /var/log/messages | grep "ATAPI FLOPPY"`" = "" ];then
 ZIPDISK="`echo "$DISKINFO" | grep '|floppy|' | grep "ATAPI" | cut -f 1 -d '|' | tr -s ' '`"
 ZIPNUM="`disktype $ZIPDISK | grep '^Partition ' | cut -f 1 -d ':' | cut -f 2 -d " "`"
 DEVZIP="$ZIPDISK$ZIPNUM" #ex: /dev/hdd4
 MNTZIP="/mnt/`echo -n "$DEVZIP" | cut -f 3 -d '/'`"
 FSZIP="`disktype $DEVZIP | grep 'file system' | cut -f 1 -d " "`" #ex: FAT16
 fsfunc $FSZIP
 FSZIP="$FSTYPE"
 XMNTZIP="`mount | grep "$DEVZIP"`"

 PMOUNTGUI="$PMOUNTGUI <frame Zip/LS120 ATAPI drive>"
 if [ "$XMNTZIP" ];then
  PMOUNTGUI="$PMOUNTGUI
  <hbox>
   <button>
    <input file>/usr/local/lib/X11/mini-icons/mini-ofolder.xpm</input>
    <action>rox -d $MNTZIP &</action>
   </button>
   <text use-markup=\"true\"><label>\"<b>$MNTZIP</b>\"</label></text>
   <text><label>\"   \"</label></text>
   <text><label>$DEVZIP</label></text>
   <button>
    <input file>/usr/local/lib/X11/mini-icons/mini-diskette.xpm</input>
    <action>echo 'EXIT=${DEVZIP}_${MNTZIP}_GREEN'</action>
   </button>
  </hbox>"
 else
  PMOUNTGUI="$PMOUNTGUI
  <hbox>
   <text><label>$DEVZIP</label></text>
   <button>
    <input file>/usr/local/lib/X11/mini-icons/mini-diskette.xpm</input>
    <action>echo 'EXIT=${DEVZIP}_${MNTZIP}_RED'</action>
   </button>
  </hbox>"
 fi
 PMOUNTGUI="$PMOUNTGUI </frame>"
fi
#######END ZIP/LS120###########


#####CD/DVD##############
#v2.12 need to recognise 'CD-ROM' as well as 'cdrom'... v2.13 fix...
CDROMS="`echo -n "$DISKINFO" | grep -i '|cd-*rom|' | tr -s ' '`"
if [ "$CDROMS" ];then
 NUMLINES=`echo "$CDROMS" | wc -l | tr -s ' ' | cut -f 2 -d ' '`
 while [ $NUMLINES -gt 0 ];do
  [ $NUMLINES -eq 1 ] && CDROM1="`echo -n "$CDROMS" | tail -n 1 | head -n 1`"
  [ $NUMLINES -eq 2 ] && CDROM2="`echo -n "$CDROMS" | tail -n 2 | head -n 1`"
  [ $NUMLINES -eq 3 ] && CDROM3="`echo -n "$CDROMS" | tail -n 3 | head -n 1`"
  NUMLINES=`expr $NUMLINES - 1`
 done
fi
if [ "$CDROM1" ];then
 DEVCDR1="`echo -n "$CDROM1" | cut -f 1 -d '|'`"
 DESCRCDR1="`echo -n "$CDROM1" | cut -f 3 -d '|'`"
 MNTCDR1="`mount | grep "$DEVCDR1" | cut -f 3 -d ' '`"
 FSCDR1="`echo "$PARTINFO" | grep "$DEVCDR1" | cut -f 2 -d '|'`"
 DVDRWMEDIAINFO="`dvd+rw-mediainfo $DEVCDR1 2>&1`"
 MEDIACDR1="DVD"
 [ ! "`echo -n "$DVDRWMEDIAINFO" | grep --extended-regexp "non\\-DVD|not a DVD unit"`" = "" ] && MEDIACDR1="CD"
 PMOUNTGUI="$PMOUNTGUI <frame ${MEDIACDR1}: $DESCRCDR1>"
 if [ "$MNTCDR1" ];then
  PMOUNTGUI="$PMOUNTGUI
  <hbox>
   <button>
    <input file>/usr/local/lib/X11/mini-icons/mini-ofolder.xpm</input>
    <action>rox -d $MNTCDR1 &</action>
   </button>
   <text use-markup=\"true\"><label>\"<b>$MNTCDR1</b>\"</label></text>
   <text><label>\"   \"</label></text>
   <text><label>$DEVCDR1</label></text>
   <button>
    <input file>/usr/local/lib/X11/mini-icons/mini-cd-green.xpm</input>
    <action>echo 'EXIT=${DEVCDR1}_${MNTCDR1}_GREEN'</action>
   </button>
  </hbox>"
 else
  PMOUNTGUI="$PMOUNTGUI
  <hbox>
   <text><label>$DEVCDR1</label></text>
   <button>
    <input file>/usr/local/lib/X11/mini-icons/mini-cd.xpm</input>
    <action>echo 'EXIT=${DEVCDR1}_XXX_RED'</action>
   </button>
  </hbox>"
 fi
 PMOUNTGUI="$PMOUNTGUI </frame>"
fi
if [ "$CDROM2" ];then
 DEVCDR2="`echo -n "$CDROM2" | cut -f 1 -d '|'`"
 DESCRCDR2="`echo -n "$CDROM2" | cut -f 3 -d '|'`"
 MNTCDR2="`mount | grep "$DEVCDR2" | cut -f 3 -d ' '`"
 FSCDR2="`echo "$PARTINFO" | grep "$DEVCDR2" | cut -f 2 -d '|'`"
 DVDRWMEDIAINFO="`dvd+rw-mediainfo $DEVCDR2 2>&1`"
 MEDIACDR2="DVD"
 [ ! "`echo -n "$DVDRWMEDIAINFO" | grep --extended-regexp "non\\-DVD|not a DVD unit"`" = "" ] && MEDIACDR2="CD"
 PMOUNTGUI="$PMOUNTGUI <frame ${MEDIACDR2}: $DESCRCDR2>"
 if [ "$MNTCDR2" ];then
  PMOUNTGUI="$PMOUNTGUI
  <hbox>
   <button>
    <input file>/usr/local/lib/X11/mini-icons/mini-ofolder.xpm</input>
    <action>rox -d $MNTCDR2 &</action>
   </button>
   <text use-markup=\"true\"><label>\"<b>$MNTCDR2</b>\"</label></text>
   <text><label>\"   \"</label></text>
   <text><label>$DEVCDR2</label></text>
   <button>
    <input file>/usr/local/lib/X11/mini-icons/mini-cd-green.xpm</input>
    <action>echo 'EXIT=${DEVCDR2}_${MNTCDR2}_GREEN'</action>
   </button>
  </hbox>"
 else
  PMOUNTGUI="$PMOUNTGUI
  <hbox>
   <text><label>$DEVCDR2</label></text>
   <button>
    <input file>/usr/local/lib/X11/mini-icons/mini-cd.xpm</input>
    <action>echo 'EXIT=${DEVCDR2}_XXX_RED'</action>
   </button>
  </hbox>"
 fi
 PMOUNTGUI="$PMOUNTGUI </frame>"
fi
#########CD/DVD##########

#########swap############v2.17
if [ "$PARTSWAP" != "" ];then
 PMOUNTGUI="$PMOUNTGUI
<frame Swap partitions>"
 for ONESWAP in $PARTSWAP
 do
  ONESWDEV="`echo "$ONESWAP" | cut -f 1 -d '|'`"
  ONESWFS="`echo "$ONESWAP" | cut -f 2 -d '|'`"
  ONESWSIZE="`echo "$ONESWAP" | cut -f 3 -d '|'`"
  #note, swap mntd at bootup is /initrd/dev/xxx...
  SWPATTERN="$ONESWDEV"' '
  ONESWSTATUS="off"
  [ "`cat /proc/swaps | grep "$SWPATTERN"`" != "" ] && ONESWSTATUS="on"
 
   if [ "$ONESWSTATUS" = "on" ];then
    PMOUNTGUI="$PMOUNTGUI
    <hbox>
     <text use-markup=\"true\"><label>\"<b>現在使用中です</b>\"</label></text>
     <text><label>\"   \"</label></text>
     <text use-markup=\"true\"><label>\"$ONESWDEV ${ONESWSIZE}M\"</label></text>
     <button>
      <input file>/usr/local/lib/X11/mini-icons/mini-hdisk-green.xpm</input>
      <action>echo 'EXIT=${ONESWDEV}_swappart_GREEN'</action>
     </button>
    </hbox>"
   else
    PMOUNTGUI="$PMOUNTGUI
    <hbox>
     <text use-markup=\"true\"><label>\"現在
未使用です\"</label></text>
     <text><label>\"   \"</label></text>
     <text use-markup=\"true\"><label>\"$ONESWDEV ${ONESWSIZE}M\"</label></text>
     <button>
      <input file>/usr/local/lib/X11/mini-icons/mini-hdisk.xpm</input>
      <action>echo 'EXIT=${ONESWDEV}_swappart_RED'</action>
     </button>
    </hbox>"
   fi
 done
 PMOUNTGUI="$PMOUNTGUI </frame>"
fi
#########swap############

#########HARD DRIVE###########
DISK1="";DISK2="";DISK3="";DISK4="" #note, needs matches /dev/hda-d
DISKS="`echo -n "$DISKINFO" | grep '|disk|' | tr '#' '_' | tr '"' '_' | tr "'" '_'`"
if [ "$DISKS" ];then
 NUMLINES=`echo "$DISKS" | wc -l | tr -s ' ' | cut -f 2 -d ' '`
 while [ $NUMLINES -gt 0 ];do
  [ $NUMLINES -eq 1 ] && DISK1="`echo -n "$DISKS" | tail -n 1 | head -n 1`"
  [ $NUMLINES -eq 2 ] && DISK2="`echo -n "$DISKS" | tail -n 2 | head -n 1`"
  [ $NUMLINES -eq 3 ] && DISK3="`echo -n "$DISKS" | tail -n 3 | head -n 1`"
  [ $NUMLINES -eq 4 ] && DISK4="`echo -n "$DISKS" | tail -n 4 | head -n 1`"
  NUMLINES=`expr $NUMLINES - 1`
 done
fi

for DISKN in "$DISK1" "$DISK2" "$DISK3" "$DISK4"
do
 [ "$DISKN" = "" ] && continue
 DEVDISKN="`echo -n "$DISKN" | cut -f 1 -d '|'`"
 #v2.12 pmount will crash if drive has no partitions (?)...
 CHECKACCESSN="`echo "$PARTINFO" | grep "$DEVDISKN"`" #check if no partitions.
 [ "$CHECKACCESSN" = "" ] && continue
 DESCRDISKN="`echo -n "$DISKN" | cut -f 3 -d '|'`"
 INFODISKN="`fdisk -l $DEVDISKN | head -n 2 | tail -n 1 | cut -f 1 -d ','`"
 PMOUNTGUI="$PMOUNTGUI <frame Drive: $DESCRDISKN>"
 PARTSDISKN="`echo "$PARTINFO" | grep "$DEVDISKN"`"

 if [ ! "$PARTSDISKN" = "" ];then
  PART1DISKN="";PART2DISKN="";PART3DISKN="";PART4DISKN=""
  PART5DISKN="";PART6DISKN="";PART7DISKN="";PART8DISKN="";PART9DISKN=""
  PART10DISKN="";PART11DISKN="";PART12DISKN="";PART13DISKN=""
  NUMLINES=`echo "$PARTSDISKN" | wc -l | tr -s ' ' | cut -f 2 -d ' '`
  while [ $NUMLINES -gt 0 ];do
   [ $NUMLINES -eq 13 ] && PART1DISKN="`echo -n "$PARTSDISKN" | tail -n 13 | head -n 1`"
   [ $NUMLINES -eq 12 ] && PART2DISKN="`echo -n "$PARTSDISKN" | tail -n 12 | head -n 1`"
   [ $NUMLINES -eq 11 ] && PART3DISKN="`echo -n "$PARTSDISKN" | tail -n 11 | head -n 1`"
   [ $NUMLINES -eq 10 ] && PART4DISKN="`echo -n "$PARTSDISKN" | tail -n 10 | head -n 1`"
   [ $NUMLINES -eq 9 ] && PART5DISKN="`echo -n "$PARTSDISKN" | tail -n 9 | head -n 1`"
   [ $NUMLINES -eq 8 ] && PART6DISKN="`echo -n "$PARTSDISKN" | tail -n 8 | head -n 1`"
   [ $NUMLINES -eq 7 ] && PART7DISKN="`echo -n "$PARTSDISKN" | tail -n 7 | head -n 1`"
   [ $NUMLINES -eq 6 ] && PART8DISKN="`echo -n "$PARTSDISKN" | tail -n 6 | head -n 1`"
   [ $NUMLINES -eq 5 ] && PART9DISKN="`echo -n "$PARTSDISKN" | tail -n 5 | head -n 1`"
   [ $NUMLINES -eq 4 ] && PART10DISKN="`echo -n "$PARTSDISKN" | tail -n 4 | head -n 1`"
   [ $NUMLINES -eq 3 ] && PART11DISKN="`echo -n "$PARTSDISKN" | tail -n 3 | head -n 1`"
   [ $NUMLINES -eq 2 ] && PART12DISKN="`echo -n "$PARTSDISKN" | tail -n 2 | head -n 1`"
   [ $NUMLINES -eq 1 ] && PART13DISKN="`echo -n "$PARTSDISKN" | tail -n 1 | head -n 1`"
   NUMLINES=`expr $NUMLINES - 1`
  done

  for PARTNDISKN in "$PART1DISKN" "$PART2DISKN" "$PART3DISKN" "$PART4DISKN" "$PART5DISKN" "$PART6DISKN" "$PART7DISKN" "$PART8DISKN" "$PART9DISKN" "$PART10DISKN" "$PART11DISKN" "$PART12DISKN" "$PART13DISKN"
  do
   [ "$PARTNDISKN" = "" ] && continue
   DEVPNDN="`echo -n "$PARTNDISKN" | cut -f 1 -d '|'`"
   DEVPATTERN1="$DEVPNDN " #v2.17
   DEVPATTERN2="${DEVPNDN}|" #v2.17
   MNTPNDN="`mount | grep "$DEVPATTERN1" | cut -f 3 -d ' '`"
   [ "$MNTPNDN" = "" ] && MNTPNDN="`ps -e | grep -o 'ntfs\-3g.*' | grep "$DEVPNDN" | tr '\t' ' ' | tr -s ' ' | tr ' ' "\n" | grep '^/mnt/'`"
   FSPNDN="`echo "$PARTINFO" | grep "$DEVPATTERN2" | cut -f 2 -d '|'`"   
   if [ "$FSPNDN" = msdos ]; then
   FSPNDNBYTES="`expr length $DEVPNDN`"
   FSPNDNBYTES2="`expr $FSPNDNBYTES - 1`"
   FSPND="`echo $DEVPNDN | head -c $FSPNDNBYTES2`"
   FSPNDN2="`fdisk -l $FSPND | grep $DEVPNDN | grep -o FAT`"
   if [ "$FSPNDN2" = FAT ]; then
   FSPNDN=vfat
   fi
   fi
   
   SIZEPNDN="`echo "$PARTINFO" | grep "$DEVPNDN" | cut -f 3 -d '|'`"
   NUMBYTES="`expr length $SIZEPNDN`"
   NUMBYTES1="`expr $NUMBYTES + 1`"
   WHICH="M"
   if [ "$NUMBYTES" != 0 ]; then
   if [ "$NUMBYTES" != 1 ]; then
   if [ "$NUMBYTES" != 2 ]; then
   if [ "$NUMBYTES" != 3 ]; then
   SIZEPNDN="`echo "(( "$SIZEPNDN" / 1000 ))" | bc -l | cut -b 1-"$NUMBYTES1"`"
   INTSIZE="`echo -n "$SIZEPNDN" | cut -f 1 -d '.'`"
   FRACTSIZE="`echo -n "$SIZEPNDN" | cut -f 2 -d '.' | cut -b 1`"
   SIZEPNDN="${INTSIZE}.${FRACTSIZE}"
   WHICH="G"
   fi
   fi 
   fi
   fi
#V2.12 plinej added this. have removed $SIZEPNDN value. v2.17 BK...
if [ "$MNTPNDN" != "" ];then
 SPPATTERN=' '"${MNTPNDN}"'$'
 PERCENTAGE=`df -h | grep "$SPPATTERN" | tr ' ' '\n' | grep %`
 SPACELEFT=`df -h | grep "$SPPATTERN" | tr ' ' '\n' | sed '/^$/ d' | sed -n 4p`
fi


   if [ ! "$MNTPNDN" = "" ];then
    PMOUNTGUI="$PMOUNTGUI
    <hbox>
     <button>
      <input file>/usr/local/lib/X11/mini-icons/mini-ofolder.xpm</input>
      <action>rox -d $MNTPNDN &</action>
     </button>
     <text use-markup=\"true\"><label>\"<b>$MNTPNDN $SPACELEFT の空容量</b>\"</label></text>
     <text><label>\"   \"</label></text>
     <text use-markup=\"true\"><label>\"$DEVPNDN $SIZEPNDN$WHICH $FSPNDN\"</label></text>
     <button>
      <input file>/usr/local/lib/X11/mini-icons/mini-hdisk-green.xpm</input>
      <action>echo 'EXIT=${DEVPNDN}_${MNTPNDN}_GREEN'</action>
     </button>
    </hbox>"
   else
    PMOUNTGUI="$PMOUNTGUI
    <hbox>
     <text><label>\"$DEVPNDN $SIZEPNDN$WHICH $FSPNDN\"</label></text>
     <button>
      <input file>/usr/local/lib/X11/mini-icons/mini-hdisk.xpm</input>
      <action>echo 'EXIT=${DEVPNDN}_XXX_RED'</action>
     </button>
    </hbox>"
   fi
  done
 fi
 PMOUNTGUI="$PMOUNTGUI </frame>"
done
#########HARD DRIVE###########


#########v2.12 USB/SATA DRIVE############
DISK1="";DISK2="";DISK3="";DISK4="";DISK5="";DISK6=""
DISKS="`echo -n "$DISKINFO" | grep '|Direct\-Access|' | tr '#' '_' | tr '"' '_' | tr "'" '_'`"
if [ "$DISKS" ];then
 NUMLINES=`echo "$DISKS" | wc -l | tr -s ' ' | cut -f 2 -d ' '`
 while [ $NUMLINES -gt 0 ];do
  [ $NUMLINES -eq 1 ] && DISK1="`echo -n "$DISKS" | tail -n 1 | head -n 1`"
  [ $NUMLINES -eq 2 ] && DISK2="`echo -n "$DISKS" | tail -n 2 | head -n 1`"
  [ $NUMLINES -eq 3 ] && DISK3="`echo -n "$DISKS" | tail -n 3 | head -n 1`"
  [ $NUMLINES -eq 4 ] && DISK4="`echo -n "$DISKS" | tail -n 4 | head -n 1`"
  [ $NUMLINES -eq 5 ] && DISK5="`echo -n "$DISKS" | tail -n 5 | head -n 1`"
  [ $NUMLINES -eq 6 ] && DISK6="`echo -n "$DISKS" | tail -n 6 | head -n 1`"
  NUMLINES=`expr $NUMLINES - 1`
 done
fi

for DISKN in "$DISK6" "$DISK5" "$DISK4" "$DISK3" "$DISK2" "$DISK1"
do
 [ "$DISKN" = "" ] && continue
 DEVDISKN="`echo -n "$DISKN" | cut -f 1 -d '|'`"
 CHECKACCESSN="`echo "$PARTINFO" | grep "$DEVDISKN"`" #check removed or no partitions.
 [ "$CHECKACCESSN" = "" ] && continue
 DESCRDISKN="`echo -n "$DISKN" | cut -f 3 -d '|'`"
 INFODISKN="`fdisk -l $DEVDISKN | head -n 2 | tail -n 1 | cut -f 1 -d ','`"
 PMOUNTGUI="$PMOUNTGUI <frame Drive: $DESCRDISKN>"
 PARTSDISKN="`echo "$PARTINFO" | grep "$DEVDISKN"`"

 if [ ! "$PARTSDISKN" = "" ];then
  PART1DISKN="";PART2DISKN="";PART3DISKN="";PART4DISKN=""
  PART5DISKN="";PART6DISKN="";PART7DISKN="";PART8DISKN=""
  PART9DISKN="";PART10DISKN="";PART11DISKN="";PART12DISKN=""
  NUMLINES=`echo "$PARTSDISKN" | wc -l | tr -s ' ' | cut -f 2 -d ' '`
  while [ $NUMLINES -gt 0 ];do
   [ $NUMLINES -eq 12 ] && PART1DISKN="`echo -n "$PARTSDISKN" | tail -n 12 | head -n 1`"
   [ $NUMLINES -eq 11 ] && PART2DISKN="`echo -n "$PARTSDISKN" | tail -n 11 | head -n 1`"
   [ $NUMLINES -eq 10 ] && PART3DISKN="`echo -n "$PARTSDISKN" | tail -n 10 | head -n 1`"
   [ $NUMLINES -eq 9 ] && PART4DISKN="`echo -n "$PARTSDISKN" | tail -n 9 | head -n 1`"
   [ $NUMLINES -eq 8 ] && PART5DISKN="`echo -n "$PARTSDISKN" | tail -n 8 | head -n 1`"
   [ $NUMLINES -eq 7 ] && PART6DISKN="`echo -n "$PARTSDISKN" | tail -n 7 | head -n 1`"
   [ $NUMLINES -eq 6 ] && PART7DISKN="`echo -n "$PARTSDISKN" | tail -n 6 | head -n 1`"
   [ $NUMLINES -eq 5 ] && PART8DISKN="`echo -n "$PARTSDISKN" | tail -n 5 | head -n 1`"
   [ $NUMLINES -eq 4 ] && PART9DISKN="`echo -n "$PARTSDISKN" | tail -n 4 | head -n 1`"
   [ $NUMLINES -eq 3 ] && PART10DISKN="`echo -n "$PARTSDISKN" | tail -n 3 | head -n 1`"
   [ $NUMLINES -eq 2 ] && PART11DISKN="`echo -n "$PARTSDISKN" | tail -n 2 | head -n 1`"
   [ $NUMLINES -eq 1 ] && PART12DISKN="`echo -n "$PARTSDISKN" | tail -n 1 | head -n 1`"
   NUMLINES=`expr $NUMLINES - 1`
  done

  for PARTNDISKN in "$PART1DISKN" "$PART2DISKN" "$PART3DISKN" "$PART4DISKN" "$PART5DISKN" "$PART6DISKN" "$PART7DISKN" "$PART8DISKN" "$PART9DISKN" "$PART10DISKN" "$PART11DISKN" "$PART12DISKN"
  do
   [ "$PARTNDISKN" = "" ] && continue
   DEVPNDN="`echo -n "$PARTNDISKN" | cut -f 1 -d '|'`"
   DEVPATTERN1="$DEVPNDN " #v2.17
   DEVPATTERN2="${DEVPNDN}|" #v2.17
   MNTPNDN="`mount | grep "$DEVPATTERN1" | cut -f 3 -d ' '`"
   [ "$MNTPNDN" = "" ] && MNTPNDN="`ps -e | grep -o 'ntfs\-3g.*' | grep "$DEVPNDN" | tr '\t' ' ' | tr -s ' ' | tr ' ' "\n" | grep '^/mnt/'`"
   FSPNDN="`echo "$PARTINFO" | grep "$DEVPATTERN2" | cut -f 2 -d '|'`"   
   if [ "$FSPNDN" = msdos ]; then
   FSPNDNBYTES="`expr length $DEVPNDN`"
   FSPNDNBYTES2="`expr $FSPNDNBYTES - 1`"
   FSPND="`echo $DEVPNDN | head -c $FSPNDNBYTES2`"
   FSPNDN2="`fdisk -l $FSPND | grep $DEVPNDN | grep -o FAT`"
   if [ "$FSPNDN2" = FAT ]; then
   FSPNDN=vfat
   fi
   fi   
   SIZEPNDN="`echo "$PARTINFO" | grep "$DEVPNDN" | cut -f 3 -d '|'`"
   NUMBYTES="`expr length $SIZEPNDN`"
   NUMBYTES1="`expr $NUMBYTES + 1`"
   WHICH="M"
   if [ "$NUMBYTES" != 0 ]; then
   if [ "$NUMBYTES" != 1 ]; then
   if [ "$NUMBYTES" != 2 ]; then
   if [ "$NUMBYTES" != 3 ]; then
   SIZEPNDN="`echo "(( "$SIZEPNDN" / 1000 ))" | bc -l | cut -b 1-"$NUMBYTES1"`" 
   INTSIZE="`echo -n "$SIZEPNDN" | cut -f 1 -d '.'`"
   FRACTSIZE="`echo -n "$SIZEPNDN" | cut -f 2 -d '.' | cut -b 1`"
   SIZEPNDN="${INTSIZE}.${FRACTSIZE}"
   WHICH="G"
   fi
   fi 
   fi
   fi

#v2.12 plinej added this, have removed $SIZEPNDN from display... v2.17 BK...
if [ "$MNTPNDN" != "" ];then
 SPPATTERN=' '"${MNTPNDN}"'$'
 PERCENTAGE=`df -h | grep "$SPPATTERN" | tr ' ' '\n' | grep %`
 SPACELEFT=`df -h | grep "$SPPATTERN" | tr ' ' '\n' | sed '/^$/ d' | sed -n 4p`
fi
   
   if [ ! "$MNTPNDN" = "" ];then
    PMOUNTGUI="$PMOUNTGUI
    <hbox>
     <button>
      <input file>/usr/local/lib/X11/mini-icons/mini-ofolder.xpm</input>
      <action>rox -d $MNTPNDN &</action>
     </button>
     <text use-markup=\"true\"><label>\"<b>$MNTPNDN $SPACELEFT の空容量</b>\"</label></text>
     <text><label>\"   \"</label></text>
     <text use-markup=\"true\"><label>\"$DEVPNDN $SIZEPNDN$WHICH $FSPNDN\"</label></text>
     <button>
      <input file>/usr/local/lib/X11/mini-icons/mini-hdisk-green.xpm</input>
      <action>echo 'EXIT=${DEVPNDN}_${MNTPNDN}_GREEN'</action>
     </button>
    </hbox>"
   else
    PMOUNTGUI="$PMOUNTGUI
    <hbox>
     <text><label>\"$DEVPNDN $SIZEPNDN$WHICH $FSPNDN\"</label></text>
     <button>
      <input file>/usr/local/lib/X11/mini-icons/mini-hdisk.xpm</input>
      <action>echo 'EXIT=${DEVPNDN}_XXX_RED'</action>
     </button>
    </hbox>"
   fi
  done
 fi
 PMOUNTGUI="$PMOUNTGUI </frame>"
done
#########v2.12 USB DRIVE############

#prevent some partitions from being unmounted...
# Dougal: simplified this code section...
#v2.16 now looks like: _GREEN'</action>
echo "$PMOUNTGUI" >/tmp/pmountdlg.txt
echo "$PMOUNTGUI" |fgrep "_GREEN'</action>" |egrep '_/initrd/*|_/_' | while read ALINE
do
 DPATTERN="s%$ALINE%<visible>disabled</visible>\n      $ALINE%g"
 sed -e "$DPATTERN" /tmp/pmountdlg.txt > /tmp/pmountdlg.tmp
 cp -f /tmp/pmountdlg.tmp /tmp/pmountdlg.txt
done



#PMOUNTGUI=`sed 's%/initrd/mnt/dev_save%/mnt/home%' /tmp/pmountdlg.txt`
#v2.16 not quite, do it this way...
#/mnt/home may not always point to /initrd/mnt/dev_save. Either use readlink
#or the PUP_HOME variable in /etc/rc.d/PUPSTATE...
if [ -L /mnt/home ];then
 #realhome="`readlink /mnt/home`"
 realhome="/initrd$PUP_HOME" #v2.20b
 ##or, home could be a partition in unionfs layer instead of a pup_save file...
 #[ "$PUP_HOME" = "/pup_rw" -o "$PUP_HOME" = "/pup_ro1" ] && realhome="$PUP_HOME"
 RPATTERN="s%${realhome}%/mnt/home%"
 PMOUNTGUI=`sed "$RPATTERN" /tmp/pmountdlg.txt`
else
 PMOUNTGUI="`cat /tmp/pmountdlg.txt`"
fi

kill $X1PID 2>/dev/null #this is the 'please wait...' msg.
#bring up the gui...
PMOUNTGUI="$PMOUNTGUI
 <hbox>
  <button><input file stock=\"gtk-refresh\"></input><label>更新</label>
    <action>echo 'EXIT=REFRESH'</action>
  </button>
  <button><input file stock=\"gtk-quit\"></input><label>QUIT</label></button>
	</hbox>
</vbox>
</window>"
echo "$PMOUNTGUI" > /tmp/pmountdlg.txt

#v2.16 script now keeps the window up until next one ready...
CURRPS="`ps`"
OLDPID="`echo "$CURRPS" | grep '/tmp/pmountdlg.txt' | cut -b 1-5 | tr '\n' ' '`"
echo "Killing old window $OLDPID"
[ "$OLDPID" != "" ] && kill $OLDPID
#v2.16 my primitive pipe, works well...
echo '#!/bin/sh' > /tmp/pmountgui
echo 'gtkdialog3 --file=/tmp/pmountdlg.txt --center &' >> /tmp/pmountgui
chmod 744 /tmp/pmountgui
echo -n "" > /tmp/pmountret
/tmp/pmountgui > /tmp/pmountret
while [ ! -s /tmp/pmountret ];do
 usleep 400000 #0.4 sec
done
RETSTRING="`cat /tmp/pmountret | head -n 1`"

echo "RETSTRING=$RETSTRING" #to console


[ ! "`echo "$RETSTRING" | grep "EXIT" | grep "abort"`" = "" ] && break #exit BIGLOOP v2.0.0
[ ! "`echo "$RETSTRING" | grep "QUIT"`" = "" ] && break #exit BIGLOOP

#ABUTTON="`echo "$RETSTRING" | grep "EXIT" | cut -f 2 -d '\"'`"
#two formats: EXIT=string  EXIT="string"...
ABUTTON="`echo "$RETSTRING" | grep "EXIT" | cut -f 2 -d '=' | cut -f 2 -d '\"'`"
[ "$ABUTTON" = "" ] && continue #restart BIGLOOP
[ "$ABUTTON" = "REFRESH" ] && continue #restart BIGLOOP #v2.16 BK
ADEVICE="`echo -n "$ABUTTON" | cut -f 1 -d '_'`"
AMNTPT="`echo -n "$ABUTTON" | cut -f 2 -d '_'`"
ASTATUS="`echo -n "$ABUTTON" | cut -f 3 -d '_'`"

if [ "$AMNTPT" = "swappart" ];then
 if [ "$ASTATUS" = "RED" ];then
  sync
  swapon $ADEVICE
  [ $? -ne 0 ] && xmessage "Sorry, failed to load $ADEVICE swap partition"
 else
  #if swap loaded in initrd, it will be seen as /initrd/dev/xxx...
  SWPATTERN="$ADEVICE "
  xADEVICE="`grep "$SWPATTERN" /proc/swaps | cut -f 1 -d ' '`"
  sync
  swapoff $xADEVICE
  [ $? -ne 0 ] && xmessage "Sorry, $ADEVICE swap partition is in use, cannot unload"
 fi
 continue
fi

AFSYS="`echo "$PARTINFO" | grep "$ADEVICE" | cut -f 2 -d '|'`"
if [ "$AFSYS" = "none" ];then
 if [ ! "`echo "$PARTINFO" | grep "$ADEVICE" | grep -i "ntfs"`" = "" ];then
  AFSYS="ntfs"
 fi
fi
if [ "$AFSYS" = "msdos" ];then
 AFSYS="vfat"
fi

#v2.0.0
if [ "$AFSYS" = "" ];then
 fsfunc "`disktype $ADEVICE | grep "file system" | grep "^[a-zA-Z]" | head -n 1 | cut -f 1 -d " "`"
 AFSYS="$FSTYPE"
fi

if [ "$ASTATUS" = "GREEN" ];then
 #need to unmount a partition...
 CURRENTMNT="$AMNTPT"
 rox -D "$CURRENTMNT"
 sync
 umount $ADEVICE
 FTRY=$?
 MNTATTEMPT="unmount"
 if [ $FTRY -eq 0 ];then
  [ ! "`echo -n "$CDROMS" | grep "$ADEVICE"`" = "" ] && /usr/bin/eject $ADEVICE
 fi
else
 if [ "$AMNTPT" = "XXX" ];then
  xADEVICE="`echo -n "$ADEVICE" | cut -f 3 -d '/'`"
  AMNTPT="/mnt/$xADEVICE"
 fi
 #special case...
 if [ -f /etc/multisessionmediatype ];then
  if [ "$BURNERDEVICE" = "$ADEVICE" ];then
   [ "`mount | grep "/mnt/home"`" = "" ] && AMNTPT="/mnt/home"
  fi
 fi
 [ ! -d $AMNTPT ] && mkdir $AMNTPT
 if [ "$AFSYS" = "ntfs" ];then
  #mount -r -t $AFSYS $ADEVICE $AMNTPT
  mount -t $AFSYS $ADEVICE $AMNTPT #v2.02
  FTRY=$?
  [ "$FTRY" = 0 ] && AFSYS="fuser" #v2.02 because of how 'mount' reports.
 else
  if [ "$AFSYS" = "vfat" ];then
   mount -t $AFSYS -o shortname=mixed $ADEVICE $AMNTPT
   FTRY=$?
  else
   mount -t $AFSYS $ADEVICE $AMNTPT
   FTRY=$?
  fi
 fi
 MNTATTEMPT="mount"
 CURRENTMNT="$AMNTPT"
fi


if [ ! $FTRY -eq 0 ];then #=1 if failed
 EXTRAMSG0="`fuser -v -m $CURRENTMNT`"
 if [ "$EXTRAMSG0" = "" ];then
  gxmessage -bg "#ff8080" -title "Puppy drive mounter: エラー" -center "失敗！ リムーバブルメディアの場合は、たいていの普通の理由は
現在、メディアが挿入されていません。
あるいは前に挿入したメディアのアンマウントを忘れています。
もしそうなら、取り外して下さい。"
 else
  if [ "$MNTATTEMPT" = "unmount" ];then #have failed attempt to unmount...
   gxmessage -bg "#ff00ff" -title "KILL, KILL..." -center -buttons KILL:10,EXIT:20 "失敗！１つかそれ以上のプロセス（プログラム）が
パーティションを使用中です。これです:
$EXTRAMSG0

\"KILL\" ボタンを押すと、パピーはじゃまなプログラムの
「kill」を試みます。しかしこれは最後の手段です。
最初に、手動でプログラムを閉じて見て下さい。
ですから \"KILL\" ボタンは押さないで下さい。
\"EXIT\" ボタンを押して下さい！"
   if [ $? -eq 10 ];then
    fuser -k -m $CURRENTMNT
   fi
  else #have failed attempt to mount.
  gxmessage -bg "#ff8080" -title "Puppy drive mounter: エラー" -center "失敗！ リムーバブルメディアの場合は、たいていの普通の理由は
現在、メディアが挿入されていません。
あるいは前に挿入したメディアのアンマウントを忘れています。
もしそうなら、取り外して下さい。"
  fi
 fi
else
 if [ "$MNTATTEMPT" = "mount" ];then
  #comes here if have just successfully mounted a partition.
  #launch rox
  #rox -d "$CURRENTMNT" &
  echo "good, mounted on $CURRENTMNT"
 fi
fi

done #BIGLOOP

#killall disk.tcl
###END###
