Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

#!/bin/sh
#
# $NetBSD: resize_root,v 1.5 2020/05/24 14:43:19 jmcneill Exp $
#

# PROVIDE: resize_root
# REQUIRE: fsck_root
# KEYWORD: interactive

$_rc_subr_loaded . /etc/rc.subr

name="resize_root"
rcvar=$name
start_cmd="resize_root_start"
stop_cmd=":"
fstab_file=/etc/fstab
rootmp="/"

split_options()
{
	local IFS
	IFS=,
	OPTS=$1
	for i in $OPTS; do
		echo $i
	done
}

resize_root_start()
{
	# if ! checkyesno $rcvar; then
	# 	echo "Not resizing $rootmp: resize_root must be set to YES/yes/..."
	# 	return
	# fi

	trap : 2 		# Ignore SIGINT, SIGQUIT, so we
	trap : 3		# enter single-user mode on failure.

	# Do nothing if root file system is not mentioned in /etc/fstab, or if
	# root file system seems to be a network mount, or if root file system
	# is not ffs or if logging is enabled.
	rootdev=""
	while read fs_spec fs_file fs_vfstype fs_mntops fs_freq fs_passno
	do
		# skip comment or blank line
		case "${fs_spec}" in
		\#*|'') continue ;;
		ROOT\.*) fs_spec="/dev/$(sysctl -n kern.root_device)${fs_spec#ROOT.}" ;;
		esac

		# skip non-root
		if [ "${fs_file}" != "$rootmp" ]; then
			continue
		fi

		if [ "${fs_vfstype}" != "ffs" ]; then
			echo "Not resizing $rootmp: not an ffs file system"
			return
		fi

		case "${fs_spec}" in
		*:*)
			echo "Not resizing $rootmp: network mount"
			return
			;;
		esac

		for opt in $(split_options "${fs_mntops}"); do
			if [ "$opt" = "log" ];  then
				echo "Not resizing $rootmp: logging unsupported"
				return
			fi
		done

		rootdev=${fs_spec}
		break
	done < "${fstab_file}"

	if [ -z "$rootdev" ]; then
		echo "Not resizing $rootmp: not listed in ${fstab_file}"
		return
	fi

	if resize_ffs -c "$rootdev"; then
		echo "Resizing $rootmp ($rootdev)"
		if ! resize_ffs -y $resize_root_flags $rootdev; then
		    echo "Error resizing root."
		    stop_boot
		fi
		if [ ! -z "${resize_root_postcmd}" ]; then
			${resize_root_postcmd}
		fi
	else
		echo "Not resizing $rootmp ($rootdev): already correct size"
	fi
	return
}

load_rc_config $name
run_rc_command "$1"