#!/bin/sh
#(c) Copyright Barry Kauler 2006 www.puppylinux.com
#2007 Lesser GPL licence v2 (http://www.fsf.org/licensing/licenses/lgpl.html)
## Abused by Dougal, April 2007
## Update: April 25th: use cdrom drives, rather than /dev/dvd etc.
## Update: April 29th: add find_grub_install, add_grub_entry, frugal code
## Update: April 30th: changed some instances of /mnt/$DESTPART to $DESTMNTPT
## Update: April 30th: Updated way of finding devices (go to /sys/block)
## Update: May 8th: Fixed bug caused by disktype (vfat superfloppy as ext3) 
# BK May 15-17 hacked to work in Puppy 2.16.
# BK July bugfixes for 2.17.
# BK July 21: bugfixes for 2.17.1.

#TODO list:
# maybe mention install types at beginning -- only frugal on MS part


NEWVER="`cat /etc/puppyversion`"
#mount > /etc/mtab   #v2.10 remove.
KERNVER="`uname -r`"

#USBINFO="`lspci -i /usr/share/pci-usb-pcmcia.ids`"

#v2.10
. /etc/rc.d/PUPSTATE

############################# define functions ###########################

#fsfunc() #f.s. type param passed in
#{
 #FSTYPE="$1"
 #[ "$FSTYPE" = "Ext2" ] && FSTYPE="ext2"
 #[ "$FSTYPE" = "ReiserFS" ] && FSTYPE="reiserfs"
 #[ "$FSTYPE" = "Ext3" ] && FSTYPE="ext3"
 #[ "$FSTYPE" = "FAT16" ] && FSTYPE="vfat"
 #[ "$FSTYPE" = "FAT32" ] && FSTYPE="vfat"
 #[ "$FSTYPE" = "NTFS" ] && FSTYPE="ntfs"
 #[ "$FSTYPE" = "ISO9660" ] && FSTYPE="iso9660"
#}
fsfunc() { # supplied with a line of text, sets FSTYPE
case "$@" in 
#	*iso9660*) FSTYPE="iso9660" ; return 0;;
	*[Ee]xt3*) FSTYPE="ext3" ; return 0;;
	*[Ee]xt2*) FSTYPE="ext2" ; return 0;;
	*[Nn][Tt][Ff][Ss]*) FSTYPE="ntfs" ; return 0;;
	*[Ff][Aa][Tt]*|*msdos*) FSTYPE="vfat" ; return 0;;
	*[Rr]eiser*) FSTYPE="reiserfs" ; return 0;;
	*[Mm][Ii][Nn][Ii][Xx]*) FSTYPE="minix" ; return 0;;
	*) return 1 ;;
esac
}

# function searches hard-drived for grub installation
# it assumes the existence of DESTPART, SELECTIONS
# returns 0 if found (set as LISTFILE) or 1 if not
find_grub_install(){
 # device we installed to
 DESTDEV=${DESTPART:0:3}
 #  being a real lazy smart-arse: using SELECTIONS from way up at the
 #+ beginning... already checked that these are harddrives...
 OTHERDEVS="`echo "$SELECTIONS" | tr '"' '\n' | grep '[hs]d[a-z]' | grep -v "$DESTDEV" | tr '\n' ' '`" #' #geany fix

 ## just go over partitions and look for menu file
 MAYBEPNT="" ; MAYBEFLAG=""
 # look in the dev we installed to first
 for ONEDEV in $DESTDEV $OTHERDEVS
 do # BIG LOOP
  # go over list of partitions from fdisk (only Linux parts!!)
  while read MAYBE
  do
    [ "$MAYBE" ] || continue
    MAYBEPNT="`mount | grep -F "$MAYBE" | tr -s ' ' | cut -f3 -d' '`"
    if [ ! "$MAYBEPNT" ]; then # need to mount
      NAME=${MAYBE#/dev/}
      [ -d /mnt/$NAME ] || mkdir /mnt/$NAME
      if mount $MAYBE /mnt/$NAME ; then
        MAYBEPNT=/mnt/$NAME
        MAYBEFLAG="yes"
      else
        #TODO gxmessage
        echo "couldn't mount $MAYBE"
      fi
    fi
    # Should have MAYBEPNT by now
    if [ "$MAYBEPNT" ] ; then 
      # find -maxdepth 3 won't work with /initrd/mn/dev_save...
      # just check for the file in /boot/grub
      #LISTFILE="`find $MAYBEPNT -maxdepth 3 -name 'menu.lst' | grep -F -m1 '/grub/'`"
      if [ -f $MAYBEPNT/boot/grub/menu.lst ] ; then
        LISTFILE="$MAYBEPNT/boot/grub/menu.lst"
        break 2
      else #could add test for Lilo
        [ "$MAYBEFLAG" ] && umount $MAYBEPNT && MAYBEFLAG=""
      fi
    fi
  done<<EOF
$(fdisk -l /dev/$ONEDEV | grep '^/dev/' | grep -F '83  Linux' | cut -d' ' -f1)
EOF
 done # BIG LOOP
  
 if [ ! "$LISTFILE" ] ; then # Grub not found
  return 1
 else # got list
  echo "grub menu file is |$LISTFILE|"
  # add entry to file
  return 0
 fi
} #find_grub_install


# function to add entry to exisitng grub installation
# parameters passed: DESTPART, LISTFILE
add_grub_entry(){
 EDITFILE=/tmp/grub-menu-code
 # get grub-style device numbers (for use in entry):
 PARTNUM=${DESTPART#$DESTDEV}
 if [ "$PARTNUM" ] ; then
   let PARTNUM=PARTNUM-1
 else # no partitions??
   PARTNUM=0
 fi
 DEVNUM=""
 NUM=0
 while read DEV
 do
   if [ "$DEV" = "/dev/$DESTDEV" ] ; then #it's our device
     DEVNUM=$NUM
     break
   fi
   let NUM=NUM+1
 done<<EOF
$(fdisk -l | grep "^Disk /dev/" | cut -d' ' -f2 | cut -d':' -f1)
EOF

 ## create file in /tmp with grub boot entry
 echo '# Linux bootable partition config begins' >$EDITFILE.full

 if [ "$1" = "frugal" ] ; then
   echo "title = Puppy $NEWVER (frugal) on $DESTPART
rootnoverify (hd$DEVNUM,$PARTNUM)
kernel (hd$DEVNUM,$PARTNUM)/vmlinuz root=/dev/ram0 pmedia=$FINALPMEDIA
initrd (hd$DEVNUM,$PARTNUM)/initrd.gz" >$EDITFILE
 else # full install
   echo "title = Puppy $NEWVER on $DESTPART
root (hd$DEVNUM,$PARTNUM)
kernel (hd$DEVNUM,$PARTNUM)/boot/vmlinuz root=/dev/$DESTPART ro vga=normal" >$EDITFILE
 fi
 
 Xdialog --left --title "パピーユニバーサルインストーラ" --backtitle "次のエントリがgrub configファイルに追加されます。 
$LISTFILE
好みに編集して「OK」ボタンを押して下さい。 
「CANCEL」ボタンを押すとメニューを終了します。
注意：何をしたら良いかわからない場合は、'title'フィールドだけを編集して下さい。" --editbox $EDITFILE 20 70 2>>$EDITFILE.full
 if [ $? -eq 0 ] ; then # add entry
   # make backup of old menu file
   cp $LISTFILE $LISTFILE.old
   echo '# Linux bootable partition config ends' >>$EDITFILE.full
   # add the entry after the last Linux entry
   LINENUM=`grep -F -n '# Linux bootable ' $LISTFILE | tail -n1 | cut -d':' -f1`
   [ "$LINENUM" ] || return 1
   while read ALINE
   do
     # can't seem to get sed to accept the multi-line entry here...
     # so use loop to add one line at a time
     sed "${LINENUM}a\
$ALINE" $LISTFILE >$LISTFILE.tmp
     sync
     let LINENUM=LINENUM+1
     mv -f $LISTFILE.tmp $LISTFILE
   done<<EOF
$(cat $EDITFILE.full)
EOF
   return 0 #maybe "done" message?
 else #quit
   return 2
 fi
} #add_grub_entry


ispupfunc() #fstype partition
{
 PUPSFS=""
 MOUNTFLAG=""
 PUPVEROLD=0
 [ "$2" ] || return 0
 [ -d /mnt/$2 ] || mkdir /mnt/$2
 #cannot test for /dev/$2 as mount reports ntfs device is /dev/fuse...
 #v2.12 latest ntfs-3g driver works with mount properly, so special handling
 #no longer necessary, but still here...
 ISPUPMNTPT="`mount | grep -F -m1 "/dev/$2" | tr -s " " | cut -f3 -d' '`"
 #v2.02...
 #[ "$ISPUPMNTPT" = "" ] && ISPUPMNTPT="`ps -e | grep -o ntfs\-3g.* | grep "/dev/$2" | sed -e 's/[^a-zA-Z0-9/._\-]/ /g' | tr -s ' ' | tr ' ' "\n" | grep '^/mnt/'`"
 [ "$ISPUPMNTPT" = "" ] && ISPUPMNTPT="`ps -e | grep -o 'ntfs\-3g.*' | grep "/dev/$2" | tr '\t' ' ' | tr -s ' ' | tr ' ' '\n' | grep '^/mnt/'`"
 
 if [ "$ISPUPMNTPT" = "" ];then # not mounted
  ISPUPMNTPT="/mnt/$2"
  mount -t $1 /dev/$2 /mnt/$2
  MOUNTFLAG="yes"
 fi
 if [ $? -eq 0 ];then
  # Dougal: list in reverse, so latest version is given by "head"
  ISFILE="`cd $ISPUPMNTPT ; ls -1 -r pup_[0-9][0-9][0-9].sfs 2>/dev/null | head -n 1`"
  [ "$ISFILE" ] && PUPVEROLD=`echo "$ISFILE" | cut -f2 -d'_' | cut -f1 -d'.'`
  if [ -f $ISPUPMNTPT/etc/puppyversion ];then
   PUPVEROLD=`cat $ISPUPMNTPT/etc/puppyversion`
   #there is a bug in prev installer, put 0 into puppyversion...
   [ $PUPVEROLD -eq 0 ] && let PUPVEROLD=NEWVER-1
  fi
  # Dougal: I'm not sure about the next line -- maybe do only if no PUPVEROLD?
  [ $PUPVEROLD -eq 0 ] && [ -f $ISPUPMNTPT/usr_cram.fs ] && PUPVEROLD=108
  [ "$MOUNTFLAG" ] && umount /dev/$2
 fi
 return $PUPVEROLD
}

gpartedfixusbfunc() { #params: $DESTPART $DESTFS
 #GPDRV="`echo -n "$1" | sed -e 's/[0-9]//g'`"
 #GPDRV=${1%[0-9]}
 GPDRV=${1:0:3}
 gparted /dev/$GPDRV &
 sleep 2
 gxmessage -bg '#ba55d3' -center -title "パピーユニバーサルインストーラ" "GPartedはパーティションマネージャです。パピーバージョン２から利用できますが、
BareBoneのリリース版には含まれていないかも知れません。その場合はPupGet
パッケージマネージャでインストールします。GPartedはパーティションの削除、
作成、及びサイズの変更をする簡単なツールです。

USBフラッシュドライブにパピーをインストールしたけれど起動できない場合、
USBフラッシュドライブのパーティションがパソコンのBIOSかSyslinuxに混乱を
きたしているかも知れません。個人的には、GPartedを利用してUSBドライブの
パーティションを全て削除し、新しいパーティションを作成する事で問題を解決しました。
この方法は非常に簡単です。GPartedを実行して、
　１、USBドライブの全てのパーティションを削除します。
　２、ドライブ全体に新しいFAT16のプライマリーパーティションを作成します。
　３、「Apply」ボタンをクリックして変更をUSBドライブに書き込みます。
　４、「boot」設定フラグをセットします（パーティション上でマウスを
　　　右クリックして「manage flags」を選択します）。
 
 GPartedをインストールして実行すれば上記の事ができます。
 GPartedを終了するとパピーユニバーサルインストーラに戻ります..." &
 MSGID=$!
 while pidof gparted >/dev/null ;do
  #[ "`pidof gparted | tr "\n" '|'`" = "|" ] && break
  sleep 1
 done
 which gparted >/dev/null && kill $MSGID 2>/dev/null
}

fixusbfunc() { #params: $DESTPART $DESTFS
 echo '#!/bin/sh
DESTPART=$1 #partition being installed to
DESTFS=$2   #filesystem of destination partition
echo "This little section of the Puppy Universal Installer is currently only"
echo "for fixing USB Flash or CF-card-in-IDE-adaptor, after you have gone thru"
echo "all the steps but it still will not boot."
echo
echo "You are trying to install to $DESTPART, but it is not booting..."
echo "Well, I am assuming that the BIOS in your PC is able to boot from USB."
echo "-- for CF-IDE the drive looks like an ordinary hard drive, so that should"
echo "   be okay for any BIOS."
echo
echo "This is the first release of this script, and it is a bit limited..."
echo "and only handles a partition with a msdos/vfat filesystem."
if [ "$DESTFS" = "vfat" ];then
 echo "...which is okay, $DESTPART does have a $DESTFS filesystem."
 echo "   But, we will now wipe it and recreate it."
else
 echo "...currently $DESTPART has a $DESTFS filesystem."
 echo "   This script is not yet designed for that, so cannot continue."
 echo
 echo -n "Press ENTER key to exit: "
 read nogo
 exit
fi
echo
echo "Please be sure that you are wiping the right partition!!!"
echo "Everything in $DESTPART is going to be wiped. If you do not want that,"
echo "press any letter on the keyboard then ENTER key, or"
echo -n "Press ENTER key only to continue script: "
read querygo
[ "$querygo" ] && exit
echo
echo "Recreating msdos filesystem on $DESTPART..."
mkdosfs /dev/$DESTPART
sync
echo "Fixing the Master Boot Record (MBR)..."
DESTDRV=${DESTPART:0:3}
dd if=/usr/lib/syslinux/mbrfat.bin of=/dev/$DESTDRV
sync
echo "...done"
echo
echo "Okay, we can now go back to the main part of the Puppy Universal"
echo "Installer and install Puppy to the $DESTPART partition."
echo -n "Press ENTER key to continue: "
read yesgo
' > /tmp/fixusb.sh
 chmod 755 /tmp/fixusb.sh
 rxvt -bg "pink" -title "パピーユニバーサルインストーラ" -geometry 80x25 -e /tmp/fixusb.sh $1 $2
}

#unmountcdfunc() {
 #if [ ! "$CDDRIVE" = "" ];then
  #if mount | grep -q "/dev/$CDDRIVE" ;then
   #rox -D "`mount | grep "/dev/$CDDRIVE" | tr -s " " | cut -f 3 -d " "`"
   ##do not kill any processes
   #sync
   #umount /dev/$CDDRIVE 2> /dev/null
   ##mount > /etc/mtab  #v2.10 remove.
   #mount | grep -q "/dev/$CDDRIVE" || eject /dev/$CDDRIVE
  #fi
 #fi
#}

####################### end define functions ###################


##### ask what kind of installation we want to do #####

# Dougal: changed this so there's only one HD option -- less confusing
# Might want to move usbhd out of harddrives, have it with usbflash
PMEDIA="`Xdialog --left --title "パピーユニバーサルインストーラ" --no-tags --stdout --menubox "パピーユニバーサルインストーラへようこそ!\nパピーを取外し可能メディアにインストールするには（例えば\nUSBフラッシュ或いはハードディスク、フロッピーディスク、Zipディスク、\nLS-120ディスクなど）続ける前に、今すぐメディアを挿入して下さい。\n\n======= 今すぐメディアを挿入して下さい ======\nそしてパピーをインストールするメディアを選択して下さい:" 0 0 7 harddrive "内蔵ハードディスク" usbflash "USBフラッシュドライブ" usbhd "リムーバブルUSBハードディスク" usb2ideflash "USB CFフラッシュドライブ、後ほどCFをIDEアダプタへ移します" ideflash "IDEフラッシュドライブ(IDEアダプタ内のCFカード)" idezip "内蔵(IDE)ZIP 或いは LS120ドライブ"`"
#PMEDIA="`Xdialog --left --title "Puppy Universal Installer" --no-tags --stdout --menubox "Welcome to the Puppy Universal Installer!\nIf you wish to install Puppy to a removable media, such\nas a USB Flash or hard drive, CD/DVD disc, floppy disk,\nZip disk, LS-120 disk, please insert it right now,\nbefore proceeding.\n\nINSERT MEDIA NOW\nThen, choose the media that you want to install Puppy to:" 0 0 8 usbflash "USB Flash drive" usbhd "USB hard drive" usb2ideflash "USB CF Flash drive, later move CF to IDE adaptor" ideflash "IDE Flash drive (CF card in IDE adaptor)" idehd "IDE (ATA) internal hard drive" idezip "Internal (IDE) ZIP or LS120 drive" satahd "SATA internal hard drive" scsihd "SCSI internal hard drive"`"
[ ! $? -eq 0 ] && exit
[ "$PMEDIA" = "" ] && exit

FINALPMEDIA="$PMEDIA"
if [ "$PMEDIA" = "usb2ideflash" ];then
 PMEDIA="usbflash"
 FINALPMEDIA="ideflash"
fi

## Dougal: for size of disk I use (looks nicer): 
## fdisk -l /dev/$ADEV | grep -F -m1 "/dev/$ADEV" | cut -d':' -f2 | cut -d',' -f1

########## Get list of drives for selected media ##########
case $PMEDIA in
 harddrive) # can be IDE, SCSI or SATA drive 
  SELECTIONS=""
  # first get "sd" hard-drives (usb, sata, scsi)
  SDDEVS="`cd /sys/block ; echo sd[a-z]* | grep -F -v '*'`"
  for ADEV in $SDDEVS
  do
    [ "$ADEV" ] || continue
	if [ "`cat /sys/block/$ADEV/removable`" = "0" ] ;then #not removable device
	 VENDOR="`cat /sys/block/$ADEV/device/vendor`"
     MODEL="`cat /sys/block/$ADEV/device/model`"
	 SDINFO="$VENDOR$MODEL"
	 ###INSERT v2.17
	 # check if removable USB HD:
	 case "$USBINFO" in 
	  *External*|*[Uu][Ss][Bb]*) continue ;; #skip it
	 esac
	 ###END v2.17.1	 
	 #SDSIZE="`disktype /dev/$ADEV | grep "Block device" | cut -f 2 -d ',' | tr -s " " | cut -f 1-4 -d " "`"
	 SDSIZE="`fdisk -l /dev/$ADEV | grep -F -m1 "/dev/$ADEV" | cut -d':' -f2 | cut -d',' -f1`"
	 [ "$SDSIZE" ] || continue
	 SELECTIONS="${SELECTIONS} $ADEV \"${SDINFO}, size${SDSIZE}\""
	fi
  done
  # now get IDE (hd) hard-drives
  HDDRIVES="`cd /proc/ide ; echo hd[a-z]* | grep -F -v '*'`"
  for ADEV in $HDDRIVES
  do
    [ "$ADEV" ] || continue
	if [ "`cat /proc/ide/$ADEV/media`" = "disk" ] ;then 
	 HDINFO="`cat /proc/ide/$ADEV/model`"
     #HDSIZE="`disktype /dev/$ADEV | grep "Block device" | cut -f 2 -d ',' | tr -s " " | cut -f 1-4 -d " "`"
     HDSIZE="`fdisk -l /dev/$ADEV | grep -F -m1 "/dev/$ADEV" | cut -d':' -f2 | cut -d',' -f1`"
     [ "$HDSIZE" ] || continue
     SELECTIONS="${SELECTIONS} $ADEV \"${HDINFO}, size${HDSIZE}\""
	fi
  done
  ;;
 usbflash)
  if ! lsmod | grep -E -q '^usb\-storage|^usb_storage' ; then
   # NOTE: below blank line intentional -- part of message 
   gxmessage -buttons "" -center "Loading usb-storage module.

