Home | History | Annotate | Line # | Download | only in common
buildfloppies.sh revision 1.11
      1   1.1  lukem #!/bin/sh
      2   1.1  lukem #
      3  1.11    dsl # $NetBSD: buildfloppies.sh,v 1.11 2005/09/04 19:29:31 dsl Exp $
      4   1.1  lukem #
      5   1.6  lukem # Copyright (c) 2002-2003 The NetBSD Foundation, Inc.
      6   1.1  lukem # All rights reserved.
      7   1.1  lukem #
      8   1.1  lukem # This code is derived from software contributed to The NetBSD Foundation
      9   1.1  lukem # by Luke Mewburn of Wasabi Systems.
     10   1.1  lukem #
     11   1.1  lukem # Redistribution and use in source and binary forms, with or without
     12   1.1  lukem # modification, are permitted provided that the following conditions
     13   1.1  lukem # are met:
     14   1.1  lukem # 1. Redistributions of source code must retain the above copyright
     15   1.1  lukem #    notice, this list of conditions and the following disclaimer.
     16   1.1  lukem # 2. Redistributions in binary form must reproduce the above copyright
     17   1.1  lukem #    notice, this list of conditions and the following disclaimer in the
     18   1.1  lukem #    documentation and/or other materials provided with the distribution.
     19   1.1  lukem # 3. All advertising materials mentioning features or use of this software
     20   1.1  lukem #    must display the following acknowledgement:
     21   1.1  lukem #        This product includes software developed by the NetBSD
     22   1.1  lukem #        Foundation, Inc. and its contributors.
     23   1.1  lukem # 4. Neither the name of The NetBSD Foundation nor the names of its
     24   1.1  lukem #    contributors may be used to endorse or promote products derived
     25   1.1  lukem #    from this software without specific prior written permission.
     26   1.1  lukem #
     27   1.1  lukem # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     28   1.1  lukem # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     29   1.1  lukem # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     30   1.1  lukem # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     31   1.1  lukem # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     32   1.1  lukem # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     33   1.1  lukem # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     34   1.1  lukem # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     35   1.1  lukem # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     36   1.1  lukem # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     37   1.1  lukem # POSSIBILITY OF SUCH DAMAGE.
     38   1.1  lukem #
     39   1.1  lukem 
     40   1.1  lukem # set defaults
     41   1.1  lukem #
     42   1.1  lukem : ${PAX=pax}
     43   1.1  lukem prog=${0##*/}
     44   1.1  lukem 
     45   1.1  lukem 
     46   1.1  lukem usage()
     47   1.1  lukem {
     48   1.1  lukem 	cat 1>&2 << _USAGE_
     49   1.3  lukem Usage: ${prog} [-i instboot] [-m max] [-p] [-s suffix] base size file [...]
     50   1.1  lukem 	-i instboot	run instboot to install a bootstrap on @IMAGE@
     51   1.1  lukem 	-m max		maximum number of floppies to build
     52   1.1  lukem 	-p		pad last floppy to floppy size
     53   1.3  lukem 	-s suffix	suffix for floppies
     54   1.1  lukem 	base		basename of generated floppies
     55   1.1  lukem 	size		size of a floppy in 512 byte blocks
     56   1.1  lukem 	file [...]	file(s) to build
     57   1.1  lukem _USAGE_
     58   1.1  lukem 	exit 1
     59   1.1  lukem }
     60   1.1  lukem 
     61   1.1  lukem plural()
     62   1.1  lukem {
     63   1.1  lukem 	[ $1 -ne 1 ] && echo "s"
     64   1.1  lukem }
     65   1.1  lukem 
     66   1.7  lukem roundup()
     67   1.7  lukem {
     68   1.7  lukem 	echo $(( ( $1 + $2 - 1 ) / ( $2 ) ))
     69   1.7  lukem }
     70   1.7  lukem 
     71   1.1  lukem 
     72   1.1  lukem #	parse and check arguments
     73   1.1  lukem #
     74   1.1  lukem 
     75   1.3  lukem while getopts i:m:ps: opt; do
     76   1.1  lukem 	case ${opt} in
     77   1.1  lukem 	i)
     78   1.1  lukem 		instboot=${OPTARG} ;;
     79   1.1  lukem 	m)
     80   1.1  lukem 		maxdisks=${OPTARG} ;;
     81   1.1  lukem 	p)
     82   1.1  lukem 		pad=1 ;;
     83   1.3  lukem 	s)
     84   1.3  lukem 		suffix=${OPTARG} ;;
     85   1.1  lukem 	\?|*)
     86   1.1  lukem 		usage
     87   1.1  lukem 		;;
     88   1.1  lukem 	esac
     89   1.1  lukem done
     90   1.1  lukem 
     91   1.1  lukem shift $(( ${OPTIND} - 1 ))
     92   1.1  lukem [ $# -lt 3 ] && usage
     93   1.1  lukem floppybase=$1
     94   1.1  lukem floppysize=$2
     95   1.1  lukem shift 2
     96   1.1  lukem files=$*
     97   1.1  lukem 
     98   1.1  lukem #	setup temp file, remove existing images
     99   1.1  lukem #
    100   1.1  lukem floppy=floppy.$$.tar
    101   1.1  lukem trap "rm -f ${floppy}" 0 1 2 3			# EXIT HUP INT QUIT
    102   1.3  lukem rm -f ${floppybase}?${suffix}
    103   1.1  lukem 
    104  1.11    dsl #	Try to accurately summarise free space
    105  1.11    dsl #
    106  1.11    dsl [ "$files" = "boot netbsd" ] && {
    107  1.11    dsl 	set -- $(ls -ln boot)
    108  1.11    dsl 	boot_size=$5
    109  1.11    dsl 	boot_pad=$(($(roundup $boot_size 512) * 512 - $boot_size))
    110  1.11    dsl 	set -- $(ls -ln netbsd)
    111  1.11    dsl 	netbsd_size=$5
    112  1.11    dsl 	netbsd_pad=$(($(roundup $netbsd_size 512) * 512 - $netbsd_size))
    113  1.11    dsl 	echo Free space: boot $boot_pad, netbsd $netbsd_pad, \
    114  1.11    dsl 		at end $(($maxdisks * ($floppysize - 16) * 512 \
    115  1.11    dsl 		- 512 - $boot_size - $boot_pad \
    116  1.11    dsl 		- 512 - $netbsd_size - $netbsd_pad \
    117  1.11    dsl 		- 512 * 2))
    118  1.11    dsl }
    119  1.11    dsl 
    120   1.1  lukem #	create tar file
    121   1.1  lukem #
    122   1.1  lukem dd if=/dev/zero of=${floppy} bs=8k count=1 2>/dev/null
    123  1.10    dsl ${PAX} -O -w -b8k ${files} >> ${floppy} || exit 1
    124   1.1  lukem 	# XXX: use pax metafile and set perms?
    125   1.1  lukem if [ -n "$instboot" ]; then
    126   1.1  lukem 	instboot=$( echo $instboot | sed -e s/@IMAGE@/${floppy}/ )
    127   1.1  lukem 	echo "Running instboot: ${instboot}"
    128   1.2     tv 	eval ${instboot} || exit 1
    129   1.1  lukem fi
    130   1.1  lukem 
    131   1.1  lukem #	check size against available number of disks
    132   1.1  lukem #
    133   1.9    dsl bytes=$( ls -ln "${floppy}" | awk '{print $5}' )
    134   1.7  lukem blocks=$(roundup ${bytes} 512)
    135   1.7  lukem 	# when calculating numdisks, take into account:
    136   1.7  lukem 	#	a) the image already has an 8K tar header prepended
    137   1.7  lukem 	#	b) each floppy needs an 8K tar volume header
    138   1.7  lukem numdisks=$(roundup ${blocks}-16 ${floppysize}-16)
    139   1.1  lukem if [ -z "${maxdisks}" ]; then
    140   1.1  lukem 	maxdisks=${numdisks}
    141   1.1  lukem fi
    142   1.1  lukem 
    143   1.1  lukem if [ ${numdisks} -gt ${maxdisks} ]; then
    144   1.9    dsl 	excess=$(( (${blocks}-16 - (${floppysize}-16) * ${maxdisks}) * 512 ))
    145   1.1  lukem 	echo 1>&2 \
    146   1.1  lukem 	    "$prog: Image is ${excess} bytes ($(( ${excess} / 1024 )) KB)"\
    147   1.1  lukem 	    "too big to fit on ${maxdisks} disk"$(plural ${maxdisks})
    148   1.1  lukem 	exit 1
    149   1.1  lukem fi
    150   1.1  lukem 
    151   1.5    dsl padsize=$(( ${floppysize} * ${maxdisks} ))
    152   1.5    dsl padcount=$(( ${padsize} - ${blocks} ))
    153   1.1  lukem if [ -n "${pad}" ]; then
    154   1.1  lukem 	echo \
    155   1.1  lukem 	    "Writing $(( ${padsize} * 512 )) bytes ($(( ${padsize} / 2 )) KB)" \
    156   1.1  lukem 	    "on ${numdisks} disk"$(plural ${numdisks})"," \
    157   1.1  lukem 	    "padded by $(( ${padcount} * 512 )) bytes" \
    158   1.1  lukem 	    "($(( ${padcount} / 2 )) KB)"
    159   1.1  lukem else
    160   1.1  lukem 	echo "Writing ${bytes} bytes ($(( ${blocks} / 2 )) KB)"\
    161   1.5    dsl 	    "on ${numdisks} disk"$(plural ${numdisks})"," \
    162   1.5    dsl 	    "free space $(( ${padcount} * 512 )) bytes" \
    163   1.5    dsl 	    "($(( ${padcount} / 2 )) KB)"
    164   1.1  lukem fi
    165   1.1  lukem 
    166   1.1  lukem #	write disks
    167   1.1  lukem #
    168   1.1  lukem curdisk=1
    169   1.1  lukem image=
    170   1.8    dsl seek=0
    171   1.8    dsl skip=0
    172   1.1  lukem floppysize8k=$(( ${floppysize} / 16 ))
    173   1.1  lukem while [ ${curdisk} -le ${numdisks} ]; do
    174   1.3  lukem 	image="${floppybase}${curdisk}${suffix}"
    175   1.1  lukem 	echo "Creating disk ${curdisk} to ${image}"
    176   1.1  lukem 	if [ ${curdisk} -eq 1 ]; then
    177   1.1  lukem 		: > ${image}
    178   1.1  lukem 	else
    179   1.1  lukem 		echo USTARFS ${curdisk} > ${image}
    180   1.1  lukem 	fi
    181   1.1  lukem 	count=$(( ${floppysize8k} - ${seek} ))
    182   1.1  lukem 	dd bs=8k conv=sync seek=${seek} skip=${skip} count=${count} \
    183   1.1  lukem 	    if=${floppy} of=${image} 2>/dev/null
    184   1.1  lukem 
    185   1.1  lukem 	curdisk=$(( ${curdisk} + 1 ))
    186   1.8    dsl 	skip=$(( $skip + $count ))
    187   1.8    dsl 	seek=1
    188   1.1  lukem done
    189   1.1  lukem 
    190   1.1  lukem #	pad last disk if necessary
    191   1.1  lukem #
    192   1.1  lukem if [ -n "${pad}" ]; then
    193   1.8    dsl 	dd if=$image of=$image conv=notrunc conv=sync bs=${floppysize}b count=1
    194   1.1  lukem fi
    195   1.1  lukem 
    196   1.1  lukem 
    197   1.1  lukem #	final status
    198   1.1  lukem #
    199   1.1  lukem echo "Final result:"
    200   1.3  lukem ls -l ${floppybase}?${suffix}
    201   1.1  lukem 
    202   1.1  lukem exit 0
    203