Home | History | Annotate | Line # | Download | only in common
buildfloppies.sh revision 1.9.2.3
      1      1.1  lukem #!/bin/sh
      2      1.1  lukem #
      3  1.9.2.3    riz # $NetBSD: buildfloppies.sh,v 1.9.2.3 2005/11/27 22:45:32 riz 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.1  lukem #	create tar file
    105      1.1  lukem #
    106      1.1  lukem dd if=/dev/zero of=${floppy} bs=8k count=1 2>/dev/null
    107  1.9.2.1   tron ${PAX} -O -w -b8k ${files} >> ${floppy} || exit 1
    108      1.1  lukem 	# XXX: use pax metafile and set perms?
    109      1.1  lukem if [ -n "$instboot" ]; then
    110      1.1  lukem 	instboot=$( echo $instboot | sed -e s/@IMAGE@/${floppy}/ )
    111      1.1  lukem 	echo "Running instboot: ${instboot}"
    112      1.2     tv 	eval ${instboot} || exit 1
    113      1.1  lukem fi
    114      1.1  lukem 
    115      1.1  lukem #	check size against available number of disks
    116      1.1  lukem #
    117  1.9.2.3    riz set -- $(ls -ln $floppy)
    118  1.9.2.3    riz bytes=$5
    119      1.7  lukem blocks=$(roundup ${bytes} 512)
    120      1.7  lukem 	# when calculating numdisks, take into account:
    121      1.7  lukem 	#	a) the image already has an 8K tar header prepended
    122      1.7  lukem 	#	b) each floppy needs an 8K tar volume header
    123      1.7  lukem numdisks=$(roundup ${blocks}-16 ${floppysize}-16)
    124      1.1  lukem if [ -z "${maxdisks}" ]; then
    125      1.1  lukem 	maxdisks=${numdisks}
    126      1.1  lukem fi
    127      1.1  lukem 
    128  1.9.2.3    riz #	Try to accurately summarise free space
    129  1.9.2.3    riz #
    130  1.9.2.3    riz msg=
    131  1.9.2.3    riz # First floppy has 8k boot code, the rest an 8k 'multivolume header'
    132  1.9.2.3    riz # Each file has a 512 byte header and is rounded to a multiple of 512
    133  1.9.2.3    riz # The archive ends with two 512 byte blocks of zeros
    134  1.9.2.3    riz # The output file is then rounded up to a multiple of 8k
    135  1.9.2.3    riz free_space=$(($maxdisks * ($floppysize - 16) * 512 - 512 * 2))
    136  1.9.2.3    riz for file in $files; do
    137  1.9.2.3    riz 	set -- $(ls -ln $file)
    138  1.9.2.3    riz 	file_bytes=$5
    139  1.9.2.3    riz 	pad_bytes=$(($(roundup $file_bytes 512) * 512 - $file_bytes))
    140  1.9.2.3    riz 	[ "$file_bytes" != 0 -o "$file" = "${file#USTAR.volsize.}" ] &&
    141  1.9.2.3    riz 		msg="$msg $file $pad_bytes,"
    142  1.9.2.3    riz 	free_space=$(($free_space - 512 - $file_bytes - $pad_bytes))
    143  1.9.2.3    riz done
    144  1.9.2.3    riz echo "Free space in last tar block:$msg"
    145  1.9.2.3    riz 
    146      1.1  lukem if [ ${numdisks} -gt ${maxdisks} ]; then
    147  1.9.2.3    riz 	# Add in the size of the last item (we really want the kernel) ...
    148  1.9.2.3    riz 	excess=$(( 0 - $free_space + $pad_bytes))
    149      1.1  lukem 	echo 1>&2 \
    150      1.1  lukem 	    "$prog: Image is ${excess} bytes ($(( ${excess} / 1024 )) KB)"\
    151      1.1  lukem 	    "too big to fit on ${maxdisks} disk"$(plural ${maxdisks})
    152      1.1  lukem 	exit 1
    153      1.1  lukem fi
    154      1.1  lukem 
    155  1.9.2.3    riz padto=$(( ${floppysize} * ${maxdisks} ))
    156      1.1  lukem if [ -n "${pad}" ]; then
    157      1.1  lukem 	echo \
    158  1.9.2.3    riz 	    "Writing $(( ${padto} * 512 )) bytes ($(( ${padto} / 2 )) KB)" \
    159      1.1  lukem 	    "on ${numdisks} disk"$(plural ${numdisks})"," \
    160  1.9.2.3    riz 	    "padded by ${free_space} bytes" \
    161  1.9.2.3    riz 	    "($(( ${free_space} / 1024 )) KB)"
    162      1.1  lukem else
    163      1.1  lukem 	echo "Writing ${bytes} bytes ($(( ${blocks} / 2 )) KB)"\
    164      1.5    dsl 	    "on ${numdisks} disk"$(plural ${numdisks})"," \
    165  1.9.2.3    riz 	    "free space ${free_space} bytes" \
    166  1.9.2.3    riz 	    "($(( ${free_space} / 1024 )) KB)"
    167      1.1  lukem fi
    168      1.1  lukem 
    169      1.1  lukem #	write disks
    170      1.1  lukem #
    171      1.1  lukem curdisk=1
    172      1.1  lukem image=
    173      1.8    dsl seek=0
    174      1.8    dsl skip=0
    175      1.1  lukem floppysize8k=$(( ${floppysize} / 16 ))
    176      1.1  lukem while [ ${curdisk} -le ${numdisks} ]; do
    177      1.3  lukem 	image="${floppybase}${curdisk}${suffix}"
    178      1.1  lukem 	echo "Creating disk ${curdisk} to ${image}"
    179      1.1  lukem 	if [ ${curdisk} -eq 1 ]; then
    180      1.1  lukem 		: > ${image}
    181      1.1  lukem 	else
    182      1.1  lukem 		echo USTARFS ${curdisk} > ${image}
    183      1.1  lukem 	fi
    184      1.1  lukem 	count=$(( ${floppysize8k} - ${seek} ))
    185      1.1  lukem 	dd bs=8k conv=sync seek=${seek} skip=${skip} count=${count} \
    186      1.1  lukem 	    if=${floppy} of=${image} 2>/dev/null
    187      1.1  lukem 
    188      1.1  lukem 	curdisk=$(( ${curdisk} + 1 ))
    189      1.8    dsl 	skip=$(( $skip + $count ))
    190      1.8    dsl 	seek=1
    191      1.1  lukem done
    192      1.1  lukem 
    193      1.1  lukem #	pad last disk if necessary
    194      1.1  lukem #
    195      1.1  lukem if [ -n "${pad}" ]; then
    196      1.8    dsl 	dd if=$image of=$image conv=notrunc conv=sync bs=${floppysize}b count=1
    197      1.1  lukem fi
    198      1.1  lukem 
    199      1.1  lukem 
    200      1.1  lukem #	final status
    201      1.1  lukem #
    202      1.1  lukem echo "Final result:"
    203      1.3  lukem ls -l ${floppybase}?${suffix}
    204      1.1  lukem 
    205      1.1  lukem exit 0
    206