Please wait..." &
   XPID=$!
   USBDELAY=6
   lsmod | grep -q '^ehci\-hcd' || USBDELAY=26
   modprobe usb-storage &
   sleep $USBDELAY
   kill $XPID
  fi
  #find usb drives...
  SDDEVS="`cd /sys/block ; echo sd[a-z]* | grep -F -v '*'`"
  SELECTIONS=""
  for ADEV in $SDDEVS
  do
    [ "$ADEV" ] || continue
	if [ "`cat /sys/block/$ADEV/removable`" = "1" ] ;then 
	 VENDOR="`cat /sys/block/$ADEV/device/vendor`"
     MODEL="`cat /sys/block/$ADEV/device/model`"
	 USBINFO="$VENDOR$MODEL"
	 # skip if it's a usbhd BK no, does not work always...
	 #case "$USBINFO" in *[Ee][Xx][Tt][Ee][Rr][Nn][Aa][Ll]*) continue ;; esac
	 #USBSIZE="`disktype /dev/$ADEV | grep "Block device" | cut -f 2 -d ',' | tr -s " " | cut -f 1-4 -d " "`"
	 USBSIZE="`fdisk -l /dev/$ADEV | grep -F -m1 "/dev/$ADEV" | cut -d':' -f2 | cut -d',' -f1`"
	 [ "$USBSIZE" ] || continue
	 SELECTIONS="${SELECTIONS} $ADEV \"${USBINFO}, size${USBSIZE}\""
	fi
  done
  ;;
 usbhd) # Dougal: try and find usbhd by the "External" in it's name...
  if ! lsmod | grep -E -q '^usb\-storage|^usb_storage' ; then
   # NOTE: below blank line intentional -- part of message 
   gxmessage -buttons "" -center "USBストレージモジュールをロードしています。

