From 12b33eb8c18b37546599feec908b9acd829f0029 Mon Sep 17 00:00:00 2001 From: Leah Rowe Date: Fri, 1 Sep 2023 01:33:17 +0100 Subject: lbmk script: always clean up /tmp files export TMPDIR to scripts, and handle it in a way that we know lbmk set it delete it at the end of the parent process, but not child processes; when the lbmk script calls itself, child processes will not delete the tmp directory. some scripts in lbmk weren't cleaning up the tmpfiles they made, and they still don't, but this mitigates that. now in follow-up commits, i can start cleaning up those scripts too. not handled by this patch: if the user cancels lbmk (ctrl+c), the tmp directory will still be there. this too will be handled, in subsequent patches Signed-off-by: Leah Rowe --- lbmk | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 57 insertions(+), 15 deletions(-) (limited to 'lbmk') diff --git a/lbmk b/lbmk index 66cc3b7c..175cf394 100755 --- a/lbmk +++ b/lbmk @@ -26,6 +26,26 @@ set -u -e . "include/err.sh" +tmpdir="" +tmpdir_was_set="y" +set | grep TMPDIR 1>/dev/null 2>/dev/null || tmpdir_was_set="n" +if [ "${tmpdir_was_set}" = "y" ]; then + tmpdir="${TMPDIR##*/}" + tmpdir="${TMPDIR%_*}" + if [ "${tmpdir}" = "lbmk" ]; then + tmpdir="" + tmpdir_was_set="n" + fi +fi +if [ "${tmpdir_was_set}" = "n" ]; then + export TMPDIR="/tmp" + tmpdir="$(mktemp -d -t lbmk_XXXXXXXX)" + export TMPDIR="${tmpdir}" +else + export TMPDIR="${TMPDIR}" +fi +tmpdir="${TMPDIR}" + projectname="$(cat projectname)" buildpath="" mode="" @@ -34,10 +54,10 @@ option="" main() { id -u 1>/dev/null 2>/dev/null || \ - err "cannot ascertain user id" + fail "cannot ascertain user id" - [ "${0##*/}" = "lbmk" ] && err "Don't run this script directly." - [ $# -lt 1 ] && err "Too few arguments. Try: ${0} help" + [ "${0##*/}" = "lbmk" ] && fail "Don't run this script directly." + [ $# -lt 1 ] && fail "Too few arguments. Try: ${0} help" mode="${1}" if [ "${mode}" = "dependencies" ]; then @@ -46,13 +66,13 @@ main() printf "Look at files under resources/dependencies/\n" \ 1>&2 printf "Example: ./build dependencies debian\n" 1>&2 - err "target not specified" + fail "target not specified" fi - install_dependencies $@ || err "Could not install dependencies" - exit 0 + install_dependencies $@ || fail "Could not install dependencies" + lbmk_exit 0 fi if [ "$(id -u)" = "0" ]; then - err "running this command as root is not permitted" + fail "running this command as root is not permitted" fi buildpath="./script/${0##*/}" @@ -62,13 +82,13 @@ main() exit 0 [ $# -lt 2 ] && usage ${0} && exit 1 - ./checkgit || err "Please read: https://libreboot.org/docs/build/" + ./checkgit || fail "Please read: https://libreboot.org/docs/build/" option="${2}" shift 2 ./script/misc/versioncheck || \ - err "Cannot check lbmk version" + fail "Cannot check lbmk version" case "${option}" in list) @@ -77,31 +97,33 @@ main() for option in $(./build command options "${buildpath}/${mode}") do "${buildpath}/${mode}/${option}" $@ || \ - err "script fail: ${buildpath}/${mode}/${option} $@" + fail "script fail: ${buildpath}/${mode}/${option} $@" done ;; *) if [ ! -d "${buildpath}/${mode}" ]; then usage $0 - err "Invalid mode '${mode}'. Run: ${0} help" + fail "Invalid mode '${mode}'. Run: ${0} help" elif [ ! -f "${buildpath}/${mode}/${option}" ]; then usage $0 printf "Invalid option for '%s'." ${mode} - err "Run: ${0} ${mode} list'." + fail "Run: ${0} ${mode} list'." fi - "${buildpath}/${mode}/${option}" $@ || err "lbmk error" + "${buildpath}/${mode}/${option}" $@ || fail "lbmk error" esac + + lbmk_exit 0 } install_dependencies() { - [ -f "resources/dependencies/${2}" ] || err "Unsupported target" + [ -f "resources/dependencies/${2}" ] || fail "Unsupported target" aur_notice="" . "resources/dependencies/${2}" ${pkg_add} ${pkglist} || \ - err "install_dependencies: Error installing dependencies" + fail "install_dependencies: Error installing dependencies" [ "${aur_notice}" = "" ] || \ printf "You must install AUR packages: %s\n" "${aur_notice}" 1>&2 } @@ -124,4 +146,24 @@ usage() EOF } +lbmk_exit() +{ + tmp_cleanup || err "could not remove tmpdir on lbmk exit: ${tmpdir}" + exit $1 +} + +fail() +{ + tmp_cleanup || printf "WARNING: could not remove tmpdir: %s\n" \ + "${tmpdir}" 1>&2 + err "${1}" +} + +tmp_cleanup() +{ + if [ "${tmpdir_was_set}" = "n" ]; then + rm -Rf "${tmpdir}" || return 1 + fi +} + main $@ -- cgit v1.2.1