# Copyright (C) 2006 OpenWrt.org # Copyright (C) 2010 Vertical Communications missing_lines() { local file1 file2 line file1="$1" file2="$2" oIFS="$IFS" IFS=":" while read line; do set -- $line grep -q "^$1:" "$file2" || echo "$*" done < "$file1" IFS="$oIFS" } # Rootfs mount options can be passed by declaring in the kernel # cmdline as much options as needed prefixed with "rootfs_mount_options." # # Example: # rootfs_mount_options.compress_algorithm=zstd rootfs_mount_options.noinline_data # compose_rootfs_mount_options() { local mount_options local cmdlinevar for cmdlinevar in $(cat /proc/cmdline); do if [ "$cmdlinevar" != "${cmdlinevar#rootfs_mount_options\.}" ]; then append mount_options "${cmdlinevar#rootfs_mount_options\.}" fi done echo $mount_options } do_mount_root() { mount_root start "$(compose_rootfs_mount_options)" boot_run_hook preinit_mount_root [ -f /sysupgrade.tgz -o -f /tmp/sysupgrade.tar ] && { echo "- config restore -" cp /etc/passwd /etc/group /etc/shadow /tmp cd / [ -f /sysupgrade.tgz ] && tar xzf /sysupgrade.tgz [ -f /tmp/sysupgrade.tar ] && tar xf /tmp/sysupgrade.tar missing_lines /tmp/passwd /etc/passwd >> /etc/passwd missing_lines /tmp/group /etc/group >> /etc/group missing_lines /tmp/shadow /etc/shadow >> /etc/shadow rm /tmp/passwd /tmp/group /tmp/shadow # Prevent configuration corruption on a power loss sync } } [ "$INITRAMFS" = "1" ] || boot_hook_add preinit_main do_mount_root