11.1Sjmcneill#!/bin/sh
21.1Sjmcneill#
31.5Smlelstv# $NetBSD: resize_disklabel,v 1.5 2023/03/18 11:36:23 mlelstv Exp $
41.1Sjmcneill#
51.1Sjmcneill
61.1Sjmcneill# PROVIDE: resize_disklabel
71.1Sjmcneill# REQUIRE: fsck_root
81.1Sjmcneill# BEFORE: resize_root
91.1Sjmcneill
101.1Sjmcneill$_rc_subr_loaded . /etc/rc.subr
111.1Sjmcneill
121.1Sjmcneillname="resize_disklabel"
131.1Sjmcneillrcvar=$name
141.1Sjmcneillstart_cmd="resize_disklabel_start"
151.1Sjmcneillstop_cmd=":"
161.1Sjmcneill
171.1Sjmcneillget_rawpart()
181.1Sjmcneill{
191.4Smlelstv	local partno
201.4Smlelstv
211.1Sjmcneill	partno=$(/sbin/sysctl -n kern.rawpartition)
221.4Smlelstv	printf "$(printf \\\\%o $((partno + 97)))"
231.1Sjmcneill}
241.1Sjmcneill
251.1Sjmcneillget_total_sectors()
261.1Sjmcneill{
271.4Smlelstv	local disk
281.4Smlelstv
291.1Sjmcneill	disk=$1
301.5Smlelstv	/sbin/drvctl -p "$disk" disk-info/geometry/sectors-per-unit
311.1Sjmcneill}
321.1Sjmcneill
331.1Sjmcneillget_rawpart_sectors()
341.1Sjmcneill{
351.4Smlelstv	local disk rawpart
361.4Smlelstv
371.1Sjmcneill	disk=$1
381.1Sjmcneill	rawpart=$2
391.4Smlelstv	/sbin/disklabel -t "$disk" \
401.4Smlelstv	| sed -ne 's/.*:p'"$rawpart"'#\([0-9]*\):.*/\1/p'
411.1Sjmcneill}
421.1Sjmcneill
431.2Sjmcneillgrow_mbrpart()
441.2Sjmcneill{
451.4Smlelstv	local disk rawpart ts rs oldsize newsize
461.4Smlelstv
471.2Sjmcneill	disk=$1
481.2Sjmcneill	rawpart=$(get_rawpart)
491.2Sjmcneill
501.2Sjmcneill	eval $(/sbin/fdisk -S $disk)
511.2Sjmcneill	if [ ! "$PART1ID" = "169" ]; then
521.2Sjmcneill		warn "No NetBSD partition found in MBR partition #1"
531.2Sjmcneill		return
541.2Sjmcneill	fi
551.2Sjmcneill
561.4Smlelstv	ts=$((${DLSIZE} - ${PART1START}))
571.2Sjmcneill	rs=${PART1SIZE}
581.2Sjmcneill
591.2Sjmcneill	if [ "$ts" = "$rs" ]; then
601.2Sjmcneill		return
611.2Sjmcneill	fi
621.2Sjmcneill
631.4Smlelstv	oldsize=$(($rs / 2048))
641.4Smlelstv	newsize=$(($ts / 2048))
651.2Sjmcneill	echo "Growing $disk MBR partition #1 (${oldsize}MB -> ${newsize}MB)"
661.2Sjmcneill	/sbin/fdisk -f -u -1 -s 169/${PART1START}/${ts} ${disk}
671.2Sjmcneill}
681.2Sjmcneill
691.1Sjmcneillgrow_disklabel()
701.1Sjmcneill{
711.4Smlelstv	local disk part rawpart ts rs oldsize newsize
721.4Smlelstv
731.1Sjmcneill	disk=$1
741.1Sjmcneill	part=$2
751.1Sjmcneill	rawpart=$(get_rawpart)
761.1Sjmcneill
771.1Sjmcneill	ts=$(get_total_sectors $disk)
781.1Sjmcneill	rs=$(get_rawpart_sectors $disk $rawpart)
791.1Sjmcneill
801.1Sjmcneill	if [ "$ts" = "$rs" ]; then
811.1Sjmcneill		return
821.1Sjmcneill	fi
831.1Sjmcneill
841.4Smlelstv	oldsize=$(($rs / 2048))
851.4Smlelstv	newsize=$(($ts / 2048))
861.1Sjmcneill	echo "Growing $disk disklabel (${oldsize}MB -> ${newsize}MB)"
871.1Sjmcneill	printf "A\ny\n$part\n\n\n\$\nc\n\n\n\$\nd\n\n\n\$\nW\ny\nQ\n" | \
881.1Sjmcneill	    disklabel -i $disk >/dev/null
891.1Sjmcneill}
901.1Sjmcneill
911.1Sjmcneillresize_disklabel_start()
921.1Sjmcneill{
931.1Sjmcneill	if [ x"${resize_disklabel_disk}" = "x" ]; then
941.3Sjmcneill		resize_disklabel_disk="$(/sbin/sysctl -n kern.root_device)"
951.1Sjmcneill	fi
961.1Sjmcneill	if [ x"${resize_disklabel_part}" = "x" ]; then
971.3Sjmcneill		resize_disklabel_part=$(printf \\$(printf '%03o' $(( 97 + $(sysctl -n kern.root_partition) ))))
981.1Sjmcneill	fi
991.1Sjmcneill
1001.2Sjmcneill	grow_mbrpart "${resize_disklabel_disk}"
1011.1Sjmcneill	grow_disklabel "${resize_disklabel_disk}" "${resize_disklabel_part}"
1021.1Sjmcneill}
1031.1Sjmcneill
1041.1Sjmcneillload_rc_config $name
1051.1Sjmcneillrun_rc_command "$1"
106