しばらくお待ち下さい..." &
   XPID=$!
   USBDELAY=6
   lsmod | grep -q '^ehci\-hcd' || USBDELAY=26
   modprobe usb-storage &
   sleep $USBDELAY
   kill $XPID
  fi
  #find usb drives...
  SDDEVS="`cd /sys/block ; echo sd[a-z]* | grep -F -v '*'`"
  SELECTIONS=""
  for ADEV in $SDDEVS
  do
    [ "$ADEV" ] || continue
	#if [ "`cat /sys/block/$ADEV/removable`" = "1" ] ;then #BK mine has '0'
	if [ "`cat /sys/block/$ADEV/removable`" = "0" ] ;then  #v2.17.1
	 VENDOR="`cat /sys/block/$ADEV/device/vendor`"
     MODEL="`cat /sys/block/$ADEV/device/model`"
	 USBINFO="$VENDOR$MODEL"
	 # Now check for "External" (skip if not) BK no, i have Maxtor, no 'External'.
	 #case "$USBINFO" in *[Ee][Xx][Tt][Ee][Rr][Nn][Aa][Ll]*) ;; *) continue ;; esac
	 #USBSIZE="`disktype /dev/$ADEV | grep "Block device" | cut -f 2 -d ',' | tr -s " " | cut -f 1-4 -d " "`"
	 ###INSERT v2.17.1
	 # Now check for "External" (skip if not)
	 case "$USBINFO" in 
	  *External*|*[Uu][Ss][Bb]*) ;; # what we want
	  *) continue ;; 
	 esac
	 ###END v2.17.1
	 USBSIZE="`fdisk -l /dev/$ADEV | grep -F -m1 "/dev/$ADEV" | cut -d':' -f2 | cut -d',' -f1`"
	 [ "$USBSIZE" ] || continue
	 SELECTIONS="${SELECTIONS} $ADEV \"${USBINFO}, size${USBSIZE}\""
	fi
  done

  ;;
 ideflash)
  #find ide hard drives...
  HDDRIVES="`cd /proc/ide ; echo hd[a-z]* | grep -F -v '*'`"
  SELECTIONS=""
  for ADEV in $HDDRIVES
  do
    [ "$ADEV" ] || continue
	if [ "`cat /proc/ide/$ADEV/media`" = "disk" ] ;then 
	 HDINFO="`cat /proc/ide/$ADEV/model`"
     #HDSIZE="`disktype /dev/$ADEV | grep "Block device" | cut -f 2 -d ',' | tr -s " " | cut -f 1-4 -d " "`"
     HDSIZE="`fdisk -l /dev/$ADEV | grep -F -m1 "/dev/$ADEV" | cut -d':' -f2 | cut -d',' -f1`"
     [ "$HDSIZE" ] || continue
     SELECTIONS="${SELECTIONS} $ADEV \"${HDINFO}, size${HDSIZE}\""
	fi
  done
  ;;
 idezip)
  ## I think ZIP drive might be named hdc4 or something, so just use test-eide
  #HDDRIVES="`test-eide | grep 'floppy' | cut -d' ' -f1 | sed 's%/dev/%%g' | tr '\n' ' '`"
  HDDRIVES="`cd /proc/ide ; echo hd[a-z]* | grep -F -v '*'`"
  SELECTIONS=""
  for ADEV in $HDDRIVES
  do
    [ "$ADEV" ] || continue
    if [ "`cat /proc/ide/$ADEV/media`" = "floppy" ] ;then 
	 HDINFO="`cat /proc/ide/$ADEV/model`"
	 #HDINFO="`test-eide | grep "/dev/$ADEV" | cut -d' ' -f5-`"
     HDSIZE="`disktype /dev/$ADEV | grep "Block device" | cut -f 2 -d ',' | tr -s " " | cut -f 1-4 -d " "`"
     #HDSIZE="`fdisk -l /dev/$ADEV | grep -F -m1 "/dev/$ADEV" | cut -d':' -f2 | cut -d',' -f1`"
     [ "$HDSIZE" ] || continue
     SELECTIONS="${SELECTIONS} $ADEV \"${HDINFO}, size${HDSIZE}\""
	fi
  done
  ;;
 *) # leave this just in case we need it in the future...
  gxmessage "まだ実行していません"
  exit
  ;;
esac
########## End Get list of drives ##########

echo "$SELECTIONS"
#v2.11
if [ "$SELECTIONS" = "" ];then
 Xdialog --left --title "パピーユニバーサルインストーラ" --ok-label "終了" --msgbox "選択するものがありません。もしプラグインデバイスであれば差し込みましたか?" 0 0
 exit
fi

echo '#!/bin/sh' > /tmp/dlg1
echo -n 'Xdialog --title "パピーユニバーサルインストーラ" --no-cancel --stdout --menubox "どのドライブをインストールするか選択して下さい：" 10 40 4' >> /tmp/dlg1
echo -n "$SELECTIONS" >> /tmp/dlg1
echo ' > /tmp/retval'  >> /tmp/dlg1
echo 'exit $?' >> /tmp/dlg1

chmod 755 /tmp/dlg1
####################### Get partition to install to #######################
while [ 1 ];do #BIG LOOP

/tmp/dlg1
[ ! $? -eq 0 ] && exit
 
DRVSEL="`cat /tmp/retval`"
[ "$DRVSEL" = "" ] && exit
echo "$DRVSEL"

# output this into a file -- used here and in partition listing (cat and super)
disktype /dev/$DRVSEL >/tmp/drvinfo
#SUPERFS="`grep -F "file system" /tmp/drvinfo | grep "^[a-zA-Z]"`"
# Dougal: get drive size in bytes
#DRVSIZE="`grep -F "Block device" /tmp/drvinfo | cut -d'(' -f2 | cut -d' ' -f1`"
#let DRVSIZM=DRVSIZE/1000
## Dougal: we only need this for telling the user what they chose...
## Better have nicer format, rather than large number of MB...
DRVSIZE="`grep -F "Block device" /tmp/drvinfo | cut -f2 -d',' | tr -s " " | cut -f 3-4 -d " "`"
#DRVSIZM="`echo "$DRVSIZE" | cut -f3 -d' '`"
#if echo "$DRVSIZE" | grep -F -q 'GiB' ;then
 #DRVSIZM="`dc $DRVSIZM 1000 \* p`"
#fi
#IDRVSIZM="`echo -n "$DRVSIZM" | cut -f 1 -d '.'`" #truncate to integer.

DRVMSG=""
PUPINST=""
#if [ "$SUPERFS" ];then
 #fsfunc $SUPERFS && ispupfunc $FSTYPE $DRVSEL #returns PUPVEROLD
 #[ $PUPVEROLD -ne 0 ] && PUPINST=", Puppy version $PUPVEROLD installed"
 #DRVMSG="${DRVSEL}:  ${FSTYPE}, ${DRVSIZE}${PUPINST}
#"
#else
 #has mbr and partitions...
 
 # go over the output of "disktype", get all valid partitions	
 FLAG="off" ; NUM="" ; FSTYPE="" # last two for superfloppy
 while read ALINE 
 do
    case "$ALINE" in
	*Partition?[0-9]*:*)
	  set -- $ALINE
	  NUM=${2%:}
	  #NUM=${ALINE%%:*} ; NUM=${NUM#* }
	  case "$4" in MiB) UNIT="MB" ;; GiB) UNIT="GB" ;; esac
	  PARTSIZE="$3 $UNIT"
	  ;;
	*Type*) FLAG="on" #so we know if next is fs -- use it
	  ;;
	*file?system*)
	  PUPINST=""
	  fsfunc "$ALINE" && [ "$FLAG" = "on" ] || continue #filters out bad fs
	  ispupfunc $FSTYPE $DRVSEL$NUM #returns PUPVEROLD
	  [ $PUPVEROLD -ne 0 ] && PUPINST=", パピーバージョン= $PUPVEROLD =  がインストールされています"
	  DRVMSG="${DRVMSG}$DRVSEL$NUM: ${FSTYPE}, size ${PARTSIZE}${PUPINST}
"
	  ;;
	*) FLAG="off"
	  ;;
	esac
 done <<_END
$(cat /tmp/drvinfo)
_END

# no line starting with "Partition", but fs found: a superfloppy?
if [ ! "$NUM" ] && [ "$FSTYPE" ];then
  # to get past disktype bug with FAT parts having "ext3" in the info...
  while read ALINE 
  do # get FSTYPE from first instance of "file system"
    FSTYPE="" #v2.17.1
    case "$ALINE" in *file?system*) 
      #fsfunc "$ALINE" && PCPARTS="$PCPARTS $ADEV|$FSTYPE" && break ;;
      fsfunc "$ALINE" && break ;; #sets FSTYPE #v2.17.1
    esac
  done <<_END
$(cat /tmp/drvinfo)
_END
  if [ "$FSTYPE" ];then #v2.17.1
   ispupfunc $FSTYPE $DRVSEL #returns PUPVEROLD
   [ $PUPVEROLD -ne 0 ] && PUPINST=", パピーバージョン= $PUPVEROLD =   がインストールされています"
   #PARTSIZE="`grep -F "Block device" /tmp/drvinfo | cut -f2 -d',' | tr -s " " | cut -f 3-4 -d " "`"
   PARTSIZE="$DRVSIZE"
   DRVMSG="${DRVMSG}$DRVSEL: ${FSTYPE}, size ${PARTSIZE}${PUPINST}
"
   SUPER="yes"
  fi #v2.17.1
fi
 

echo "$DRVMSG"

DLGTXT=""
CHOICES="`echo "$DRVMSG" | grep ':' | cut -f1 -d':' | tr "\n" " "`"
for ONECHOICE in $CHOICES
do
 DLGTXT="$DLGTXT
   <hbox>
    <text><label>パピーを ${ONECHOICE} にインストール:</label></text>
    <button>
     <input file>/usr/local/lib/X11/mini-icons/mini-dog.xpm</input>
     <action>Exit:${ONECHOICE}</action>
    </button>
   </hbox>
"
done

DLGEXT=""
#if [ "`echo "$DRVMSG" | cut -f 1 -d ':' | grep "[a-zA-Z]$"`" = "" ];then
if [ ! "$SUPER" ] ; then
 #ask if want superfloppy install...
 DLGEXT="
   <frame スーパーフロッピ>
   <hbox>
    <text><label>注意: 一般的には推奨しません。スーパーフロッピーモードでパピーをインストールしますか？その場合MBRもパーティション もありません...ドライブは/dev/$DRVSELとしてアクセスされパーティション番号もありません。変なBIOSのPCからUSBフラッシュドライブを起動するには良い選択かも知れません。 YESならボタンをクリックして下さい:</label></text>
    <vbox>
     <button>
      <input file>/usr/local/lib/X11/mini-icons/mini-dog.xpm</input>
      <action>Exit:REFORMAT_${DRVSEL}</action>
     </button>
    </vbox>
   </hbox>
   </frame>
"
else
 DLGEXT="
   <frame スーパーフロッピ>
   <hbox>
    <text><label>このドライブは現在スーパーフロッピーモードです。MBRもパーティションもありません。 /dev/$DRVSELとしてアクセスされパーティション番号はありません（変なBIOSのPCからUSBフラッシュドライブを起動するには良い選択かも知れません）。パピーをインストールする/dev/${DRVSEL}1パーティションを作成しますか？ YESならボタンをクリックして下さい:</label></text>
    <vbox>
     <button>
      <input file>/usr/local/lib/X11/mini-icons/mini-dog.xpm</input>
      <action>Exit:REFORMAT_${DRVSEL}1</action>
     </button>
    </vbox>
   </hbox>
   </frame>
"
fi

DLG2="
 <wtitle>パピーユニバーサルインストーラ</wtitle>
 <vbox>
  <text><label>パピーが選択したドライブ情報です:</label></text>
  <text><label>\"${DRVMSG}\"</label></text>
$DLGTXT
$DLGEXT
   <button>
    <label>前に戻って別のドライブを選択</label>
    <action>Exit:GOBACK</action>
   </button>
 </vbox>
"

RETTXT="`echo "$DLG2" | gtkdialog2 --stdin`"

case "$RETTXT" in
 *abort*) exit ;;
 *'EXIT:GOBACK'*) ;; # go around again
 *) break ;;
esac
#[ ! "`echo "$RETTXT" | grep 'abort'`" = "" ] && exit
#[ "`echo "$RETTXT" | grep 'EXIT:GOBACK'`" = "" ] && break

done #BIG LOOP
###################

#when arrive here, have
#RETTXT="EXIT:sda1", DRVMSG="sda1: vfat, size 122.1 MiB, Puppy version 108 installed" (has all parts fnd)

##### sanity check...make sure partition isn't mounted #####
#SANITYPART="`echo -n "$DRVMSG" | cut -f 1 -d ':'`"
SANITYPART="`echo -n "$RETTXT" | grep 'EXIT' | cut -f 2 -d ':' | cut -f 2 -d '_'`"
SANITYMNTPT="`mount | grep -F "/dev/$SANITYPART" | tr -s " " | cut -f3 -d" "`"
#v2.02 cannot use mount for ntfs-3g driver...
#[ "$SANITYMNTPT" = "" ] && SANITYMNTPT="`ps -e | grep -o ntfs\-3g.* | grep "/dev/$SANITYPART" | sed -e 's/[^a-zA-Z0-9/._\-]/ /g' | tr -s ' ' | tr ' ' "\n" | grep '^/mnt/'`"

