#!/bin/sh
# Copyright (C) 1993 David Niemi
# The author places no restrictions on the use of this script.

#
# Partial port to HP/UX by Michel Eyckmans (MCE) <eyckmans@imec.be>.
# Only DOS formatting capability is missing.
#
 
# this script requires mtools (except on HP/UX). If you don't have
# it, get it from prep.ai.mit.edu: /pub/gnu or other GNU repositories.
 
# modified by Patrick Volkerding (volkerdi@mhd1.moorhead.msus.edu)
# and IBM RS6000 compatibility by Torben N. Rasmussen (tnr@csd.cri.dk)
 
# Extensive cleanup/functionality additions by John Plocher (plocher@sun.com)
# Provides interactive prompts to make disk mastering easier
# Run this script in the directory containing the directories "a" "ap" ...
 
# Modified for Sun compatibility by Ted Kandell (ted@cashtrade.com)
# Solaris 2.4 has a bug where the filesystem capacity for the floppy isn't reset
# unless the new floppy is labelled with fdformat
# Volume Management (vold) has a bug where the floppy device always is busy
# even if there is nothing in the drive - the solution is to kill vold
# Don't run Volume Management

# Modified by Patrick Volkerding, 3/98.  In light of the fact that Slackware
# has grown from 10 floppy disks (including the bootdisk!) in its original
# release back in 1993 to over 100 floppies, the ability to install other
# than the base A series from floppy disk has been removed.  Basically, the
# move allows much more streamlined development, since packages can be changed
# in size without having to shuffle things around to make it all fit on 
# floppies.  Also, recently some pieces of very nice software have become
# available for Linux where the main binary is so large that even compressed
# it won't fit on a floppy disk.  So, a decision had to be made.  For the
# forseeable future, installing the A series from floppy disk *will* be
# maintained and supported.  Once you've got that up and running it's not
# too hard to fit a way to get the other packages into your system for
# installation.

# Edit this as needed
 
MTOOLS=/usr
 
# Global defaults
 
export PATH LD_LIBRARY_PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/ucblib:$MTOOLS/lib
PATH=$PATH:$MTOOLS/bin
 
format=$MTOOLS/bin/fdformat
copy=$MTOOLS/bin/cp
erase=$MTOOLS/bin/rm
eject="eject floppy"
 
dollar='$'
 
set -e  # Exit on error
 
# Number of disks in each set
 
a=11
ap=1
d=1
e=1
f=1
k=1
n=8
t=1
tcl=1
x=1
xap=1
xd=1
xv=1
y=1
 
# Descriptions of the packages
 
at="Base Linux"
apt="Text based applications"
dt="Program Development/GCC c|c++|obj-C kernel source and more"
et="Emacs"
ft="FAQs"
kt="Kernel source and includes"
nt="Networking/UUCP/Mail/News"
tt="TeX"
tclt="Tcl Script Language/Tk Toolkit"
xt="XFree86 X Window System"
xapt="X Applications"
xdt="X11 Server Development"
xvt="XView (OpenLook Window Manager)"
yt="Games"
 
# Only the A series fits on floppy disks any more.  Have to use Zip
# disks for the rest of them. :^)
#PACKAGES="a ap d e f k n t tcl x xap xd xv y"
PACKAGES="a n"
 
##########################################################################
# These routines are only used on an hp/ux host
#
hpuxdosformat () {
  echo "*** Warning *** No format on HP/UX, trying without !"
  ## The mediainit utility can do a low level format, but there
  ## seems to be no way to create an MS-DOS filesystem.
  return 0
}
 
hpuxdoserase() {
  # HACK: We can ignore our $* here, since we just want to remove
  #       everything anyway. HP/UX dos commands don't know about
  #       filename completion, so we have to do it the hard way.
  files=`dosls $FD`
  if [ "$files" != '' ]
  then
      dosrm -r $files     
  fi
}
 
