ZPOOL_FORCE=""
ZPOOL_IMPORT_FLAGS=""

zfs_get_bootfs () {
    for zfs_dataset in $(zpool list -H -o bootfs); do
        case ${zfs_dataset} in
            "" | "-")
                # skip this line/dataset
                ;;
            "no pools available")
                return 1
                ;;
            *)
                ZFS_DATASET=${zfs_dataset}
                return 0
                ;;
        esac
    done
    return 1
}

zfs_mount_handler () {
    if [ "${ZFS_DATASET}" = "bootfs" ] ; then
        if ! zfs_get_bootfs ; then
            # Lets import everything and try again
            zpool import ${ZPOOL_IMPORT_FLAGS} -N -a ${ZPOOL_FORCE}
            if ! zfs_get_bootfs ; then
                die "ZFS: Cannot find bootfs."
            fi
        fi
    fi

    local pool="${ZFS_DATASET%%/*}"
    local rwopt_exp=${rwopt:-ro}

    if ! zpool list -H ${pool} 2>1 > /dev/null ; then
        if [ "${rwopt_exp}" != "rw" ]; then
            msg "ZFS: Importing pool ${pool} readonly."
            ZPOOL_IMPORT_FLAGS="${ZPOOL_IMPORT_FLAGS} -o readonly=on"
        else
            msg "ZFS: Importing pool ${pool}."
        fi

        if ! zpool import ${ZPOOL_IMPORT_FLAGS} -N ${pool} ${ZPOOL_FORCE} ; then
            die "ZFS: Unable to import pool ${pool}."
        fi
    fi

    local node=$1
    local tab_file="$node/etc/fstab"
    local zfs_datasets=$(zfs list -H -o name -t filesystem -r "${ZFS_DATASET}")

    # Mount the root, and any child datasets
    for dataset in ${zfs_datasets}; do
        mountpoint=$(zfs get -H -o value mountpoint "${dataset}")
        case ${mountpoint} in
            "none")
                # skip this line/dataset.
                ;;
            "legacy")
                if [ -f "${tab_file}" ]; then
                    if findmnt -snero source -F "${tab_file}" -S "${dataset}" > /dev/null 2>&1; then
                        opt=$(findmnt -snero options -F "${tab_file}" -S "${dataset}")
                        mnt=$(findmnt -snero target -F "${tab_file}" -S "${dataset}")
                        mount -t zfs -o "${opt}" "${dataset}" "${node}${mnt}"
                    fi
                fi
                ;;
            *)
                mount -t zfs -o "zfsutil,${rwopt_exp}" "${dataset}" "${node}${mountpoint}"
                ;;
        esac
    done
}

run_hook() {
    # Force import the pools, useful if the pool has not properly been exported using 'zpool export <pool>'
    [[ ${zfs_force} == 1 ]] && ZPOOL_FORCE='-f'

    # Add import directory to import command flags
    [[ "${zfs_import_dir}" != "" ]] && ZPOOL_IMPORT_FLAGS="${ZPOOL_IMPORT_FLAGS} -d ${zfs_import_dir}"

    # Wait 15 seconds for ZFS devices to show up
    [[ "${zfs_wait}" == "" ]] && ZFS_WAIT="15" || ZFS_WAIT="${zfs_wait}"

    if [[ "${root}" == 'zfs' ]]; then
        mount_handler='zfs_mount_handler'
    fi

    case ${zfs} in
        "")
            # skip this line/dataset
            ;;
        auto|bootfs)
            ZFS_DATASET='bootfs'
            mount_handler="zfs_mount_handler"
            ;;
        *)
            ZFS_DATASET=${zfs}
            mount_handler="zfs_mount_handler"
            ;;
    esac

    # Allow up to n seconds for zfs device to show up
    for i in {1..${ZFS_WAIT}}; do
        [[ -c "/dev/zfs" ]] && break
        sleep 1
    done
}

run_latehook () {
    zpool import -N -a ${ZPOOL_FORCE}
}

# vim:set ts=4 sw=4 ft=sh et:
