mirror of
https://github.com/uutils/coreutils.git
synced 2026-10-16 02:48:27 -07:00
88 lines
2.4 KiB
Bash
Executable File
88 lines
2.4 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Shared setup for the util/check-*.sh syscall verification scripts
|
|
# (check-safe-traversal.sh, check-toctou.sh, check-libc-interposition.sh).
|
|
#
|
|
# Source it after setting CHECK_UTILS to the utilities the caller exercises:
|
|
#
|
|
# CHECK_UTILS="mkfifo touch head"
|
|
# . "$(dirname "${BASH_SOURCE[0]}")/check-common.sh"
|
|
#
|
|
# It provides $PROJECT_ROOT, a $TEMP_DIR cleaned up on exit, fail_immediately(),
|
|
# require_command(), and util_cmd()/have_util() to resolve a utility to a
|
|
# runnable command whether the tree was built as individual binaries or as the
|
|
# multicall binary.
|
|
|
|
: "${PROFILE:=release-small}"
|
|
export PROFILE
|
|
|
|
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
BIN_DIR="$PROJECT_ROOT/target/$PROFILE"
|
|
TEMP_DIR=$(mktemp -d)
|
|
|
|
cleanup() {
|
|
rm -rf "$TEMP_DIR"
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
fail_immediately() {
|
|
echo "❌ FAILED: $1"
|
|
# Only the strace-based checks leave logs behind; mention them if they exist.
|
|
if compgen -G "$TEMP_DIR/strace_*.log" >/dev/null; then
|
|
echo ""
|
|
echo "Debug information available in: $TEMP_DIR/strace_*.log"
|
|
fi
|
|
exit 1
|
|
}
|
|
|
|
require_command() {
|
|
if ! command -v "$1" >/dev/null 2>&1; then
|
|
echo "Error: $1 is required to run these checks"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Prefer individual binaries: they are what CI builds, and tracing them avoids
|
|
# the multicall dispatch noise. Fall back to the multicall binary otherwise.
|
|
detect_binaries() {
|
|
local util
|
|
for util in $CHECK_UTILS; do
|
|
if [ -f "$BIN_DIR/$util" ]; then
|
|
echo "Using individual binaries"
|
|
USE_MULTICALL=0
|
|
return
|
|
fi
|
|
done
|
|
|
|
if [ -f "$BIN_DIR/coreutils" ]; then
|
|
echo "Using multicall binary"
|
|
USE_MULTICALL=1
|
|
COREUTILS_BIN="$BIN_DIR/coreutils"
|
|
MULTICALL_UTILS=$("$COREUTILS_BIN" --list)
|
|
return
|
|
fi
|
|
|
|
echo "Error: No binaries found. Please build first with 'cargo build --profile=$PROFILE'"
|
|
exit 1
|
|
}
|
|
|
|
# Resolve a utility to a runnable command, or return 1 when it was not built.
|
|
# A multicall binary built without the unix feature set has no chmod or chown
|
|
# in it, so ask it what it actually dispatches.
|
|
util_cmd() {
|
|
local util="$1"
|
|
if [ "$USE_MULTICALL" -eq 1 ]; then
|
|
grep -qx "$util" <<<"$MULTICALL_UTILS" || return 1
|
|
echo "$COREUTILS_BIN $util"
|
|
else
|
|
[ -f "$BIN_DIR/$util" ] || return 1
|
|
echo "$BIN_DIR/$util"
|
|
fi
|
|
}
|
|
|
|
have_util() {
|
|
util_cmd "$1" >/dev/null
|
|
}
|
|
|
|
detect_binaries
|