#!/bin/sh
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh

type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh

filter_rootopts() {
    rootopts=$1
    # strip ro and rw options
    local OLDIFS="$IFS"
    IFS=,
    set -- $rootopts
    IFS="$OLDIFS"
    local v
    while [ $# -gt 0 ]; do
        case $1 in
            rw|ro);;
            defaults);;
            *)
                v="$v,${1}";;
        esac
        shift
    done
    rootopts=${v#,}
    echo $rootopts
}

if [ -n "$root" -a -z "${root%%block:*}" ]; then
    mount -t ${fstype:-auto} -o "$rflags",ro "${root#block:}" "$NEWROOT" \
        && ROOTFS_MOUNTED=yes 

    READONLY=
    fsckoptions=
    if [ -f "$NEWROOT"/etc/sysconfig/readonly-root ]; then
        . "$NEWROOT"/etc/sysconfig/readonly-root
    fi

    if getargbool 0 "readonlyroot=" -y readonlyroot; then
        READONLY=yes
    fi

    if getarg noreadonlyroot ; then
        READONLY=no
    fi

    if [ -f "$NEWROOT"/fastboot ] || getargbool 0 fastboot ; then
        fastboot=yes
    fi

    if [ -f "$NEWROOT"/fsckoptions ]; then
        fsckoptions=$(cat "$NEWROOT"/fsckoptions)
    fi

    if [ -f "$NEWROOT"/forcefsck ] || getargbool 0 forcefsck ; then
        fsckoptions="-f $fsckoptions"
    elif [ -f "$NEWROOT"/.autofsck ]; then
        [ -f "$NEWROOT"/etc/sysconfig/autofsck ] && . "$NEWROOT"/etc/sysconfig/autofsck
        if [ "$AUTOFSCK_DEF_CHECK" = "yes" ]; then
            AUTOFSCK_OPT="$AUTOFSCK_OPT -f"
        fi
        if [ -n "$AUTOFSCK_SINGLEUSER" ]; then
            warn "*** Warning -- the system did not shut down cleanly. "
            warn "*** Dropping you to a shell; the system will continue"
            warn "*** when you leave the shell."
            emergency_shell
        fi
        fsckoptions="$AUTOFSCK_OPT $fsckoptions"
    fi

    if ! strstr " $fsckoptions" " -y"; then
        fsckoptions="-a $fsckoptions"
    fi

    rootfs=${fstype:-auto}
    rootopts=
    if getargbool 1 rd.fstab -n rd_NO_FSTAB \
        && ! getarg rootflags \
        && [ -f "$NEWROOT/etc/fstab" ] \
        && ! [ -L "$NEWROOT/etc/fstab" ]; then
        # if $NEWROOT/etc/fstab contains special mount options for 
        # the root filesystem,
        # remount it with the proper options
        rootopts="defaults"
        while read dev mp fs opts rest; do 
            # skip comments
            [ "${dev%%#*}" != "$dev" ] && continue
            
            if [ "$mp" = "/" ]; then
                rootfs=$fs
                rootopts=$opts
                break
            fi
        done < "$NEWROOT/etc/fstab"

        rootopts=$(filter_rootopts $rootopts)
    fi

    umount "$NEWROOT"
    if [ "$rootfs" = "auto" ]; then
        rootfs=$(udevadm info --query=env --name=${root#block:} | \
            while read line; do
                if strstr $line ID_FS_TYPE; then
                    eval $line
                    echo $ID_FS_TYPE
                    break
                fi
            done)
        rootfs=${rootfs:-auto}
    fi

    # backslashes are treated as escape character in fstab
    esc_root=$(echo ${root#block:} | sed 's,\\,\\\\,g')
    printf '%s %s %s %s,%s 1 1 \n' "$esc_root" "$NEWROOT" "$rootfs" "$rflags" "$rootopts"  > /etc/fstab

    if [ -z "$fastboot" -a "$READONLY" != "yes" ]; then
        info "Checking filesystems"
        info fsck -T -t noopts=_netdev -A $fsckoptions
        out=$(fsck -T -t noopts=_netdev -A $fsckoptions) 
        export RD_ROOTFS_FSCK=$?
        echo $RD_ROOTFS_FSCK > /run/initramfs/root-fsck
        
        # A return of 4 or higher means there were serious problems.
        if [ $RD_ROOTFS_FSCK -gt 3 ]; then
            warn $out
            warn "fsck returned with error code $RD_ROOTFS_FSCK"
            warn "*** An error occurred during the file system check."
            warn "*** Dropping you to a shell; the system will retry"
            warn "*** to mount the system, when you leave the shell."
            emergency_shell -n "(Repair filesystem)"
        else
            echo $out|vinfo
            [ $RD_ROOTFS_FSCK -gt 0 ] && warn "fsck returned with $RD_ROOTFS_FSCK"
        fi
    fi

    info "Remounting ${root#block:} with -o ${rflags},${rootopts}"
    mount -t "$rootfs" -o "$rflags","$rootopts" \
        "${root#block:}" "$NEWROOT" 2>&1 | vinfo

    [ -f "$NEWROOT"/forcefsck ] && rm -f "$NEWROOT"/forcefsck 2>/dev/null
    [ -f "$NEWROOT"/.autofsck ] && rm -f "$NEWROOT"/.autofsck 2>/dev/null
fi
