home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / sbin / MAKEFLOPPIES < prev    next >
Text File  |  1999-01-24  |  5KB  |  252 lines

  1. #!/bin/sh
  2. #
  3. # MAKEFLOP
  4. #
  5. # requires: expr
  6. # Note quirk of expr: if it prints "0", it always
  7. # returns "1" regardless of whether this makes sense!
  8. #
  9. # 1995.01.03    David Niemi    Created
  10.  
  11. set -e
  12. set -u
  13. MAJOR=2
  14. TMPDEVICE=/dev/tmpfloppy$$
  15. if floppycontrol 2>/dev/null; then
  16.     FLOPPYCONTROL=yes
  17. else
  18.     FLOPPYCONTROL=no
  19. fi
  20.  
  21. MINORNAMES='d360 h1200 D360 D720 h360 h720 H1440 E2880
  22.     CompaQ h1440 H1680 h410 H820 h1476 H1722 h420
  23.     H830 h1494 H1743 h880 D1040 D1120 h1600 H1760
  24.     H1920 E3200 E3520 E3840 H1840 D800 H1600'
  25.  
  26. CMOSNAMES='360K_PC 1.2M_AT 720K 1.44M 2.88M_AMI_BIOS 2.88M'
  27.  
  28. ## Used only with -t option
  29. CMOSLETTERS='d h D H E E'
  30. UCMOSLETTERS='d h u u u u'
  31. CMOSFORMATS='d h D DH DHE DHE'
  32.  
  33. LOCAL=
  34. DRIVES=
  35. USAGE=
  36. TYPE_OVERRIDE=u
  37. REMAINDER=
  38. DRYRUN=
  39. VERBOSE=
  40.  
  41.  
  42. ## getword nth parameter of all the subsequent parameters
  43. getword ()
  44. {    if [ $# -lt 1 ]; then
  45.         return
  46.     fi
  47.     if [ "$1" -lt 1 -o "$1" -ge $# ]; then
  48.         return
  49.     fi
  50.     shift $1
  51.     echo $1
  52. }
  53.  
  54. basenumber()
  55. {
  56.     if [ $1 -ge 4 ] ; then
  57.         expr $1 + 124
  58.     else
  59.         echo $1
  60.     fi
  61. }
  62.  
  63. minorname ()
  64. {    if [ "$FLOPPYCONTROL" = no ]; then
  65.         ## No floppycontrol program, so use default values
  66.         getword "$1" $MINORNAMES
  67.     else
  68.         rm -f "$TMPDEVICE"
  69.         mknod "$TMPDEVICE" b "$MAJOR" "$1"
  70.         floppycontrol -T "$TMPDEVICE" 2>/dev/null || :
  71.         rm -f "$TMPDEVICE"
  72.     fi
  73.  
  74. }
  75.  
  76. cmosid ()
  77. {
  78.     if [ "$FLOPPYCONTROL" = yes ]; then
  79.         case `minorname $1` in
  80.         d360)        echo 1 ;;
  81.         h1200)        echo 2 ;;
  82.         D720)        echo 3 ;;
  83.         H1440)        echo 4 ;;
  84.         E2880)        echo 6 ;;
  85.         "(null)")    echo none ;;
  86.         "")        echo none ;;
  87.         *)        echo unknown ;;
  88.         esac
  89.     elif [ "$1" = 0 ]; then
  90.         echo 4        # 1.44MB default for drive 0
  91.     elif [ "$1" = 1 ]; then
  92.         echo 2        # 1.2MB AT default for drive 1
  93.     else
  94.         echo none    # Nothing for everybody else
  95.     fi
  96. }
  97.  
  98. # main()
  99.  
  100. PERMISSION=666
  101. while [ $# -ge 1 -o -n "${REMAINDER}" ]; do
  102.     if [ -n "$REMAINDER" ]; then
  103.         ## Continue processing options stuck together
  104.         ARG=$REMAINDER
  105.     else
  106.         ## Get a fresh argument
  107.         ARG=$1
  108.         shift
  109.         case "$ARG" in
  110.  
  111.         ## Remove dash in front of option(s)
  112.         -?*)
  113.             ARG=`expr "-$ARG" : '-*\(.*\)' || :`
  114.             ;;
  115.         esac
  116.     fi
  117.  
  118.     ## Break compound options up
  119.     case "$ARG" in
  120.     ??*)    REMAINDER=`expr "$ARG" : '.\(.*\)' || :`
  121.         ARG=`expr "$ARG" : '\(.\)' || :`
  122.         ;;
  123.     *)    REMAINDER= ;;
  124.     esac
  125.  
  126.     case $ARG in
  127.  
  128.     ## Process drive number(s)
  129.     [0-7])    DRIVES="$DRIVES $ARG" ;;
  130.  
  131.     [nN])    DRYRUN=yes ;;
  132.  
  133.     ## Make devices in current directory, not /dev
  134.     [lL])    LOCAL=yes ;;
  135.  
  136.     ## Base device name on drive type
  137.     [tT])    TYPE_OVERRIDE=yes ;;
  138.     [dD])    TYPE_OVERRIDE=yes ;;
  139.  
  140.     ## Base device name on media type
  141.     [mM])    TYPE_OVERRIDE=no ;;
  142.  
  143.     ## New naming scheme
  144.     [uU])    TYPE_OVERRIDE=no ;;
  145.  
  146.     [vV])    VERBOSE=yes ;;
  147.  
  148.     ## Allow access only for group floppy
  149.     [gG])    PERMISSION=660 ;;
  150.  
  151.     *)    echo "$0: unrecognized argument \"$ARG\"." >&2
  152.         USAGE=yes
  153.         ;;
  154.     esac
  155. done
  156.  
  157. if [ -n "$USAGE" ]; then
  158.     echo "Usage: $0 [ <option> ... ] [ <drive #> ... ]" >&2
  159.     echo 'Options:
  160.     -l    Local (make files in local directory, not /dev)
  161.     -n    Dry run (just report what would be done, do not do anything)
  162.     -t    Name devices for drive type
  163.     -d    Name devices for drive type
  164.     -m    Name devices for media type
  165.     -u    Use the same letter (u) for all 3 1/2 devices
  166.     -g    Allow access only for group floppy
  167.     -v    Verbose
  168. ' >&2
  169.     exit 1
  170. fi
  171.  
  172. if [ -z "$DRIVES" ]; then
  173.     DRIVES="0 1 2 3 4 5 6 7"
  174. fi
  175.  
  176. for DRIVE in $DRIVES; do
  177.     if [ -n "$LOCAL" ]; then
  178.         FILE=fd$DRIVE
  179.     else
  180.         FILE=/dev/fd$DRIVE
  181.     fi
  182.     BASENUMBER=`basenumber $DRIVE`
  183.     CMOS=`cmosid "$BASENUMBER"`
  184.     if [ $CMOS = none ] ; then
  185.         echo "Drive $DRIVE is not installed or not configured, skipping"
  186.         continue
  187.     fi
  188.  
  189.     if [ $CMOS = unknown ] ; then
  190.         echo "Drive $DRIVE is of unknown type, skipping"
  191.         continue
  192.     fi    
  193.  
  194.     CN=`getword "$CMOS" $CMOSNAMES`
  195.  
  196.     if [ "$TYPE_OVERRIDE" = u ]; then
  197.         CL=`getword "$CMOS" $UCMOSLETTERS`
  198.     else
  199.         CL=`getword "$CMOS" $CMOSLETTERS`
  200.     fi
  201.  
  202.     FORMATS=`getword "$CMOS" $CMOSFORMATS`
  203.     if [ -n "$VERBOSE" -o -n "$DRYRUN" ]; then
  204.         echo rm -f "$FILE"*
  205.     fi
  206.     if [ -z "$DRYRUN" ]; then
  207.         rm -f "$FILE"*
  208.     fi
  209.     if [ -z "$CMOS" -o -z "$CN" ]; then
  210.         echo "Skipping invalid drive \"$FILE\"" >&2
  211.         continue
  212.     fi
  213.     echo "Creating \"$FILE\", ID=$DRIVE, Type=$CMOS ($CN)"
  214.     if [ -z "$DRYRUN" ]; then
  215.         mknod "$FILE" b "$MAJOR" "$BASENUMBER"
  216.         chown root.floppy "$FILE"
  217.         chmod ${PERMISSION} "$FILE"
  218.     fi
  219.     if [ -n "$VERBOSE" -o -n "$DRYRUN" ]; then
  220.         echo mknod "$FILE" b "$MAJOR" "$BASENUMBER"
  221.     fi
  222.  
  223.     ## Todo: query about tracks and such (for now assume 80 only)
  224.  
  225.     BASE=4
  226.     while [ $BASE -lt 128 ] ; do
  227.         MINOR=`expr "$BASE" + "$BASENUMBER" || :`
  228.         NAME=`minorname "$BASE"`
  229.         if expr index "$FORMATS" "$NAME" >/dev/null ; then
  230.             if [ "$TYPE_OVERRIDE" != no ]; then
  231.                 NAME=`echo $NAME | sed "s/^./$CL/g"`
  232.             fi
  233.         
  234.             if [ -z    "$NAME" ]; then
  235.                 echo "Oops, skipping invalid format \"$FORMAT\"" >&2
  236.                 continue
  237.             fi
  238.             if [ -z "$DRYRUN" ]; then
  239.                 mknod "${FILE}${NAME}" b "$MAJOR" "$MINOR"
  240.                 chown root.floppy "${FILE}${NAME}"
  241.                 chmod ${PERMISSION} "${FILE}${NAME}"
  242.             fi
  243.             if [ -n "$VERBOSE" -o -n "$DRYRUN" ]; then
  244.                 echo mknod "${FILE}${NAME}" b "$MAJOR" "$MINOR"
  245.             fi
  246.         fi
  247.         BASE=`expr $BASE + 4`
  248.     done
  249. done
  250.  
  251. ## END ##
  252.