Home | History | Annotate | Line # | Download | only in common
      1 #! /bin/sh
      2 #
      3 # $NetBSD: sunbootcd.sh,v 1.7 2018/09/16 21:41:34 kre Exp $
      4 #
      5 # Copyright (c) 2003 The NetBSD Foundation, Inc.
      6 # All rights reserved.
      7 #
      8 # This code is derived from software contributed to The NetBSD Foundation
      9 # by Luke Mewburn.
     10 #
     11 # Redistribution and use in source and binary forms, with or without
     12 # modification, are permitted provided that the following conditions
     13 # are met:
     14 # 1. Redistributions of source code must retain the above copyright
     15 #    notice, this list of conditions and the following disclaimer.
     16 # 2. Redistributions in binary form must reproduce the above copyright
     17 #    notice, this list of conditions and the following disclaimer in the
     18 #    documentation and/or other materials provided with the distribution.
     19 #
     20 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     21 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     22 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     23 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     24 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     25 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     26 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     27 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     28 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     29 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     30 # POSSIBILITY OF SUCH DAMAGE.
     31 #
     32 
     33 : ${SUNLABEL:=sunlabel}		# sunlabel(8)
     34 : ${CYLSIZE:=640}		# Cylinder size, in 512byte blocks
     35 
     36 PROGNAME=${0##*/}
     37 FORMAT="%-8s offset %4d, size %4d, file %s\n"
     38 
     39 
     40 usage()
     41 {
     42 	cat 1>&2 << _USAGE_
     43 Usage: ${PROGNAME} fsimage sun4 [sun4c [sun4m [sun3|sun4d [sun3x|sun4u]]]]
     44 	Combine file system partitions for Sun Microsystems, Inc. computers
     45 	into a CD-ROM file system image suitable for booting on the
     46 	following platforms:
     47 		NetBSD/sun3:	sun3, sun3x
     48 		NetBSD/sparc:	sun4, sun4c, sun4d, sun4m
     49 		NetBSD/sparc64:	sun4u
     50 	The architecture arguments must be bootable file system image
     51 	for that architecture, or \`-' if no entry is desired.
     52 	\`fsimage' is typically an iso9660 file system image, although
     53 	any type of file system can be used as long as the first 512
     54 	bytes of the image are not used.  \`fsimage' is modified, and
     55 	the additional partitions are added in order.  If the same
     56 	filename is used more than once for different architectures,
     57 	it will only be copied once.
     58 _USAGE_
     59 	exit 1
     60 }
     61 
     62 case "$#" in
     63 ([23456])	;;
     64 (*)		usage;;
     65 esac
     66 
     67 for curfile
     68 do
     69 	[ "$curfile" = "-" ] && continue
     70 	if [ ! -f "$curfile" ]; then
     71 		echo 1>&2 "${PROGNAME}: ${curfile}: No such file."
     72 		exit 1
     73 	fi
     74 done
     75 
     76 ISOIMAGE="$1";	shift
     77 
     78 ISOSIZE=$( ls -l "${ISOIMAGE}" | awk '{print $5}' )
     79 ISOBLKS=$(( (${ISOSIZE} + 511) / 512 ))
     80 ISOCYLS=$(( (${ISOBLKS} + (${CYLSIZE} - 1)) / ${CYLSIZE} ))
     81 
     82 printf "${FORMAT}" "fsimage:" 0 ${ISOCYLS} "${ISOIMAGE}"
     83 
     84 ENDCYL=${ISOCYLS}
     85 curpart=0
     86 for curfile
     87 do
     88 	curpart=$(( ${curpart} + 1 ))
     89 	[ "$curfile" = "-" ] && continue
     90 
     91 	tpart=1
     92 	curoff=${ENDCYL}
     93 	while [ ${tpart} -lt ${curpart} ]; do
     94 		tfile=$(eval echo \$PART${tpart}FILE)
     95 		if [ "${curfile}" = "${tfile}" ]; then
     96 			curoff=$(eval echo \$PART${tpart}OFF)
     97 			break
     98 		fi
     99 		tpart=$(( ${tpart} + 1 ))
    100 	done
    101 
    102 	cursize=$( ls -l "${curfile}" | awk '{print $5}' )
    103 	curblks=$(( (${cursize} + 511) / 512 ))
    104 	curcyls=$(( (${curblks} + (${CYLSIZE} - 1)) / ${CYLSIZE} ))
    105 	printf "${FORMAT}" "Image ${curpart}:" ${curoff} ${curcyls} "${curfile}"
    106 
    107 	eval	PART${curpart}SIZE=${cursize} \
    108 		PART${curpart}BLKS=${curblks} \
    109 		PART${curpart}CYLS=${curcyls} \
    110 		PART${curpart}OFF=${curoff} \
    111 		PART${curpart}FILE="${curfile}"
    112 
    113 	if [ $curoff -eq $ENDCYL ]; then		# append ${curfile}
    114 		echo "    (appending ${curfile} to ${ISOIMAGE})"
    115 		dd if="${curfile}" of="${ISOIMAGE}" bs=${CYLSIZE}b \
    116 		    seek=${ENDCYL} conv=notrunc,sync 2>/dev/null
    117 		ENDCYL=$(( $ENDCYL + $curcyls ))
    118 	fi
    119 
    120 done
    121 
    122 printf "${FORMAT}" "Final:" 0 ${ENDCYL} "${ISOIMAGE}"
    123 
    124 ${SUNLABEL} -nq "${ISOIMAGE}" << _partinfo_
    125 V nsect ${CYLSIZE}
    126 V nhead 1
    127 V rpm 300
    128 V pcyl ${ENDCYL}
    129 V ncyl ${ENDCYL}
    130 a 0 $(( ${ISOCYLS} * ${CYLSIZE} ))
    131 b ${PART1OFF:-0} $(( ${PART1CYLS:-0} * ${CYLSIZE} ))
    132 c ${PART2OFF:-0} $(( ${PART2CYLS:-0} * ${CYLSIZE} ))
    133 d ${PART3OFF:-0} $(( ${PART3CYLS:-0} * ${CYLSIZE} ))
    134 e ${PART4OFF:-0} $(( ${PART4CYLS:-0} * ${CYLSIZE} ))
    135 f ${PART5OFF:-0} $(( ${PART5CYLS:-0} * ${CYLSIZE} ))
    136 W
    137 _partinfo_
    138