diff options
Diffstat (limited to 'include/init.sh')
-rw-r--r-- | include/init.sh | 52 |
1 files changed, 40 insertions, 12 deletions
diff --git a/include/init.sh b/include/init.sh index bc5a62b6..ea18cf69 100644 --- a/include/init.sh +++ b/include/init.sh @@ -64,31 +64,59 @@ xbmk_get_version() xbmk_set_env() { - is_child="n" - xbmkpath="$PATH" - # unify all temporary files/directories in a single TMPDIR - [ -z "${TMPDIR+x}" ] || [ "${TMPDIR%_*}" = "/tmp/xbmk" ] || \ - unset TMPDIR - [ -n "${TMPDIR+x}" ] && export TMPDIR="$TMPDIR" && xbtmp="$TMPDIR" - [ -z "${TMPDIR+x}" ] || is_child="y" # child instance, so return + is_child="n" + [ -f "$xbmklock" ] && is_child="y" if [ "$is_child" = "y" ]; then + eval `setvars "" xbtmp badtmp xbtmpchk xbtmpname` + + [ -z "${TMPDIR+x}" ] && export TMPDIR="/tmp" + + # extremely pedantic safety checks on TMPDIR + xbtmpchk="`findpath "$TMPDIR" || err`" || err + [ "$xbtmpchk" = "${xbtmpchk#/tmp/}" ] && \ + badtmp="not a subdirectory in /tmp" + [ -z "$badtmp" ] && xbtmpname="${xbtmpchk#/tmp/}" && \ + [ -z "$xbtmpchk" ] && badtmp="name after /tmp is empty" + [ -z "$badtmp" ] && [ "$xbtmpname" != "${xbtmpname#*/}" ] && \ + badtmp="'$TMPDIR' is a subdirectory in a subdir of /tmp" + [ -z "$badtmp" ] && [ -L "$xbtmpchk" ] && badtmp="is a symlink" + [ -z "$badtmp" ] && [ ! -d "$xbtmpchk" ] && \ + badtmp="not a directory" + if [ -z "$badtmp" ]; then + # final check: check if TMPDIR changed + locktmp="" + read -r locktmp < "$xbmklock" || err "!read $xbmklock" + [ "$locktmp" = "$xbtmpchk" ] || \ + badtmp="TMPDIR '$xbtmpchk' changed; was '$locktmp'" + fi + [ -n "$badtmp" ] && \ + printf "bad TMPDIR initialisation, '%s': %s\n" \ + "$TMPDIR" "$badtmp" 1>&2 + [ -n "$badtmp" ] && err \ + "'$xbmklock' present with bad tmpdir. is a build running?" + + xbtmp="$xbtmpchk" + export TMPDIR="$xbtmpchk" + [ -z "${XBMK_CACHE+x}" ] && err "XBMK_CACHE unset on child" [ -z "${XBMK_THREADS+x}" ] && xbmk_set_threads e "lock" f missing && err "lock file absent on child" return 1 fi - [ -f "$xbmklock" ] && err "'$xbmklock' exists. Is a build running?" - touch "$xbmklock" || err "cannot create '$xbmklock'"; : - - # parent instance of xbmk, so don't return. set up TMPDIR + # parent instance of xbmk, so continue. + # first, set up a unified temporary directory: export TMPDIR="/tmp" - export TMPDIR="$(mktemp -d -t xbmk_XXXXXXXX)" + export TMPDIR="`mktemp -d -t xbmk_XXXXXXXX || err`" || err xbtmp="$TMPDIR" + [ -f "$xbmklock" ] && err "'$xbmklock' exists. Is a build running?" + printf "%s\n" "$xbtmp" > "$xbmklock" || \ + err "cannot create '$xbmklock'"; : + export XBMK_CACHE="$xbmkpwd/cache" [ -L "$XBMK_CACHE" ] && [ "$XBMK_CACHE" = "$xbmkpwd/cache" ] && \ err "cachedir '$xbmkpwd/cache' is a symlink" |