1#!/bin/sh
2#
3# $NetBSD: resize_root,v 1.6 2023/10/04 00:04:42 gutteridge Exp $
4#
5
6# PROVIDE: resize_root
7# REQUIRE: fsck_root
8# KEYWORD: interactive
9
10$_rc_subr_loaded . /etc/rc.subr
11
12name="resize_root"
13rcvar=$name
14start_cmd="resize_root_start"
15stop_cmd=":"
16fstab_file=/etc/fstab
17rootmp="/"
18
19split_options()
20{
21          local IFS
22          IFS=,
23          OPTS=$1
24          for i in $OPTS; do
25                    echo $i
26          done
27}
28
29resize_root_start()
30{
31          # if ! checkyesno $rcvar; then
32          #         echo "Not resizing $rootmp: resize_root must be set to YES/yes/..."
33          #         return
34          # fi
35
36          trap : 2            # Ignore SIGINT, SIGQUIT, so we
37          trap : 3            # enter single-user mode on failure.
38
39          # Do nothing if root file system is not mentioned in /etc/fstab, or if
40          # root file system seems to be a network mount, or if root file system
41          # is not ffs or if logging is enabled.
42          rootdev=""
43          while read fs_spec fs_file fs_vfstype fs_mntops fs_freq fs_passno
44          do
45                    # skip comment or blank line
46                    case "${fs_spec}" in
47                    \#*|'') continue ;;
48                    ROOT\.*) fs_spec="/dev/$(sysctl -n kern.root_device)${fs_spec#ROOT.}" ;;
49                    esac
50
51                    # skip non-root
52                    if [ "${fs_file}" != "$rootmp" ]; then
53                              continue
54                    fi
55
56                    if [ "${fs_vfstype}" != "ffs" ]; then
57                              echo "Not resizing $rootmp: not an ffs file system"
58                              return
59                    fi
60
61                    case "${fs_spec}" in
62                    *:*)
63                              echo "Not resizing $rootmp: network mount"
64                              return
65                              ;;
66                    esac
67
68                    for opt in $(split_options "${fs_mntops}"); do
69                              if [ "$opt" = "log" ];  then
70                                        echo "Not resizing $rootmp: logging unsupported"
71                                        return
72                              fi
73                    done
74
75                    rootdev=${fs_spec}
76                    break
77          done < "${fstab_file}"
78
79          if [ -z "$rootdev" ]; then
80                    echo "Not resizing $rootmp: not listed in ${fstab_file}"
81                    return
82          fi
83
84          if resize_ffs -c "$rootdev"; then
85                    echo "Resizing $rootmp ($rootdev)"
86                    if ! resize_ffs -y $resize_root_flags "$rootdev"; then
87                        echo "Error resizing root."
88                        stop_boot
89                    fi
90                    if [ ! -z "${resize_root_postcmd}" ]; then
91                              ${resize_root_postcmd}
92                    fi
93          else
94                    echo "Not resizing $rootmp ($rootdev): already correct size"
95          fi
96          return
97}
98
99load_rc_config $name
100run_rc_command "$1"
101