[ "$SANITYMNTPT" = "" ] && SANITYMNTPT="`ps -e | grep -o 'ntfs\-3g.*' | grep "/dev/$SANITYPART" | tr '\t' ' ' | tr -s ' ' | tr ' ' "\n" | grep '^/mnt/'`"


if [ "$SANITYMNTPT" ];then
 SANITYMSG1="$SANITYPART currently mounted, need to unmount it!!!"
 SANITYMSG2="$SANITYPART currently mounted read-write."
 SANITYMSG3="$SANITYPART does not have a pup_save file in it."
 #SANITYMNTPT="`mount | grep "/dev/$SANITYPART" | tr -s " " | cut -f 3 -d " "`"
 SANITYRORW="`mount | grep -F "/dev/$SANITYPART" | tr -s " " | cut -f 6 -d " "`"
 case "$SANITYMNTPT" in */initrd/*) SANITYMSG1="$SANITYPART cannot be unmounted!" ;; esac
 [ "$SANITYRORW" = "(ro)" ] && SANITYMSG2="$SANITYPART is mounted read-only!"
 [ -f $SANITYMNTPT/pup_save.3fs ] && SANITYMSG3="$SANITYPART has personal file pup_save.3fs in it!"
 [ -f $SANITYMNTPT/pup_save.2fs ] && SANITYMSG3="$SANITYPART has personal file pup_save.2fs in it!"
 Xdialog --left --title "パピーユニバーサルインストーラ：整合チェック" --ok-label "続ける" --cancel-label "終了する" --yesno "パーティションの整合チェックをしてから続けます：
$SANITYMSG1
$SANITYMSG2
$SANITYMSG3

もし上記の結果でパーティションがマウントされていれば、今アンマウントする必要があります。
しかし結果がパーティションをアンマウントができないならインストールに難点があります -- 
確かに、ハードディスクにインストールする場合、\"option1\"のインストールしかできません (後ほど説明します)。

もしパーティションに「pup_save」ファイルがあるとアンマウントができません
 -- パピーが現在このファイルを使用中だからです。
もし「pup_save」なしでパピーをライブCDから起動するとパピーは完全に
RAMの中で実行し問題は解決します。「pup_save」がある場合は、\"pfix-ram\"
と言うブートパラメータを付けてCDを起動できます。

要するに、今できればパーティションをアンマウントして下さい。またはこのスクリプトの
制限されたインストール選択で続けて下さい。あるいは今すぐこのスクリプトを中止し、
パーティションがマウントされている問題を解決して下さい" 0 0
 [ ! $? -eq 0 ] && exit
fi
##### end sanity check #####

##### get info on dest part, reformat is asked #####
if echo "$RETTXT" | grep -F -q 'EXIT:REFORMAT' ;then # reformat
  #RETTXT will have "EXIT:REFORMAT_sda" or "EXIT:REFORMAT_sda1", depending whether
  #we want to format in superfloppy mode or with a MBR and a partition...
  DESTPART="`echo "$RETTXT" | grep 'EXIT:REFORMAT' | cut -f 2 -d ':' | cut -f 2 -d '_'`"
  if ! echo "$DESTPART" | grep -q "[0-9]$" ;then
    #want superfloppy...
    DLG3="
 <wtitle>パピーユニバーサルインストーラ</wtitle>
 <vbox>
   <text><label>/dev/${DESTPART}をスーパーフロッピとしてフォーマットする選択をしました。ドライブに
「vfat」或いは「ext3」ファイルシステムを作成する選択が必要です。「Ext3」はもっともフレキシブル
な選択ですが（推奨）、MS Windowsから読めるようにするには「vfat」を選択して下さい。
注：しかし、MS Windowsにも「ext2/3」ドライブにアクセスするツールがあります。</label></text>
   <text><label>新しい詳細説明：「ext3」を選択した場合、ドライブ全体が個人データのストレージとしてすぐに使えますが、
「vfat」を選択した場合、ドライブの中に「ext3」ファイルシステムのファイルを作成しなくてはなりません
（すなわち「pup_save.2fs」と言うファイルです）-- このファイルは全ての個人データを
含む事ができます...</label></text>
  <hbox>
   <button>
    <label>FORMAT_ext3</label>
    <action>Exit:ext3</action>
   </button>
   <button>
    <label>FORMAT_vfat</label>
    <action>Exit:vfat</action>
   </button>
  </hbox>
 </vbox>
"
    RETTXT="`echo "$DLG3" | gtkdialog2 --stdin`"

    case "$RETTXT" in *abort*) exit ;; esac
    DESTFS="`echo "$RETTXT" | grep 'EXIT:' | cut -f 2 -d ':'`"
    echo '#!/bin/sh' > /tmp/formatsuper.sh
    echo -e "echo -n \"SANITY CHECK: formatting /dev/${DRVSEL}, ENTER to continue or CTRL-C to quit: \""  >> /tmp/formatsuper.sh
    echo 'read mooo'  >> /tmp/formatsuper.sh
    #echo 'echo "Zeroising the entire drive..."'  >> /tmp/formatsuper.sh
    #echo 'echo "(please be very patient, this could take awhile)"'  >> /tmp/formatsuper.sh
    ##echo "dd if=/dev/zero bs=1024 | $BAR -of /dev/$DRVSEL -s ${IDRVSIZM}m" >> /tmp/formatsuper.sh
    #echo "dd if=/dev/zero of=/dev/$DRVSEL" >> /tmp/formatsuper.sh
    #no, will just zeroise the mbr section...
    echo "dd if=/dev/zero of=/dev/$DRVSEL bs=512 count=1" >> /tmp/formatsuper.sh
    echo 'sync'  >> /tmp/formatsuper.sh
    if [ "$DESTFS" = "ext3" ];then
      echo 'echo "Creating an ext3 filesystem on the drive..."'   >> /tmp/formatsuper.sh
      echo -e "echo \"y\" | mke2fs -j -m 0 /dev/$DRVSEL"   >> /tmp/formatsuper.sh
    else #vfat
      echo 'echo "Creating a vfat filesystem on the drive..."'   >> /tmp/formatsuper.sh
      echo "mkdosfs -I /dev/$DRVSEL" >> /tmp/formatsuper.sh
    fi
    echo 'sync'  >> /tmp/formatsuper.sh
    echo 'echo -n "Press ENTER key to continue: "'   >> /tmp/formatsuper.sh
    echo 'read moo'   >> /tmp/formatsuper.sh
    chmod 755 /tmp/formatsuper.sh
    rxvt -bg "orange" -title "パピーユニバーサルインストーラ" -geometry 80x10 -e /tmp/formatsuper.sh
    DESTSIZE="$DRVSIZE"
    # Dougal: next param not used...
    #IDESTSIZM="$IDRVSIZM"
    DESTVER="" #previous version, n.a.
  else #if ! echo "$DESTPART" | grep -q "[0-9]$" ;then
    #want to partition with partition 1...
    DLG3="
 <wtitle>パピーユニバーサルインストーラ</wtitle>
 <vbox>
   <text><label>/dev/${DRVSEL}にMBR及びパーティションを付けてフォーマットする選択をしました。このパーティションに「vfat」或いは「ext3」のファイルシステムを作成する選択が必要です。「ext3」はもっともフレキシブルな選択ですが（推奨）、MS Windowsからこのドライブを読めるようにする「vfat」を選択して下さい。注：MS Windowsから「ext2/3」ドライブにアクセスするツールもあります。</label></text>
   <text><label>新しい詳細説明：「ext3」を選択した場合、ドライブ全体が個人データのストレージとしてすぐに使えますが、「vfat」を選択した場合は、ドライブの中に「ext3」ファイルシステムのファイルを作成しなければなりません（「pup_save.2fs」と言うファイルです）-- このファイルには全ての個人データが含まれています「FORMAT_ext3」或いは「FORMAT_vfat」ボタンを押してフォーマットを開始して下さい...</label></text>
  <hbox>
   <button>
    <label>FORMAT_ext3</label>
    <action>Exit:ext3</action>
   </button>
   <button>
    <label>FORMAT_vfat</label>
    <action>Exit:vfat</action>
   </button>
  </hbox>
 </vbox>
"
    RETTXT="`echo "$DLG3" | gtkdialog2 --stdin`"
    DESTFS="`echo "$RETTXT" | grep 'EXIT:' | cut -f 2 -d ':'`"

    echo '#!/bin/sh' > /tmp/formatmbr.sh
    echo -e "echo -n \"SANITY CHECK: formatting /dev/${DRVSEL}, ENTER to continue or CTRL-C to quit: \""  >> /tmp/formatmbr.sh
    echo 'read mooo'  >> /tmp/formatmbr.sh
    #echo 'echo "Zeroising the entire drive..."'  >> /tmp/formatmbr.sh
    #echo 'echo "(please be very patient, this could take awhile)"'  >> /tmp/formatmbr.sh
    ##echo "dd if=/dev/zero bs=1024 | $BAR -of /dev/$DRVSEL -s ${IDRVSIZM}m" >> /tmp/formatmbr.sh
    #echo "dd if=/dev/zero of=/dev/$DRVSEL" >> /tmp/formatmbr.sh
    #no, just do the mbr...
    echo 'echo "Creating the MBR (Master Boot Record)..."'  >> /tmp/formatmbr.sh
    echo "dd if=/usr/lib/syslinux/mbr.bin of=/dev/$DRVSEL bs=512 count=1" >> /tmp/formatmbr.sh
    echo 'sync'  >> /tmp/formatmbr.sh
    #create a bootable partition...
    echo 'echo "Creating a partition..."'  >> /tmp/formatmbr.sh
    echo 'echo "n'  >> /tmp/formatmbr.sh
    echo 'p'  >> /tmp/formatmbr.sh
    echo '1'  >> /tmp/formatmbr.sh
    echo  >> /tmp/formatmbr.sh
    echo  >> /tmp/formatmbr.sh
    #make partition bootable...
    echo 'a'  >> /tmp/formatmbr.sh
    echo '1'  >> /tmp/formatmbr.sh
    #write and exit...
    echo -n 'w"'  >> /tmp/formatmbr.sh
    echo " | fdisk /dev/$DRVSEL"  >> /tmp/formatmbr.sh
    echo 'echo "MBRをコピーしています..."'  >> /tmp/formatmbr.sh
    echo "dd if=/usr/lib/syslinux/mbr.bin of=/dev/$DRVSEL bs=512 count=1"  >> /tmp/formatmbr.sh
    echo 'sync'  >> /tmp/formatmbr.sh
    echo -e "echo \"Creating a FAT filesystem in /dev/${DRVSEL}1...\""  >> /tmp/formatmbr.sh
    echo "mkdosfs /dev/${DRVSEL}1" >> /tmp/formatmbr.sh
    #...this auto creates most appropriate fat f.s., so really should run fdisk set f.s. id now.
    echo 'sync'  >> /tmp/formatmbr.sh
    echo 'echo -n "Press ENTER key to continue: "'   >> /tmp/formatmbr.sh
    echo 'read moo'   >> /tmp/formatmbr.sh

    chmod 755 /tmp/formatmbr.sh
    rxvt -bg "orange" -title "パピーユニバーサルインストーラ" -geometry 80x10 -e /tmp/formatmbr.sh

    REALFS="`disktype /dev/${DRVSEL}1 | grep "file system" | cut -f 1 -d " "`"
    FSID="c" #FAT32(LBA)
    [ "$REALFS" = "FAT16" ] && FSID="6"
    [ "$REALFS" = "FAT32" ] && FSID="b"
    #f.s. id for partition... 6=FAT16 e=FAT16(LBA) c=FAT32(LBA) 83=Linux 4=FAT16<32M
    echo -e "t\n$FSID\nw" | fdisk /dev/$DRVSEL
  fi #if ! echo "$DESTPART" | grep -q "[0-9]$" ;then
else # (if reformat) ####### normal case -- no formatting
  DESTPART="`echo "$RETTXT" | grep 'EXIT:' | cut -f 2 -d ':'`"
  DESTFS="`echo "$DRVMSG" | grep "$DESTPART" | cut -f 1 -d ',' | tr -s " " | cut -f 2 -d " "`"
  DESTSIZE="`echo "$DRVMSG" | grep "$DESTPART" | tr -s " " | cut -f 4-5 -d " "`"
  #DESTSIZE="`echo "$DRVMSG" | grep "$DESTPART" | tr -s " " | cut -f 4-5 -d " "`"
  #DESTSIZM="`echo -n "$DESTSIZE" | cut -f 1 -d " "`"
  #case "$DESTSIZE" in *GB*) DESTSIZM="`dc $DESTSIZM 1000 \* p`" ;; esac
  #IDESTSIZM="`echo -n "$DESTSIZM" | cut -f 1 -d '.'`" #truncate to integer.
  DESTVER="`echo "$DRVMSG" | grep "$DESTPART" | tr -s " " | grep "installed" | cut -f 8 -d " "`"
fi # if reformat
##### end get info #####

##### make sure user knows what they chose... #####
if ! echo "$DESTPART" | grep -q "[0-9]$" ;then
 #superfloppy
 DLG4="
 <wtitle>パピーユニバーサルインストーラ</wtitle>
 <vbox>
  <text><label>「パピーをドライブ全体にインストール」する選択をしました。これをスーパーフロッピモードと呼びます。このモードではMBR (Master Boot Record)もパーティションもありません。これはフラッシュメモリ（特にUSBフラッシュ）には良い選択です。何故ならパソコンのBIOSからこのドライブをブートするのは難しいからです。</label></text>
  <text><label>このターゲットドライブは ${DESTPART}で、${DESTFS}を持ち、${DESTSIZM} Mです。「OK」ボタンを押すとパピーをこのドライブにインストールします...</label></text>
  <hbox><button ok></button><button cancel></button></hbox>
 </vbox>
"
 RETTXT="`echo "$DLG4" | gtkdialog2 --stdin`"
else
 DLG4="
 <wtitle>パピーユニバーサルインストーラ</wtitle>
 <vbox>
  <text><label>/dev/${DESTPART}パーティションにパピーをインストールする選択をしました。このパーティションは ${DESTFS}ファイルシステムを持ち、サイズは ${DESTSIZM} Mです。</label></text>
  <text><label>「OK」ボタンを押すとパピーをインストールします（注：実際のインストールを始める前に１、２のダイアログウィンドウが現れます）...</label></text>
  <hbox><button ok></button><button cancel></button></hbox>
 </vbox>
"
 RETTXT="`echo "$DLG4" | gtkdialog2 --stdin`"
fi
##### end make sure #####
[ ! $? -eq 0 ] && exit
[ "`echo "$RETTXT" | grep 'OK'`" = "" ] && exit
###################### end Get partition to install to #####################


########################## Get source of Puppy files #######################
#get latest Puppy files....
SRCPATH=""
#CDDRIVE=""
rm -f /tmp/srcpath.txt
### try searching mounted devices
mount | tr -s " " | cut -f 3 -d " " | grep -F '/mnt/' |
while read ADIR
do
  INCYES=0
  if [ -f $ADIR/pup_$NEWVER.sfs -a -f $ADIR/vmlinuz -a -f $ADIR/initrd.gz ];then
    echo -n "$ADIR" > /tmp/srcpath.txt
    break
  fi
done
[ -f /tmp/srcpath.txt ] && SRCPATH="`cat /tmp/srcpath.txt`"

##### haven't found sources: ask user #####
if [ "$SRCPATH" = "" ];then
 Xdialog --left --buttons-style text --title "パピーユニバーサルインストーラ" --ok-label "CD" --cancel-label "OTHER" --yesno "パピーは４個のファイルからできています：
vmlinuz:			リナックスカーネル
initrd.gz:			イニシャルRAMディスク
pup_$NEWVER.sfs:	これには全てのパピーファイルが入っています
zdrv_$NEWVER.sfs:	完全なカーネルドライバーセットとファームウェア（オプション）

もしパピーをライブCDから起動しているなら、これらのファイルはメモリの中に入っています。
あるいは、それらのファイルは .isoファイルにあって取り出す事ができます -- その場合、
ファイルを取り出して保存したディレクトリを選択しなくてはなりません。

パピーの４個のファイルはどこにありますか？..." 0 0
 RETVAL=$?
 if [ $RETVAL -eq 0 ];then #CD
   # get list od cdrom drives
   CDROMDRIVES="`test-eide | grep -E 'cdrom|CD-ROM' | cut -d' ' -f1 | tr '\n' ' '` `test-scsi | grep -E 'cdrom|CD-ROM' | cut -d' ' -f1 | tr '\n' ' '`"

   # check cd drives and select right one automatically
   ## Dougal: put this all in a loop, so user can insert cd then search again
   while true ; do #BIG LOOP
   
   for ACD in $CDROMDRIVES
   do #note ACD is of the form "/dev/hdc"
     # if there's a cd inside
     if [ "`/usr/lib/mut/bin/cdrominfo $ACD -p | cut -d'|' -f8`" != "none" ] ; then
       # look for mountpoint
       CDMNTPNT="`mount | grep "$ACD" | tr -s ' ' | cut -f3 -d' '`"
       if [ ! "$CDMNTPNT" ] ; then # mount it
         ANAME=${ACD#/dev/}
         [ -d /mnt/$ANAME ] || mkdir /mnt/$ANAME
         if mount -t iso9660 $ACD /mnt/$ANAME ; then
           MOUNTFLAG="yes"
           CDMNTPNT="/mnt/$ANAME"
         fi
       fi
       if [ "$CDMNTPNT" ] ; then # check if Puppy cd
         if [ -f $CDMNTPNT/initrd.gz ];then # found it, done!
           SRCPATH="$CDMNTPNT"
           break 2
         else # "blank" CDMNTPNT so will go on searching
           [ "$MOUNTFLAG" ] && umount $CDMNTPNT && MOUNTFLAG=""
           CDMNTPNT=""
         fi
       fi
     fi
   done
   # if we got here -- no cd. Ask.
   Xdialog --left --title "パピーユニバーサルインストーラ" --msgbox "パピーライブCDをCD/DVDドライブに入れて下さい。
CDを入れたら「OK」ボタンをクリックして下さい。

手動でディレクトリか.isoファイルを選択する、あるいは
インストールを中止したい場合は、ウィンドウの「close」ボックスをクリックして下さい..." 0 0
   if [ $? -eq 0 ] ; then # check drives again
     continue
   else
     RETVAL=1
     break
   fi
   done # BIG LOOP
 fi
 if [ ! $RETVAL -eq 0 ];then #OTHER: directory or iso
   # give option to select iso or directory containing files
   Xdialog --left --buttons-style text --title "パピーユニバーサルインストーラ" --ok-label "ISO" --cancel-label "DIR" --yesno "パピーのファイルをどこから持ってくるかを選択して下さい。

「ISO」はパピーの「.iso」ファイルのパスを選択します
「DIR」はファイルのあるディレクトリを選択します..." 0 0
   if [ $? -eq 0 ] ; then # ISO
     ISOFILE="`Xdialog --backtitle "パピーの「.iso」ファイルを選択して\n「OK」ボタンをクリックして下さい" --title "パピーユニバーサルインストーラ" --stdout --no-buttons --no-cancel --fselect "/" 0 0`"
     [ -f $ISOFILE ] || exit
     mkdir /mnt/iso
     if mount -o loop $ISOFILE /mnt/iso ; then
       SRCPATH=/mnt/iso
       ISOMOUNTED="yes"
     else
       gxmessage "エラー：isoファイルをマウントできません。終了"
       exit
     fi
   else # DIR
     SRCFPATH="`Xdialog --left --backtitle "パピーの最新のファイルを捜して下さい\nvmlinuz, initrd.gz と pup_$NEWVER.sfs、\nそしてその中のどれかを選択して\n「OK」ボタンをクリックして下さい" --title "パピーユニバーサルインストーラ" --stdout --no-buttons --no-cancel --fselect "/" 0 0`"
     [ ! $? -eq 0 ] && exit
     SRCPATH="`dirname $SRCFPATH`"
   fi
 fi
fi #if [ "$SRCPATH" = "" ];then
##### finished asking user for sources #####

###sanity check...
if [ ! -f $SRCPATH/pup_$NEWVER.sfs ];then
  Xdialog --left --title "パピーユニバーサルインストーラ： エラー" --msgbox "\"sanity check\"に失敗しました。
ファイル $SRCPATH/pup_$NEWVER.sfs
が存在しません。
このPATHはパピーファイル/pup_xxx.sfsが保存されている所です。
\"xxx\" は最新のバージョン番号です。
「OK」ボタンをクリックして中止して下さい..." 0 0
  exit
fi 
########################### got souce of Puppy files ####################

###find out if puppy already on dest...
ispupfunc $DESTFS $DESTPART
#...sets PUPVEROLD.

############################ install stage ##############################
#now to do the actual install...
case $FINALPMEDIA in
 usbflash|usbhd|ideflash|idezip) #removable media, install with syslinux/extlinux
  ################# install to USB etc #####################
  ###  Dougal: removable devices only have the one option of frugal install,
  ###+ but what about PUPMODE=3?? it should be full install to flash disk...
  ###  Is it since device name isn't permanent (for mounting on /)?
  #26mar06 JustGreg fix mbr...
  if echo "$DESTPART" | grep -q '[0-9]$' ;then #superfloppy mode has no mbr.
    DESTDRV=${DESTPART:0:3}
    dd if=/dev/$DESTDRV of=/tmp/mbr446.bin bs=446 count=1
    sync
    if [ "`hexdump -x /tmp/mbr446.bin | tr -s " " | cut -f 2-9 -d " " | grep '[1-9a-zA-Z]'`" = "" ];then
      MBRCHOICE="`Xdialog --left --title "パピーユニバーサルインストーラ" --no-cancel --stdout --menubox "ブートストラップローダコードがMBR (Master Boot Record)にないので、\nUSBドライブから起動できません。下記の中から１つを選択して\n問題を修正して下さい。個人的には、「mbr.bin」を使って成功しました。" 0 0 4 sys-nopart.mbr "JustGregが作成したブートストラップローダコードです。" mbr.bin "Syslinux packageから" mbrfat.bin "makebootfat packageから" spb2_mbr.bin "spblinuxから、Christian Ostheimerが作成" `"
    else
      MBRCHOICE="`Xdialog --left --title "パピーユニバーサルインストーラ" --no-cancel --stdout --menubox "USBのMBR(Master Boot Record)は多分そのままで大丈夫ですので、\n最初のオプションを選択して下さい。しかしUSBドライブから起動できない場合、\nBIOSの設定が正しいと確信がありパソコンがUSBからブート可能ならば、\n代わりのMBRを試して下さい。\n注、MBRの変更を選択すると、更新される前の最初の446バイト(その\nブートストラップローダ部分)のMBRは /tmp/oldmbr.binへバックアップされます。\n注、このインストーラプログラムを再実行しなくても、\nこれらのMBRを直接インストールできます：MBRは /usr/lib/syslinux の中にあり、\n「dd」プログラムを使ってコピーできます。\n例： dd if=spb2_mbr.bin of=/dev/${DESTDRV}\n注、個人的には「mbr.bin」を使って成功しました。" 0 0 5 default "何もしない。現在のMBRをそのままにする" sys-nopart.mbr "JustGregが作成したブートストラップローダコード" mbr.bin "Syslinux packageから" mbrfat.bin "makebootfat packageから" spb2_mbr.bin " spblinuxから、Christian Ostheimerが作成" `"
    fi
    rm /tmp/mbr446.bin
    if [ ! "$MBRCHOICE" = "" ];then
      if [ ! "$MBRCHOICE" = "default" ];then
        dd if=/dev/$DESTDRV of=/tmp/oldmbr.bin bs=446 count=1
        sync
        dd if=/usr/lib/syslinux/$MBRCHOICE of=/dev/$DESTDRV
        sync
      fi
    fi
  fi

  case $DESTFS in
   vfat)
     if echo "$DESTPART" | grep -q '[0-9]$' ;then
       PARTCHOICE="`Xdialog --left --title "パピーユニバーサルインストーラ" --no-cancel --stdout --menubox "ここではデフォルトのままで '続けて下さい'。\nトップエントリが選択されている事を確認してから「OK」ボタンをクリックして下さい\n\nしかし、このパピーユニバーサルインストーラを試したけれど\nそれでもパピーを起動できない時は、ここにあるいくつかの選択を試せます。\n\n個人的には「GParted」を使ってパーティションの削除と\n作成に成功しています..." 0 0 4 default "続ける" GParted "GPartedを使ってUSB/IDE-CFのパーティションの削除と再作成をする" syslinux "USB あるいは IDE-CF msdos/vfatのパーティションを起動できるようにする"`"
       [ "$PARTCHOICE" = "syslinux" ] && fixusbfunc $DESTPART $DESTFS
       [ "$PARTCHOICE" = "GParted" ] && gpartedfixusbfunc $DESTPART $DESTFS
     fi
    #params passed in: $DESTPART "$SRCPATH" $FINALPMEDIA
    echo '#!/bin/sh
DESTPART="$1"
SRCPATH="$2"
FINALPMEDIA="$3"
echo "ABSOLUTE FINAL SANITY CHECK!"
echo "You are about to install Puppy to /dev/$DESTPART, with boot parameter"
echo "PMEDIA=$FINALPMEDIA. The files vmlinuz, initrd.gz, pup_${PVERSION}.sfs, syslinux.cfg"
echo "(and maybe zdrv_${PVERSION}.sfs if it exists.)"
echo "will be written to /dev/$DESTPART and Syslinux will be used to make it bootable."
echo
echo -n "Press ENTER key to continue, CTRL-C to abort: "
read goforit
echo "Making $DESTPART bootable..."
syslinux  /dev/$DESTPART
sync
#remove old puppy1 files...
mount -t vfat /dev/$DESTPART /mnt/data
if [ -f /mnt/data/pup100 ];then
 echo "Whoa, $DESTPART has pup100 file on it. This has to be erased."
 echo "Press ENTER key only to continue, else any other letter then"
 echo -n "press ENTER to abort installation of Puppy: "
 read isnogo
 if [ ! "$isnogo" = "" ];then
  sync
  umount /dev/$DESTPART
  exit
 fi
 rm -f /mnt/data/pup100
fi
rm -f /mnt/data/image.gz 2> /dev/null
rm -f /mnt/data/usr_cram.fs 2> /dev/null
rm -f /mnt/data/pup_*.sfs #v2.11
rm -f /mnt/data/devx_*.sfs #v2.11
rm -f /mnt/data/zdrv_*.sfs #v2.16
sync
echo "Copying vmlinuz..."
cp -f $SRCPATH/vmlinuz /mnt/data/
sync
echo "Creating syslinux.cfg..."
if [ "$FINALPMEDIA" = "ideflash" ];then
 echo "default vmlinuz root=/dev/ram0 initrd=initrd.gz ide=nodma PMEDIA=$FINALPMEDIA" > /mnt/data/syslinux.cfg
else
 echo "default vmlinuz root=/dev/ram0 initrd=initrd.gz PMEDIA=$FINALPMEDIA" > /mnt/data/syslinux.cfg
fi
sync
echo "Creating marker file for wakepup boot floppy..."
[ "$FINALPMEDIA" = "usbflash" ] && touch /mnt/data/USBFLASH
[ "$FINALPMEDIA" = "ideflash" ] && touch /mnt/data/IDEFLASH
[ "$FINALPMEDIA" = "usbhd" ] && touch /mnt/data/USBHD
[ "$FINALPMEDIA" = "idezip" ] && touch /mnt/data/IDEZIP
sync
echo "Copying initrd.gz..."
cp -f $SRCPATH/initrd.gz /mnt/data/
sync
echo "Copying .sfs files..."
cp -f $SRCPATH/pup_*.sfs /mnt/data/ 2>/dev/null
sync
cp -f $SRCPATH/zdrv_*.sfs /mnt/data/ 2>/dev/null
sync
umount /mnt/data
echo -n "Finished, press ENTER key to continue: "
read moo
' > /tmp/installpup.sh
    chmod 755 /tmp/installpup.sh
    rxvt -bg "orange" -title "パピーユニバーサルインストーラ" -geometry 80x10 -e /tmp/installpup.sh $DESTPART $SRCPATH $FINALPMEDIA
    ;;
   ext[23]) #BK
    #params passed in: $DESTPART "$SRCPATH" $FINALPMEDIA
    echo '#!/bin/sh
DESTPART="$1"
SRCPATH="$2"
FINALPMEDIA="$3"
echo "ABSOLUTE FINAL SANITY CHECK!"
echo "You are about to install Puppy to /dev/$DESTPART, with boot parameter"
echo "PMEDIA=$FINALPMEDIA. The files vmlinuz, initrd.gz, pup_xxx.sfs, extlinux.conf"
echo "(and maybe zdrv_xxx.sfs if it exists.)"
echo "will be written to /dev/$DESTPART and Extlinux will be used to make it bootable."
echo
echo -n "Press ENTER key to continue, CTRL-C to abort: "
read goforit
#BK ext3 can also be mounted as ext2...
mount -t ext2 /dev/$DESTPART /mnt/data
echo "Making $DESTPART bootable..."
#extlinux -z /mnt/data
#v2.11
if echo "$DESTPART" | grep -q '[0-9]$' ;then
 extlinux /mnt/data #i think only use -z for superfloppy.
else
 extlinux -z /mnt/data
fi
sync
rm -f /mnt/data/pup_*.sfs #v2.11
rm -f /mnt/data/devx_*.sfs #v2.11
rm -f /mnt/data/zdrv_*.sfs #v2.16
sync
echo "Copying vmlinuz..."
cp -f $SRCPATH/vmlinuz /mnt/data/
sync
echo "Creating extlinux.conf..."
if [ "$FINALPMEDIA" = "ideflash" ];then
 echo "default vmlinuz root=/dev/ram0 initrd=initrd.gz ide=nodma PMEDIA=$FINALPMEDIA" > /mnt/data/extlinux.conf
else
 echo "default vmlinuz root=/dev/ram0 initrd=initrd.gz pmedia=$FINALPMEDIA" > /mnt/data/extlinux.conf
fi
sync
#note do not create wakepup marker file as it only boots msdsos/vfat.
echo "Copying initrd.gz..."
cp -f $SRCPATH/initrd.gz /mnt/data/
sync
echo "Copying .sfs files..."
cp -f $SRCPATH/pup_*.sfs /mnt/data/
cp -f $SRCPATH/zdrv_*.sfs /mnt/data/
sync
umount /mnt/data
echo -n "Finished, press ENTER key to continue: "
read moo
' > /tmp/installpup.sh
    chmod 755 /tmp/installpup.sh
    #rxvt -bg "orange" -title "パピーユニバーサルインストーラ" -geometry 80x10 -e /tmp/installpup.sh $DESTPART $SRCPATH $FINALPMEDIA
    rxvt -bg "orange" -title "パピーユニバーサルインストーラ" -geometry 80x10 -e /tmp/installpup.sh $DESTPART $SRCPATH $FINALPMEDIA $NEWVER #v2.17.1
    ;;
   *) #BK
    gxmessage "$DESTPARTは$DESTFSファイルシステムがあります。
今のところ外部vfat (FAT16/32) 或いは ext2/3 だけをサポートします。
「OK」ボタンをクリックして中止して下さい.."
    exit
    ;;
  esac
  ;; 
  ################### end USB etc. install ######################
 harddrive) 
  ####################### install to HD #########################
  # first find media type, then set FINALPMEDIA
  ########## get media type ##########
  case "$DESTPART" in
   hd*) # IDE drive
    FINALPMEDIA="idehd"
    ;;
   sd*) # scsi drives: SATA or even "real" SCSI
    FINALPMEDIA="satahd"
    ## comment this out for now -- need info on "real" scsi drives
    #ADEV=${DESTPART%[0-9]}
    #ADIR=`find /sys -type d -name "$ADEV"`
    #SDINFO="`probedisk | grep "/dev/$ADEV"`"
    #SDINFO="`cat $ADIR/device/model`"
    #case "$SDINFO" in ##TODO: need to make this better
    ## maybe "model" doesn't have "ATA", maybe find "Vendor" in /proc/scsi/scsi
     #*ATA*) FINALPMEDIA="satahd" ;;
     #*) FINALPMEDIA="usbhd" ;;
    #esac
    ;;
  esac
  ###
 #scsihd|idehd|satahd) #internal media, boot with boot-disk or grub.
  #arrive here with DESTPART & DESTFS where installing to, PMEDIA boot param FINALPMEDIA,
  #SRCPATH where to get vmlinuz, initrd, pup_xxx.sfs, PUPVEROLD is old puppy version in
  #format 200 (without dots) =0 if no prior installed puppy,
  #NEWVER is new puppy version, DESTSIZM is size of dest partition in Mb (real number),
  
  ### get mountpoint of partition (mount if needed)
  DESTMNTPT="`mount | grep "/dev/$DESTPART" | tr -s " " | cut -f 3 -d " "`"
  #v2.02 ntfs-3g needs this...
  #[ "$DESTMNTPT" = "" ] && DESTMNTPT="`ps -e | grep -o ntfs\-3g.* | grep "/dev/$DESTPART" | sed -e 's/[^a-zA-Z0-9/._\-]/ /g' | tr -s ' ' | tr ' ' "\n" | grep '^/mnt/'`"
  
   [ "$DESTMNTPT" = "" ] && DESTMNTPT="`ps -e | grep -o 'ntfs\-3g.*' | grep "/dev/$DESTPART" | tr '\t' ' ' | tr -s ' ' | tr ' ' "\n" | grep '^/mnt/'`"
  # if not mounted, mount
  if [ "$DESTMNTPT" = "" ];then
    [ -d /mnt/$DESTPART ] || mkdir /mnt/$DESTPART
    if mount -t $DESTFS /dev/$DESTPART /mnt/$DESTPART ; then
      DESTMNTPT="/mnt/$DESTPART"
    else
      gxmessage "エラー： $DESTPARTをマウントできません。終了します。"
      exit
    fi
  fi
  ##########
  
  ########## Decide on type of installation ##########
  #choose option1 or option2 install...
  #option1: files vmlinuz, initrd.gz, pup_xxx.sfs, to dest partition.
  #option2: file vmlinuz to partition, contents of pup_xxx.sfs to partition.
  if [ $PUPVEROLD -eq 0 ];then
    PREVPUPMSG="これは新規インストールのようです。"
  else
    PREVPUPMSG="パピーはすでにインストールされています。バージョンは$PUPVEROLDで、アップグレードするか完全に取り換えるか選択できます。"
  fi
  INSTOPTION="1"
  case "$DESTFS" in
   vfat) ;; # can only do type 1
   ntfs) Xdialog --title "パピーユニバーサルインストーラ" --no-cancel --msgbox "パピーをNTFSパーティションにインストールする選択をしました。
どうやってNTFSからブートするかは「www.murga.org/~puppy/viewtopic.php?t=9699 」を
参考にして下さい" 0 0
     ;;
   *) # Linux fs
    Xdialog --left --buttons-style text --title "パピーユニバーサルインストーラ" --ok-label "1: COEXIST" --cancel-label "2: NORMAL" --yesno "/dev/$DESTPARTにインストールする選択をしました。それは\n内蔵ハードディスク ($FINALPMEDIA)のようです。
$PREVPUPMSG 

パピーをこのパーティションにインストールするには２つの方法があります：

オプション１(\"frugal\" インストール)(推奨):
vmlinuz, initrd.gzとpup_$NEWVER.sfsファイルをこのパーティションにコピーし、個人的な
設定をpup_saveファイルに保存します（CDから実行するように）。そのパーティションの既存データ
はそのままの状況に保ちます。
利点：
- 同じパーティションにインストールしてある他のディストリビューションと共存できます。
- アップグレードがより簡単です：新しい「.iso」ファイルをダウンロードし、上述したファイルを新しいバージョン
のものに交換するだけです。(Isomasterを使うか、或いはCDを焼いた後）
- ライブCDのように実行します：完全にRAMの中で実行します。
- 「.sfs」アドオンの使用を可能にします。

オプション２(\"full\" インストール):
一般のリナックスインストールで、パピーはそのパーティション全体を使用します。 
このオプションは少ないRAM（128MB以下）のパソコンにお薦めします。

注意：オプション１はブートローダ（Grubなど）でしか起動できません。
オプション２については、次のいずれか或いは全部の方法で起動できます：フロッピ/usbブート
ディスク、Grubブートローダ。

オプション１は「COEXIST」をクリック...
オプション２なら「NORMAL」をクリック...
ウィンドウの「close」をクリックして中止..." 0 0
    RET_VAL=$?
    [ $RET_VAL -eq 255 ] && exit
    [ $RET_VAL -eq 1 ] && INSTOPTION="2"
    ;;
  esac
  ###
  
  ########## do the installation to HD ##########
  #INSTOPTION, install puppy to DESTPART...
  if [ "$INSTOPTION" = "1" ];then
    ## Dougal: moved copying of files into fs sections -- in case grub exists
    
    #if echo -n "$DESTFS" | grep -E -q 'msdos|vfat' ;then
    if [ "$DESTFS" = "vfat" ] ; then # Dougal: fsfunc returns vfat for both!
      # copy files
      Xdialog --title "パピーユニバーサルインストーラ" --msgbox "しばらくお待ち下さい。ファイルを$DESTPARTへコピーしています..." 0 0 &
      XPID=$!
      cp -f $SRCPATH/vmlinuz $DESTMNTPT/
      sync
      cp -f $SRCPATH/initrd.gz $DESTMNTPT/
      sync
      cp -f $SRCPATH/*_$NEWVER.sfs $DESTMNTPT/
      sync
      touch $DESTMNTPT/$FINALPMEDIA #needed by WakePup
      sync
      kill $XPID
      umount /dev/$DESTPART
      
      Xdialog --left --title "パピーユニバーサルインストーラ" --ok-label "CREATE_BOOT_DISK" --cancel-label "NO_BOOT_DISK" --yesno "フロッピーディスクを使ってパピーを起動できます。\nパソコンをスキャンしてパピーがどこにインストールしているかを検出する「WakePup2」と言う\n一般的なブートフロッピを提供しています。" 0 0
      if [ $? -eq 0 ];then
        /usr/sbin/wakepup2
      fi
    elif [ "$DESTFS" = "ntfs" ] ; then
      # copy files
      Xdialog --title "パピーユニバーサルインストーラ" --msgbox "しばらくお待ち下さい。ファイルを$DESTPARTへコピーしています..." 0 0 &
      XPID=$!
      cp -f $SRCPATH/vmlinuz $DESTMNTPT/
      sync
      cp -f $SRCPATH/initrd.gz $DESTMNTPT/
      sync
      cp -f $SRCPATH/*_$NEWVER.sfs $DESTMNTPT/
      sync
      touch $DESTMNTPT/$FINALPMEDIA #needed by WakePup
      sync
      kill $XPID
      umount /dev/$DESTPART
          
      Xdialog --left --title "パピーユニバーサルインストーラ" --no-cancel --msgbox "完了。
下記のファイルを$DESTPARTにコピーしました：
vmlinuz, initrd.gz and pup_$NEWVER.sfs 
vmlinuzはカーネルで、initrd.gzはイニシャルRAMディスクです。

どうやってNTFSから起動するかは
www.murga.org/~puppy/viewtopic.php?t=9699
をもう一度参考にして下さい..." 0 0
    else # DESTFS=Linux partition      
      # search for grub. if found, add entry to menu.lst
      # else, run grubconfig with partition and flag for initrd
      find_grub_install 
      if [ $? -eq 0 ] ; then # add entry
        # copy files -- initrd and vmlinuz go in grub /boot dir...
        BOOTDIR=${LISTFILE%/*}
        Xdialog --title "パピーユニバーサルインストーラ" --msgbox "しばらくお待ち下さい。ファイルを$DESTPARTへコピーしています..." 0 0 &
        XPID=$!
        #mkdir $BOOTDIR/puppy$NEWVER
        cp -af $SRCPATH/vmlinuz $DESTMNTPT/ #$BOOTDIR/puppy$NEWVER/
        sync
        cp -af $SRCPATH/initrd.gz $DESTMNTPT/ #$BOOTDIR/puppy$NEWVER/
        sync
        cp -f $SRCPATH/*_$NEWVER.sfs $DESTMNTPT/
        sync
        kill $XPID
        # add entry
        add_grub_entry frugal
        RET_VAL=$?
        if [ $RET_VAL -eq 1 ] ; then 
          #didn't find "# Linux bootable" line
          gxmessage "残念、Grubメニューファイルにエントリを追加できません"
        elif [ $RET_VAL -eq 2 ] ; then 
          echo "user cancelled"
        fi
      else #couldn't find grub
        # copy files
        Xdialog --title "パピーユニバーサルインストーラ" --msgbox "しばらくお待ち下さい。ファイルを$DESTPARTへコピーしています..." 0 0 &
        XPID=$!
        cp -f $SRCPATH/vmlinuz $DESTMNTPT/
        sync
        cp -f $SRCPATH/initrd.gz $DESTMNTPT/
        sync
        cp -f $SRCPATH/*_$NEWVER.sfs $DESTMNTPT/
        sync
        touch $DESTMNTPT/$FINALPMEDIA #needed by WakePup
        sync
        kill $XPID
        umount /dev/$DESTPART
        # ask about installing Grub and run grubconfig
        Xdialog --left --title "パピーユニバーサルインストーラ" --ok-label "INSTALL GRUB" --cancel-label "QUIT" --yesno "Grubがパソコンにインストールされていないようです。

「INSTALL GRUB」をクリックするとgrubconfigを実行してGrubをインストールします。

「QUIT」をクリックするとGrubをインストールしないでインストーラを終了します" 0 0
        if [ $? -eq 0 ] ; then # give fileselect dialog
          grubconfig /dev/$DESTPART
          ## might change above to just device!
          # need to check it's ok
        else #quit
          echo "cancelled"
        fi
      fi      
      # clean up (flag set when searching for grub list)
      [ "$MAYBEFLAG" ] && umount $MAYBEPNT
    fi
    #finished. could put up a final dlg here, then quit script.
    Xdialog --title "パピーユニバーサルインストーラ" --msgbox "OK、全て完了！" 0 0
    exit #v2.17 BK added this, otherwise adds another full-hd grub entry further down.
  
  else ########## h.d. OPTION 2 INSTALL ##########
    #upgrade, ask if want delete partition...
    if [ ! $PUPVEROLD -eq 0 ];then
      Xdialog --left --buttons-style text --title "パピーユニバーサルインストーラ" --ok-label "アップグレード" --cancel-label "消去" --yesno "パピーはすでに$DESTPARTにインストールされています。\nアップグレードしますか？或いはこのパーティションを完全に消去しますか？\n\n最後の整合性チェック：$DESTPARTは正しいパーティションですか？\n（注意、$DESTPARTは　$DESTMNTPTにマウントされています -- よろしいですか？）\n\nアップグレードするには「アップグレード」ボタンをクリック...\nパーティションを消去するには「消去」ボタンをクリックして下さい...\n終了するには「ウィンドウクローズボックス」をクリックして下さい..." 0 0
      RET_VAL=$?
      if [ $RET_VAL -eq 255 ];then
        rox -D "$DESTMNTPT"
        sync
        umount $DESTMNTPT 2>/dev/null
        exit
      elif [ $RET_VAL -eq 1 ];then #no
        Xdialog --title "パピーユニバーサルインストーラ" --no-buttons --infobox "しばらくお待ち下さい、$DESTPARTのファイルを消去しています..." 0 0 50000 &
        XPID=$!
        sleep 3
        rm -rf $DESTMNTPT/*
        sync
        kill $XPID
      fi
    fi #if [ ! $PUPVEROLD -eq 0 ];then
    # Start installing
    Xdialog --title "パピーユニバーサルインストーラ" --no-buttons --infobox "しばらくお待ち下さい、$DESTPARTにパピーのファイルをコピーしています..." 0 0 120000 &
    XPID=$!
    sleep 1
    ## Dougal: not clear to me why we're not just copying the files from pup_ro2
    ## (maybe so can upgrade without burning new version cd?)
    #loop-device mount pup_xxx.sfs in DESTPART, copy contents of pup_xxx.sfs to DESTPART...
    losetup-FULL /dev/loop2 $SRCPATH/pup_$NEWVER.sfs
    mkdir $DESTMNTPT/srcmntpt
    mount -r -t squashfs /dev/loop2 $DESTMNTPT/srcmntpt
    cp -a -u --remove-destination $DESTMNTPT/srcmntpt/bin $DESTMNTPT/
    cp -a -u --remove-destination $DESTMNTPT/srcmntpt/dev $DESTMNTPT/
    cp -a -u --remove-destination $DESTMNTPT/srcmntpt/etc $DESTMNTPT/
    cp -a -u --remove-destination $DESTMNTPT/srcmntpt/lib $DESTMNTPT/
    cp -a -u --remove-destination $DESTMNTPT/srcmntpt/mnt $DESTMNTPT/
    cp -a -u --remove-destination $DESTMNTPT/srcmntpt/proc $DESTMNTPT/
    cp -a -u --remove-destination $DESTMNTPT/srcmntpt/root $DESTMNTPT/
    cp -a -u --remove-destination $DESTMNTPT/srcmntpt/sbin $DESTMNTPT/
    cp -a -u --remove-destination $DESTMNTPT/srcmntpt/tmp $DESTMNTPT/
    cp -a -u --remove-destination $DESTMNTPT/srcmntpt/usr $DESTMNTPT/
    cp -a -u --remove-destination $DESTMNTPT/srcmntpt/var $DESTMNTPT/
    [ -d $DESTMNTPT/srcmntpt/opt ] && cp -a -u --remove-destination $DESTMNTPT/srcmntpt/opt $DESTMNTPT/ #v2.11
    #v2.12 external modules file...
    [ -f $SRCPATH/zdrv_$NEWVER.sfs ] && cp -af $SRCPATH/zdrv_$NEWVER.sfs $DESTMNTPT/
    [ -f /zdrv_$NEWVER.sfs ] && cp -af /zdrv_$NEWVER.sfs $DESTMNTPT/
    #v2.12 also copy the 'fetched' kernel modules...
    #no, as a fetched module may also have firmware and that would have to
    #be copied also...
    #cp -a -f /lib/modules/$KERNVER/* $DESTMNTPT/lib/modules/$KERNVER/
    #v2.12 not really necessary, but copy this too...
    #no, as fetched modules are commented-out by modprobe script...
    #[ -f /lib/modules/firmware.dep.$KERNVER ] && cp -a -f /lib/modules/firmware.dep.$NEWVER $DESTMNTPT/lib/modules/firmware.dep.$KERNVER
    #but, do copy this...
    if [ -d /lib/modules/$KERNVER/initrd ];then
      mkdir -p $DESTMNTPT/lib/modules/$KERNVER/initrd
      cp -af /lib/modules/$KERNVER/initrd/* $DESTMNTPT/lib/modules/$KERNVER/initrd/
      depmod -b $DESTMNTPT
    fi
    mkdir $DESTMNTPT/sys 2>/dev/null
    rm -f $DESTMNTPT/var/log/modprobes.log 2>/dev/null #v2.13 see /sbin/modprobe script.
    #...not necessary, not using this any more.
    sync
    kill $XPID
    #fix space optimisation links into initrd...
     #TODO
    #chroot to DESTPART, set /etc/puppyversion back to PUPVEROLD, run rc.update
    Xdialog --title "パピーユニバーサルインストーラ" --no-buttons --infobox "しばらくお待ち下さい、rc.updateスクリプトを実行しています..." 0 0 60000 &
    XPID=$!
    sleep 2
    echo -n "$PUPVEROLD" > $DESTMNTPT/etc/puppyversion #set it back to what it was.
   
    #chroot $DESTMNTPT -c /etc/rc.d/rc.update option2hdinstall
    #busybox chroot does not have -c ...
    chroot $DESTMNTPT /etc/rc.d/rc.update option2hdinstall
    #(need to tell rc.update where src files are, as passed param)
    sync
    # create appropriate fstab
    mv -f $DESTMNTPT/etc/fstab $DESTMNTPT/etc/fstab.bak
    echo "/dev/$DESTPART     /            $DESTFS     defaults               0 1" > $DESTMNTPT/etc/fstab
    echo "none          /proc        proc     defaults               0 0" >> $DESTMNTPT/etc/fstab
    echo "none          /sys         sysfs    defaults               0 0" >> $DESTMNTPT/etc/fstab
    echo "none          /dev/pts     devpts   gid=2,mode=620         0 0" >> $DESTMNTPT/etc/fstab
    echo "/dev/fd0      /mnt/floppy  auto     noauto,rw              0 0" >> $DESTMNTPT/etc/fstab
    #echo "/dev/cdrom    /mnt/cdrom   iso9660  noauto,ro              0 0" >> $DESTMNTPT/etc/fstab
    sync
    kill $XPID
    umount $DESTMNTPT/srcmntpt
    rmdir $DESTMNTPT/srcmntpt
  fi # if INSTOPTION
  ########## installation is finished ##########
  
  ########## install GRUB, create boot-disk etc ##########
  ## Dougal: first look and see if we aleady have grub installed
  find_grub_install 
  if [ $? -eq 0 ] ; then # add entry
    #mkdir -p $DESTMNTPT/boot/puppy$NEWVER
    mkdir -p $DESTMNTPT/boot
    #cp -af $SRCPATH/vmlinuz $DESTMNTPT/boot/puppy$NEWVER/
    cp -af $SRCPATH/vmlinuz $DESTMNTPT/boot/
    sync
    add_grub_entry
    RET_VAL=$?
    if [ $RET_VAL -eq 1 ] ; then #didn't find "# Linux bootable" line
      gxmessage "残念、Grubメニューファイルにエントリを追加できません"
    elif [ $RET_VAL -eq 2 ] ; then 
      echo "user cancelled"
    fi
  # the next loop doesn't have to run...
  INSTOPTION=0
  # clean up (flag set when searching for grub list)
  [ "$MAYBEFLAG" ] && umount $MAYBEPNT
  fi  
  #make bootable...
  #usb/floppy boot disk, or grub.
  while [ "$INSTOPTION" = "2" ];do
#TODO needs work, as could have usb hd, that cannot unplug and do not want it to be turned
#     into a boot disk!...
   Xdialog --left --buttons-style text --title "パピーユニバーサルインストーラ" --ok-label "USBからブート" --cancel-label "GRUBをインストール" --yesno "問題がなければパピーは $DESTPARTにインストールされました。\n\
しかしパピーをどうやって起動するかと言う少し難しい問題にぶつかります。\n\
下記の１、２の方法で解決できます：\n\
\n\
ブートディスク： フロッピーディスクかUSBペンドライブを使ってパピーを起動します。\n\
GRUB:      GRUBをハードディスクにインストールします。\n\
\n\
もし、すでにGRUBをハードディスクにインストールしてあるなら、GRUBのオプションを\n\
選択し、パピーをブートメニューに追加して再インストールすればいいてす。\n\
\n\
USBフラッシュペンドライブをブートディスクとして使いたければ「USBからブート」をクリックして下さい\n\
このユニバーサルインストーラスクリプトはUSBブートディスクを作成した時点で\n\
このダイアログウィンドウに戻ります。\n\
注意、パソコンにフロッピードライブがない、或いはハードディスクにGRUBをインストールしていない場合だけ\n\
このオプションを選んで下さい。\n\
\n\
「GRUBをインストール」をクリックしてGRUBブートマネージャをインストールして下さい。\n\
GRUBをハードディスクにインストールすると同時にフロッピブートディスクを作成する選択が\n\
あります。\n\
\n\
USBブートディスクを選択した場合、続ける前にUSBペンドライブを今すぐ挿入して下さい！\n\
 (ペンドライブの中の全てのファイルは削除されます)\n\
 アンマウントの状態であるべきです　--　続ける前に確認して下さい" 0 0
   if [ $? -eq 0 ];then #BOOT DISK
     BOOTPART=""
     ## Dougal: this needs improving... 
     ## start from higher sd, since HD is likely to be detected first at boot
     DEVS="`grep 'sd[a-z]$' /proc/partitions | tr -s ' ' | cut -d' ' -f5 |sort -r | tr '\n' ' '`"
     for ADEV in $DEVS
     do
       if disktype /dev/$ADEV | grep "file system" | grep -q "^FAT" ; then
         BOOTPART="$ADEV"
         break
       elif disktype /dev/${ADEV}1 | grep "file system" | grep -q "^FAT" ; then
         BOOTPART="${ADEV}1"
         break
       fi
     done
#    [ ! "`disktype /dev/fd0 | grep "file system" | grep "^FAT"`" = "" ] && BOOTPART="fd0"
     if [ ! "$BOOTPART" = "" ];then
       Xdialog --left --title "パピーユニバーサルインストーラ" --yesno "パピーユニバーサルインストーラ" --yesno "パピーのブートディスクに '$BOOTPART'を作成するか確認して下さい。\n注意、パソコンにUSBハードディスクかSATAハードディスクがある場合は特に注意が必要です。\nなぜなら、これらのデバイスはリムーバブルフラッシュペンドライブと同じ「sd」と名前が付けられます。\nもしパピーがこのデバイスを間違えて認識した場合「No」と答えて下さい...\n\n正しいデバイスであれば「Yes」ボタンをクリックして下さい..." 0 0
       [ ! $? -eq 0 ] && continue
     fi
     if [ ! "$BOOTPART" = "" ];then
       cp -af $SRCPATH/vmlinuz $DESTMNTPT/
       sync
       Xdialog --title "パピーユニバーサルインストーラ" --msgbox " $BOOTPART ブートディスクを作成しています..." 0 0 &
       XPID=$!
       #passed params $BOOTPART $DESTPART $SRCPATH $FINALPMEDIA
       echo '#!/bin/sh
       BOOTPART="$1"
       DESTPART="$2"
       SRCPATH="$3"
       FINALPMEDIA="$4"
       mkdir /tmp/bootdiskmntpt 2> /dev/null
       mount -t msdos /dev/$BOOTPART /tmp/bootdiskmntpt
       rm -rf /tmp/bootdiskmntpt/*
       echo "Creating syslinux.cfg on /dev/$BOOTPART..."
       echo "default vmlinuz root=/dev/$DESTPART PMEDIA=$FINALPMEDIA" > /tmp/bootdiskmntpt/syslinux.cfg
       echo "Writing the Linux kernel, vmlinuz, to /dev/$BOOTPART..."
       cp -f $SRCPATH/vmlinuz /tmp/bootdiskmntpt/
       sync
       umount /dev/$BOOTPART
       rmdir /tmp/bootdiskmntpt
       echo "Making the /dev/$BOOTPART bootable using Syslinux..."
       syslinux /dev/$BOOTPART
       sync
       echo -n "Done. Press ENTER key: "
       read allisdone
' > /tmp/installpup.sh
       chmod 755 /tmp/installpup.sh
       rxvt -bg "orange" -title "パピーユニバーサルインストーラ" -geometry 80x10 -e /tmp/installpup.sh $BOOTPART $DESTPART $SRCPATH $FINALPMEDIA

       kill $XPID
     fi
   else #Grub
     mkdir -p $DESTMNTPT/boot/grub
     cp -af $SRCPATH/vmlinuz $DESTMNTPT/boot/
     sync
     umount $DESTMNTPT
     Xdialog --left --title "パピーユニバーサルインストーラ" --msgbox " \"grubconfig\" スクリプトを実行しようとしています。\nデフォルトのままにして下さい。最初の質問は簡単なインストールをするかどうかです。\nそのデフォルトオプションのままにして下さい。\nデフォルトのオプションと違う選択をするのは\nGrubをどこにインストールするかと聞かれた時です。 \"MBR\"を選択して下さい。" 0 0
     #unmountcdfunc
     if [ "$MOUNTFLAG" ] ; then
       rox -D $CDMNTPNT 
       umount $CDMNTPNT
       MOUNTFLAG=""
     fi
     while [ 1 ];do
       grubconfig /dev/$DESTPART
       #...if choose to create a boot floppy, writes 'no' to /tmp/loopbrk.txt.
       Xdialog --title "パピーユニバーサルインストーラ" --yesno "ブートフロッピーの作成或いはハードディスクのインストールをする為にgrubconfigを実行したら、\n\
「Yes」ボタンをクリックしてgrubconfigスクリプトを再実行して、もう１枚のブートフロッピーを作成するか\n\
「GRUB]のハードディスクへのインストール或いは再インストールをして下さい。\n\
もし「Yes」を選択したら、前のように全てデフォルトのままにして下さい。\n\
\n\
「grubconfig」を再実行するには「Yes」をクリック...\n\
インストールが完了したら「No」をクリックして下さい..." 0 0
       [ ! $? -eq 0 ] && break
     done
     rm -f /tmp/loopbrk.txt
     exit
   fi
   Xdialog --title "パピーユニバーサルインストーラ" --yesno "前に戻ってもう１枚のブートディスク、或いはGrubブートを作成しますか？..." 0 0
   [ ! $? -eq 0 ] && break
  done
  umount $DESTMNTPT 2> /dev/null
  ;; 
  ################ end harddrive install section #################
 idecd|scsicd|usbcd)
  gxmessage "まだ実行していません"
  #TO DO
  ;;
esac
############################ finished installing ##########################
[ "$ISOMOUNTED" ] && umount /mnt/iso && rm -f /mnt/iso
if [ "$MOUNTFLAG" ] ; then
 rox -D $CDMNTPNT 
 umount $CDMNTPNT
fi
#unmountcdfunc

###END###
