#
# First, try to use the mktemp program.
# Failing that, we'll roll our own mktemp-like function:
-# - try to get random bytes from /dev/urandom
+# - try to get random bytes from /dev/urandom, mapping them to file-name bytes
# - failing that, generate output from a combination of quickly-varying
-# sources and gzip. Ignore non-varying gzip header, and extract
-# "random" bits from there.
-# - given those bits, map to file-name bytes using tr, and try to create
-# the desired directory.
+# sources and awk.
+# - try to create the desired directory.
# - make only $MAX_TRIES_ attempts
# Helper function. Print $N pseudo-random bytes from a-zA-Z0-9.
return
fi
- n_plus_50_=`expr $n_ + 50`
- cmds_='date; date +%N; free; who -a; w; ps auxww; ps -ef'
- data_=` (eval "$cmds_") 2>&1 | gzip `
-
- # Ensure that $data_ has length at least 50+$n_
- while :; do
- len_=`echo "$data_"|wc -c`
- test $n_plus_50_ -le $len_ && break;
- data_=` (echo "$data_"; eval "$cmds_") 2>&1 | gzip `
- done
-
- echo "$data_" \
- | dd bs=1 skip=50 count=$n_ 2>/dev/null \
- | LC_ALL=C tr -c $chars_ 01234567$chars_$chars_$chars_
+ # Fall back on quickly-varying sources + awk.
+ # Limit awk program to 7th Edition Unix so that it works even on Solaris 10.
+
+ (date; date +%N; free; who -a; w; ps auxww; ps -ef) 2>&1 | awk '
+ BEGIN {
+ n = '"$n_"'
+ for (i = 0; i < 256; i++)
+ ordinal[sprintf ("%c", i)] = i
+ }
+ {
+ for (i = 1; i <= length; i++)
+ a[ai++ % n] += ordinal[substr ($0, i, 1)]
+ }
+ END {
+ chars = "'"$chars_"'"
+ charslen = length (chars)
+ for (i = 0; i < n; i++)
+ printf "%s", substr (chars, a[i] % charslen + 1, 1)
+ printf "\n"
+ }
+ '
}
mktempd_ ()
setup_ "$@"
# This trap is here, rather than in the setup_ function, because some
# shells run the exit trap at shell function exit, rather than script exit.
-trap remove_tmp_ 0
+trap remove_tmp_ EXIT