--- rc.sysinit.orig 2007-10-05 11:39:44.000000000 +0200 +++ rc.sysinit 2007-10-05 12:15:21.000000000 +0200 @@ -121,56 +121,72 @@ fi # Set up non-root encrypted partition mappings if [ -f /etc/crypttab -a -n "$(grep -v ^# /etc/crypttab | grep -v ^$)" ]; then /sbin/modprobe -q dm-mod 2>/dev/null stat_busy "Unlocking encrypted volumes:" csfailed=0 CS=/sbin/cryptsetup.static do_crypt() { if [ $# -ge 3 ]; then cname="$1" csrc="$2" cpass="$3" shift 3 copts="$*" + tries="0" + maxtries="3" stat_append "${cname}.." if [ "${cpass}" = "SWAP" ]; then # This is DANGEROUS! The only possible safety check # is to not proceed in case we find a LUKS device # This may cause dataloss if it is not used carefully if $CS isLuks $csrc 2>/dev/null; then false else $CS -d /dev/urandom $copts create $cname $csrc >/dev/null if [ $? -eq 0 ]; then stat_append "creating swapspace.." mkswap -L $cname /dev/mapper/$cname >/dev/null fi fi elif [ "${cpass:0:1}" != "/" ]; then # For some fun reason, the parameter ordering varies for # LUKS and non-LUKS devices. Joy. if [ "${cpass}" = "ASK" ]; then - echo -ne "\nEnter passphrase for '${cname}' volume: " - read -r -s cpass < /dev/console - fi - - if $CS isLuks $csrc 2>/dev/null; then - echo "$cpass" | $CS $copts luksOpen $csrc $cname >/dev/null + while [ "${tries}" -lt "${maxtries}" ]; do + echo -ne "\nEnter passphrase for '${cname}' volume: " + read -r -s cpass < /dev/console + if ( + if $CS isLuks $csrc 2>/dev/null; then + echo "$cpass" | $CS $copts luksOpen $csrc $cname >/dev/null + else + echo "$cpass" | $CS $copts create $cname $csrc >/dev/null + fi + ); then + break + else + echo $((tries++)) >/dev/null + false + fi + done else - echo "$cpass" | $CS $copts create $cname $csrc >/dev/null + if $CS isLuks $csrc 2>/dev/null; then + echo "$cpass" | $CS $copts luksOpen $csrc $cname >/dev/null + else + echo "$cpass" | $CS $copts create $cname $csrc >/dev/null + fi fi else if $CS isLuks $csrc 2>/dev/null; then $CS -d $cpass $copts luksOpen $csrc $cname >/dev/null else $CS -d $cpass $copts create $cname $csrc >/dev/null fi fi if [ $? -ne 0 ]; then csfailed=1 stat_append "failed " else stat_append "ok " fi fi