hpuxdoswrite() {
  for file in $*
  do
      if [ "$file" != "$FD" ]
      then
	  echo Copying $file ...
          doscp -f $file $FD`basename $file`
      fi
  done
  return 0
}
 
hpuxeject(){
  echo "Please eject floppy disk now"
}

# 
#       (End of HP/UX specific routines)
##########################################################################
 
##########################################################################
# These routines are only used on an aix host
#
aixdosformat () {
  Echo "Formatting..."
  dosformat > /dev/null << EOI
 
n
EOI
  echo "done"
  return 0
}
 
aixdoswrite() {
  for file in $*; do
    if [ "$file" != "$FD" ]; then
      echo Copying $file ...
      doswrite $file `basename $file` > /dev/null
    fi
  done
  return 0
}
 
aixeject(){
  echo "Please eject floppy disk now"
}
# 
#       (End of AIX specific routines)
##########################################################################

# Linux specific formatting routines:
 
Linuxaformat() {
	fdformat /dev/fd0H1440
        if [ $? = 0 ]; then
         mformat a:
        else
         return 1;
        fi
        return $?
}

Linuxbformat() {
	fdformat /dev/fd1H1440
        if [ $? = 0 ]; then
         mformat b:
        else
         return 1;
        fi
        return $?
}
 
##########################################################################
#                       Common routines
##########################################################################
 
Echo() {
        if [ "`echo -n `" != "'-n'" ]
	then
            echo -n $*' '
	else
            echo $*' '"\c"
	fi
}
 
##########################################################################
 
Prompt() { # => diskno alldone duplicate eraseit
        my_IMAGE="$1"
        my_default="$2"
        my_disk="$3"
        my_diskno="$4"
        my_maxdisk="$5"
        my_series="$6"
        my_descrip="$7"
 
        valid_answer="no"
        my_need_help="yes"
        imagename=$my_diskno
 
        while [ "$valid_answer" = "no" ]; do
                if [ "$my_need_help" = "yes" ]; then
                    my_need_help="no"
                    echo "__"
                  if [ -z "$my_IMAGE" ]; then
                    echo "[$my_disk] disk $my_diskno of $my_maxdisk (${my_descrip})"
                  else
                    echo "[$my_disk] ${my_descrip}"
                  fi
                    echo "  Please insert a blank floppy and press"
                    echo "    [q]  to Quit this program"
                    echo "    [h]  to show this Help message"
                    echo "    [f]  to Format floppy and duplicate disk image"
                    echo "    [d]  to Duplicate disk image"
                  if [ -z "$my_IMAGE" ]; then
                    echo "    [l]  to List the contents of disk \"$my_series$my_diskno\""
                    echo "    [sd] to Skip this Disk \"$my_series$my_diskno\""
                    echo "    [ss] to Skip the entire \"$my_series\" Series"
                  else
                    echo "    [l]  to List the possible disk images"
                    echo "    [c]  to Choose a disk image"
                    echo "    [s]  to Skip this disk image"
                    echo "    Current image: $my_diskno"
                  fi
                fi
 
                Echo "__Choice: [$my_default]: "
                answer="invalid"
                read answer junk
                if [ -z "$answer" ]; then
                        answer="$my_default"
                fi
	
                case $answer in
                q*) echo "Quitting"; exit 0 ;;
                h*) my_need_help=yes;;
                c*)
                    if [ -n "$my_IMAGE" ]; then
                        Echo "$disk image: [$my_diskno]: "
                        read imagename junk
                        if [ -z "$imagename" ]; then
                            imagename="$default_image"
                        fi
                        if [ ! -r "$imagename" ]; then
                           echo "ERROR: \"$imagename\" is not readable."
                        else
                           my_diskno=$imagename
                        fi
                    fi;
                    ;;
                l*)
                    if [ -z "$my_IMAGE" ]; then
                        ls -Fl $my_series$my_diskno/.??* $my_series$my_diskno/* | cut -c30-41,54-
                    else
                        ls -Fl $my_IMAGE | cut -c30-41,54-
                    fi
                    duplicate=no
                    alldone=no
                    eraseit=no
                    ;;
                sd)
                    if [ -z "$my_IMAGE" ]; then
                        alldone=yes
                        valid_answer=yes
                    else
                        echo "ERROR: Invalid entry.  Try again"
                    fi
                    ;;
                ss)
                    if [ -z "$my_IMAGE" ]; then
                        diskno=$my_maxdisk;
                        alldone=yes
                        valid_answer=yes
                    else
                        echo "ERROR: Invalid entry.  Try again"
                    fi
                    ;;
                s*)
                    if [ -z "$my_IMAGE" ]; then
                        Echo "Skip what? [d]=disk [s]=series: [d]: "
                        answer="invalid"
                        read answer junk
                        if [ -z "$answer" ]; then
                                answer="d"
                        fi
                        case $answer in
                                d) alldone=yes;
                                   valid_answer=yes;;
                                s) diskno=$maxdisk;
                                   alldone=yes;
                                   valid_answer=yes;;
                                *) echo "invalid entry - try again";;
                        esac
                    else
                        alldone=yes
                        valid_answer=yes
                    fi
                    ;;
                d*) 
                    if [ -z "$forceformat" ]; then
                       duplicate=yes
                       eraseit=yes
                       default="d"
                       valid_answer=yes
                       break
                    else
                       echo labelling $device as \"$disk\"
                       label="-x -b $disk"
                       if $format $label; then
                             duplicate=yes
                             eraseit=no
                             valid_answer=yes
                             break
                       else
                             echo "Error: labelling failed!"
                             $eject
                       fi
                       break
                    fi
                    ;;
                f*) default="f"
                    if [ "X$forceformat" != "X" ]; then
                       label="-b $disk"
                    fi
                    if $format $label; then
                          duplicate=yes
                          eraseit=no
                          valid_answer=yes
                          break
                    else
                          echo "Error: format failed!"
                          $eject
                    fi
                   ;;
                *)
                   echo "ERROR: Invalid entry.  Try again"
                   ;;
                esac
        done;
}
 
##########################################################################
 
CopyImage()
{
    alldone=no
 
    echo
    echo "=== $descrip ==="
 
    while [ "$alldone" = "no" ]; do
            Prompt "$images" "f" "$disk" "$default_image" "" "" "${descrip}"
            if [ "$alldone" != "no" ]; then break; fi
 
            if [ "$duplicate" = "yes" ]; then
                if [ -r $imagename -o -r $imagename.gz ]; then
                    if [ "`basename $imagename .gz`" != "$imagename" ]; then # compressed
                        gzip -cd $imagename | dd of=$device obs=18k 
                        $eject
                        alldone=yes
                    else # uncompressed
                        dd of=$device obs=18k if=$imagename 
                        $eject
                        alldone=yes
                    fi
                    break;
                else
                    echo
                    echo "ERROR: \"$imagename\" does not exist."
                fi
            fi
 
    done
}
 
##########################################################################
 
CopyDisk()
{
    while [ "$alldone" = "no" ]; do
        Prompt "" "$default" "$disk" "$diskno" "$maxdisk" "$series" "${descrip}"
        if [ "$alldone" != "no" ]; then break; fi
        if [ "$duplicate" = "yes" ]; then
            if [ ! -d "$disk" ]; then
                    echo "ERROR: Disk Image Directory \"$disk\" does not exist!"
            else
                    set +e
                    if [ "X$mount" != "X" ]; then
                       sleep 2
                       echo mounting $FD
                       if $mount $FD; then
                          sleep 1
                       else
                          if [ "X$umount" != "X" ]; then
                             sleep 1
                             $umount $FD
                          fi
                          continue
                       fi
                    fi  
                    if [ "X$eraseit" = "Xyes" ]; then
                       $erase $FD/\* 2>&1 > /dev/null
                    fi
                    echo copying contents of disk \"$disk\" to $FD ...
                    if $copy $disk/* $FD; then
                            alldone=yes
                            if [ "X$umount" != "X" ]; then
                               sleep 2
                               echo unmounting $FD
                               $umount  $FD
                               sleep 1
                            fi  
                            $eject
                    else
                            echo "ERROR: $copy $disk/\* $FD failed!"
                            if [ "X$umount" != "X" ]; then
                               sleep 2
                               echo unmounting $FD
                               $umount  $FD
                               sleep 1
                            fi
                            $eject
                            set -e
                            continue
                    fi
                    set -e
            fi
        fi
    done
}
 
########################################################################
 
 
 
 
echo "########################################################################"
echo "            Linux Slackware 3.3.0 disk mastering utility"
echo "########################################################################"
echo
echo "This program should be run in the directory containing the"
echo "Linux Slackware directories: $PACKAGES"
echo
echo "Which of the following is your target device:"
echo
echo "    1 - Sun floppy drive"
echo "    2 - A: 3.5\" linux drive (/dev/fd0H1440)"
echo "    3 - B: 3.5\" linux drive (/dev/fd1H1440)"
echo "    4 - AIX RS6000 floppy drive"
echo "    5 - HP/UX floppy drive"
echo "    6 - Quit"
echo
if [ "`echo -n `" != "'-n'" ]
then
    echo -n "Enter your choice: [Q]: "
else
    echo "Enter your choice: [Q]: \c"
fi
 
#read device junk
read device;
if [ -z "$device" ]; then
        device="Q"
fi
 
case "$device" in
        1*|[sS]* )
          if ps -ef | grep vold | grep -v grep >> /dev/null; then
             echo Volume Management \(vold\) is running. 
             echo become superuser then kill the vold process and re-run $0
             exit 0
          fi
          FD="/floppy"
          format="fdformat -Uft dos"
          forceformat=yes
          device=/dev/rdiskette
          eject="eject floppy"
          erase="rm -rf"
          mount="/usr/sbin/mount -F pcfs -o rw "
          umount="/usr/sbin/umount"
        ;;
        2*|[aA]:* )
          FD="a:"
          format=Linuxaformat
          device=/dev/fd0H1440
          eject=:
        ;;
        3*|[bB]:* )
          FD="b:"
          format=Linuxbformat
          device=/dev/fd1H1440
          eject=:
        ;;
        4*|[Aa][Ii][Xx]* )
          FD="a:"
          device=/dev/rfd0
          format=aixdosformat
          copy=aixdoswrite
          eject=aixeject
        ;;
        5*|[Hh][Pp]* )
          device=/dev/rfloppy/c201d0s0
          FD=$device:
          format=hpuxdosformat
          copy=hpuxdoswrite
	  erase=hpuxdoserase
          eject=hpuxeject           
        ;;
        [6qQ]* )
          echo "Quitting"
          exit 0
          ;;
        * )
          echo "ERROR: invalid entry"
          echo "Quitting"
          exit 0;
        ;;
esac
 
echo "Using $FD ($device) to create floppies."
echo
 
descrip="Slackware bootkernel disk"
images="../bootdsks.*/*.gz"
default_image=../bootdsks.144/pick_the_right_one.gz
disk="Boot"
 
CopyImage
 
descrip="Slackware root/install disk"
images="../rootdsks.*/*.gz"
disk="Filesystem"
default_image=../rootdsks.144/color.gz
 
CopyImage
 
default="f"
 
for series in $PACKAGES; do
        diskno=1
        maxdisk=`eval echo "$dollar$series"`
        descrip=`eval echo "$dollar${series}t"`
 
        echo
        echo "=== ${descrip} ==="
        echo "Making $maxdisk floppies for series \"$series\" (${descrip})"
        while [ "$diskno" -le $maxdisk ]; do
                disk=$series$diskno
                alldone=no
                duplicate=no
                if [ ! -d "$disk" ]; then
                        echo "ERROR: Disk Image Directory \"$disk\" does not exist!"
                        alldone="yes"
                fi
                CopyDisk
        diskno=`expr $diskno + 1`
        done
done