|  | ## Common shell functions used by demo scripts programs/*/*.sh. | 
|  |  | 
|  | ## How to write a demo script | 
|  | ## ========================== | 
|  | ## | 
|  | ## Include this file near the top of each demo script: | 
|  | ##   . "${0%/*}/../demo_common.sh" | 
|  | ## | 
|  | ## Start with a "msg" call that explains the purpose of the script. | 
|  | ## Then call the "depends_on" function to ensure that all config | 
|  | ## dependencies are met. | 
|  | ## | 
|  | ## As the last thing in the script, call the cleanup function. | 
|  | ## | 
|  | ## You can use the functions and variables described below. | 
|  |  | 
|  | set -e -u | 
|  |  | 
|  | ## $root_dir is the root directory of the Mbed TLS source tree. | 
|  | root_dir="${0%/*}" | 
|  | # Find a nice path to the root directory, avoiding unnecessary "../". | 
|  | # The code supports demo scripts nested up to 4 levels deep. | 
|  | # The code works no matter where the demo script is relative to the current | 
|  | # directory, even if it is called with a relative path. | 
|  | n=4 # limit the search depth | 
|  | while ! [ -d "$root_dir/programs" ] || ! [ -d "$root_dir/library" ]; do | 
|  | if [ $n -eq 0 ]; then | 
|  | echo >&2 "This doesn't seem to be an Mbed TLS source tree." | 
|  | exit 125 | 
|  | fi | 
|  | n=$((n - 1)) | 
|  | case $root_dir in | 
|  | .) root_dir="..";; | 
|  | ..|?*/..) root_dir="$root_dir/..";; | 
|  | ?*/*) root_dir="${root_dir%/*}";; | 
|  | /*) root_dir="/";; | 
|  | *) root_dir=".";; | 
|  | esac | 
|  | done | 
|  |  | 
|  | ## $programs_dir is the directory containing the sample programs. | 
|  | # Assume an in-tree build. | 
|  | programs_dir="$root_dir/programs" | 
|  |  | 
|  | ## msg LINE... | 
|  | ## msg <TEXT_ORIGIN | 
|  | ## Display an informational message. | 
|  | msg () { | 
|  | if [ $# -eq 0 ]; then | 
|  | sed 's/^/# /' | 
|  | else | 
|  | for x in "$@"; do | 
|  | echo "# $x" | 
|  | done | 
|  | fi | 
|  | } | 
|  |  | 
|  | ## run "Message" COMMAND ARGUMENT... | 
|  | ## Display the message, then run COMMAND with the specified arguments. | 
|  | run () { | 
|  | echo | 
|  | echo "# $1" | 
|  | shift | 
|  | echo "+ $*" | 
|  | "$@" | 
|  | } | 
|  |  | 
|  | ## Like '!', but stop on failure with 'set -e' | 
|  | not () { | 
|  | if "$@"; then false; fi | 
|  | } | 
|  |  | 
|  | ## run_bad "Message" COMMAND ARGUMENT... | 
|  | ## Like run, but the command is expected to fail. | 
|  | run_bad () { | 
|  | echo | 
|  | echo "$1 This must fail." | 
|  | shift | 
|  | echo "+ ! $*" | 
|  | not "$@" | 
|  | } | 
|  |  | 
|  | ## config_has SYMBOL... | 
|  | ## Succeeds if the library configuration has all SYMBOLs set. | 
|  | config_has () { | 
|  | for x in "$@"; do | 
|  | "$programs_dir/test/query_compile_time_config" "$x" | 
|  | done | 
|  | } | 
|  |  | 
|  | ## depends_on SYMBOL... | 
|  | ## Exit if the library configuration does not have all SYMBOLs set. | 
|  | depends_on () { | 
|  | m= | 
|  | for x in "$@"; do | 
|  | if ! config_has "$x"; then | 
|  | m="$m $x" | 
|  | fi | 
|  | done | 
|  | if [ -n "$m" ]; then | 
|  | cat >&2 <<EOF | 
|  | $0: this demo requires the following | 
|  | configuration options to be enabled at compile time: | 
|  | $m | 
|  | EOF | 
|  | # Exit with a success status so that this counts as a pass for run_demos.py. | 
|  | exit | 
|  | fi | 
|  | } | 
|  |  | 
|  | ## Add the names of files to clean up to this whitespace-separated variable. | 
|  | ## The file names must not contain whitespace characters. | 
|  | files_to_clean= | 
|  |  | 
|  | ## Call this function at the end of each script. | 
|  | ## It is called automatically if the script is killed by a signal. | 
|  | cleanup () { | 
|  | rm -f -- $files_to_clean | 
|  | } | 
|  |  | 
|  |  | 
|  |  | 
|  | ################################################################ | 
|  | ## End of the public interfaces. Code beyond this point is not | 
|  | ## meant to be called directly from a demo script. | 
|  |  | 
|  | trap 'cleanup; trap - HUP; kill -HUP $$' HUP | 
|  | trap 'cleanup; trap - INT; kill -INT $$' INT | 
|  | trap 'cleanup; trap - TERM; kill -TERM $$' TERM | 
|  |  | 
|  | if config_has MBEDTLS_ENTROPY_NV_SEED; then | 
|  | # Create a seedfile that's sufficiently long in all library configurations. | 
|  | # This is necessary for programs that use randomness. | 
|  | # Assume that the name of the seedfile is the default name. | 
|  | files_to_clean="$files_to_clean seedfile" | 
|  | dd if=/dev/urandom of=seedfile ibs=64 obs=64 count=1 | 
|  | fi |