Erasing GPT backup header block, if expr is good enough

This commit is contained in:
2020-01-07 16:47:41 +01:00
parent 43d5804db3
commit 5a335e5594
4 changed files with 123 additions and 50 deletions

View File

@ -15,7 +15,7 @@
# announces.
xdt_print_version() {
echo "xorriso-dd-target , version 1.5.3 , 2020.01.06.204949"
echo "xorriso-dd-target , version 1.5.3 , 2020.01.07.123808"
}
@ -225,6 +225,10 @@ xdt_reset_job() {
xdt_sudo_cmd=
xdt_have_su_power=
xdt_end_after_setup=
xdt_dev_bytes=
xdt_dev_end=
xdt_dd_bs="bs=1M"
xdt_dd_silent=
return 0
}
@ -350,7 +354,9 @@ xdt_arg_interpreter() {
done
xdt_predict_su_power || return "$?"
# Prepare for using dd pacifier if desired and available
# Prepare for using silent dd with GPT backup erasure if available
xdt_dd_bs="bs=1M"
xdt_dd_silent=
if test -n "$xdt_dd_cmd"
then
if test -z "$xdt_no_pacifier" && \
@ -359,6 +365,11 @@ xdt_arg_interpreter() {
then
xdt_dd_bs="bs=1M status=progress oflag=dsync"
fi
if "$xdt_dd_cmd" if=/dev/zero of=/dev/null count=1 bs=512 status=none \
2>/dev/null
then
xdt_dd_silent="status=none"
fi
fi
return 0
}
@ -615,8 +626,8 @@ xdt_list_devices() {
# Optional tests for size
if test -n "$xdt_max_size" || test -n "$xdt_min_size"
then
xdt_size=$("$xdt_lsblk_cmd" -n -b -o SIZE /dev/"$xdt_name" \
| head -1 | xdt_round_down_div_million)
xdt_dev_bytes=$("$xdt_lsblk_cmd" -n -b -o SIZE /dev/"$xdt_name" | head -1)
xdt_size=$(echo "$xdt_dev_bytes" | xdt_round_down_div_million)
if test -z "$xdt_size"
then
xdt_yucky=y
@ -752,12 +763,37 @@ xdt_write_image() {
echo "No executable program dd found in: $xdt_sudo_x_dir_list" >&2
return 6
fi
# Erase possible GPT backup table at end of device
# if expr can properly divide device size by 512
if test -n "$xdt_dev_bytes"
then
xdt_dev_end=$(expr "$xdt_dev_bytes" / 512 2>/dev/null)
if test "$(expr "$xdt_dev_end" '*' 512 2>/dev/null)" = "$xdt_dev_bytes"
then
xdt_dev_end=$(expr "$xdt_dev_end" - 1)
else
xdt_dev_end=
fi
fi
xdt_gpt_erase_line="$xdt_sudo_cmd $xdt_dd_cmd if=/dev/zero of=/dev/'${2}' bs=512 seek='$xdt_dev_end' count=1 $xdt_dd_silent"
xdt_copy_line="$xdt_sudo_cmd $xdt_dd_cmd if='${1}' of=/dev/'${2}' $xdt_dd_bs ; sync"
if test -n "$xdt_dummy_run"
then
echo " $xdt_sudo_cmd $xdt_dd_cmd if='${1}' of=/dev/'${2}' $xdt_dd_bs ; sync"
if test -n "$xdt_dev_end"
then
echo " $xdt_gpt_erase_line"
fi
echo " $xdt_copy_line"
else
echo "Performing:"
echo " $xdt_sudo_cmd $xdt_dd_cmd if='${1}' of=/dev/'${2}' $xdt_dd_bs ; sync"
if test -n "$xdt_dev_end"
then
echo " $xdt_gpt_erase_line"
$xdt_sudo_cmd "$xdt_dd_cmd" if=/dev/zero of=/dev/"${2}" bs=512 seek="$xdt_dev_end" count=1 $xdt_dd_silent
fi
echo " $xdt_copy_line"
$xdt_sudo_cmd "$xdt_dd_cmd" if="${1}" of=/dev/"${2}" $xdt_dd_bs
xdt_ret="$?"
sync
@ -768,8 +804,6 @@ xdt_write_image() {
fi
fi
# >>> ??? Erase possible GPT backup table at end of device ?
if test -n "$xdt_dummy_force"
then
echo "BE SMART. BE CAUTIOUS. BEWARE."