diff options
author | Bryan Drewery <bryan@shatow.net> | 2021-08-21 09:37:51 +0300 |
---|---|---|
committer | Bryan Drewery <bryan@shatow.net> | 2021-08-27 22:46:48 +0300 |
commit | 8ef1c97fdd8d83006110dbbcc6869ee1fb2e2e38 (patch) | |
tree | a0cc73f9efc183ab88deeb29e4fc4f4e9b11b370 /src | |
parent | 31af28b582e5bfd702dce81c5f33d4e398aa7f93 (diff) |
Add mapfile_mktemp and use in write_atomic*
Diffstat (limited to 'src')
-rw-r--r-- | src/share/poudriere/include/util.sh | 70 |
1 files changed, 55 insertions, 15 deletions
diff --git a/src/share/poudriere/include/util.sh b/src/share/poudriere/include/util.sh index 07f8783c..5298d952 100644 --- a/src/share/poudriere/include/util.sh +++ b/src/share/poudriere/include/util.sh @@ -830,6 +830,33 @@ mapfile_cat() { return "${ret}" } +# Create a new temporary file and return a handle to it +mapfile_mktemp() { + local -; set +x + [ $# -gt 2 ] || eargs mapfile_mktemp handle_var_return \ + tmpfile_var_return "mktemp(1)-params" + local handle_var_return="$1" + local tmpfile_var_return="$2" + shift 2 + local mm_tmpfile ret + + ret=0 + _mktemp mm_tmpfile "$@" || ret="$?" + if [ "${ret}" -ne 0 ]; then + setvar "${handle_var_return}" "" + setvar "${tmpfile_var_return}" "" + return "${ret}" + fi + ret=0 + mapfile "${handle_var_return}" "${mm_tmpfile}" "we+" || ret="$?" + if [ "${ret}" -ne 0 ]; then + setvar "${handle_var_return}" "" + setvar "${tmpfile_var_return}" "" + return "${ret}" + fi + setvar "${tmpfile_var_return}" "${mm_tmpfile}" +} + # This uses open(O_CREAT), woot. noclobber() { local - @@ -1103,21 +1130,27 @@ write_atomic_cmp() { local -; set +x [ $# -eq 1 ] || eargs write_atomic_cmp destfile "< content" local dest="$1" - local tmp ret + local tmpfile_handle tmpfile ret + TMPDIR="${dest%/*}" mapfile_mktemp tmpfile_handle tmpfile \ + -ut ".tmp-${dest##*/}" || + err $? "write_atomic_cmp unable to create tmpfile in ${dest%/*}" ret=0 - tmp="$(TMPDIR="${dest%/*}" mktemp -ut .tmp-${dest##*/})" || - err $? "write_atomic_cmp unable to create tmpfile in ${dest%/*}" - mapfile_cat > "${tmp}" || ret="$?" + mapfile_write "${tmpfile_handle}" || ret="$?" if [ "${ret}" -ne 0 ]; then - unlink "${tmp}" + unlink "${tmpfile}" 2>/dev/null || : return "${ret}" fi - - if ! cmp -s "${dest}" "${tmp}"; then - rename "${tmp}" "${dest}" + ret=0 + mapfile_close "${tmpfile_handle}" || ret="$?" + if [ "${ret}" -ne 0 ]; then + unlink "${tmpfile}" 2>/dev/null || : + return "${ret}" + fi + if ! cmp -s "${dest}" "${tmpfile}"; then + rename "${tmpfile}" "${dest}" else - unlink "${tmp}" + unlink "${tmpfile}" fi } @@ -1125,17 +1158,24 @@ write_atomic() { local -; set +x [ $# -eq 1 ] || eargs write_atomic destfile "< content" local dest="$1" - local tmp ret + local tmpfile_handle tmpfile ret + TMPDIR="${dest%/*}" mapfile_mktemp tmpfile_handle tmpfile \ + -ut ".tmp-${dest##*/}" || + err $? "write_atomic unable to create tmpfile in ${dest%/*}" + ret=0 + mapfile_write "${tmpfile_handle}" || ret="$?" + if [ "${ret}" -ne 0 ]; then + unlink "${tmpfile}" 2>/dev/null || : + return "${ret}" + fi ret=0 - tmp="$(TMPDIR="${dest%/*}" mktemp -ut .tmp-${dest##*/})" || - err $? "write_atomic unable to create tmpfile in ${dest%/*}" - mapfile_cat > "${tmp}" || ret="$?" + mapfile_close "${tmpfile_handle}" || ret="$?" if [ "${ret}" -ne 0 ]; then - unlink "${tmp}" + unlink "${tmpfile}" 2>/dev/null || : return "${ret}" fi - rename "${tmp}" "${dest}" + rename "${tmpfile}" "${dest}" } # Place environment requirements on entering a function |