Hi Marek, On Wed, 5 Feb 2025 at 07:37, Marek Vasut <ma...@denx.de> wrote: > > Add implementation of mkenvimage written purely in bourne shell. > > This is not a replacement for mkenvimage tool, but rather a simple > implementation which can be used in environments where mkenvimage > itself cannot be deployed due to various constraints, like hardware > manufacturing plants, but where bourne shell and basic tool are > already available. > > The external dependencies which are not shell built-ins are gzip > and grep. > > All mkenvimage parameters are implemented and compatible with the > C implementation of mkenvimage. > > Signed-off-by: Marek Vasut <ma...@denx.de> > --- > Cc: Joe Hershberger <joe.hershber...@ni.com> > Cc: Tom Rini <tr...@konsulko.com> > --- > tools/mkenvimage.sh | 126 ++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 126 insertions(+) > create mode 100755 tools/mkenvimage.sh
Would it be worth adding a simple test for this? Regards, SImon > + REDUNDANT=1 > + ;; > + b) > + # Swap CRC endianness > + BIGENDIAN=1 > + ;; > + p) > + BYTEFILL="$(printf "%b" "\0$(printf "%o" $((OPTARG)))")" > + ;; > + s) > + SIZE="$((OPTARG))" > + ;; > + o) > + OUTFILE="${OPTARG}" > + ;; > + V) > + echo "mkenvimage version SHELL" > + exit 0 > + ;; > + h|*) > + print_help > + exit 0 > + ;; > + esac > +done > + > +shift $((OPTIND - 1)) > +if test -n "${1}" ; then > + INFILE=${1} > +fi > + > +if test -z "${INFILE}" ; then > + echo "Input file not specified" > + print_help > + exit 1 > +fi > + > +if test -z "${OUTFILE}" ; then > + echo "Output file not specified" > + print_help > + exit 1 > +fi > + > +if test "${SIZE}" -eq 0 ; then > + echo "Size not specified" > + print_help > + exit 1 > +fi > + > +crctmpfile=$(mktemp) > +outtmpfile=$(mktemp) > + > +( > +# Read input environment file, make sure there is a trailing newline, > +# sort the result and remove empty and commented out lines. > +( cat "${INFILE}" ; echo ) | sort -u "${INFILE}" | grep -v '^#' | grep -v > '^[ \t]*$' | tr '\n' '\0' > +# Insert one more trailing zero at the end of environment. > +printf '\0' > +# Fill the rest of the environment with BYTEFILL bytes. > +tr '\0' "${BYTEFILL}" < /dev/zero > +# Clip the environment block to correct size. Header is 4 bytes CRC32 > +# for regular environment and 5 bytes CRC32 and flags for redundant > +# environment. > +) | dd count="$((SIZE - 4 - REDUNDANT))" bs=1 of="${outtmpfile}" 2>/dev/null > + > +gzip -ck1 "${outtmpfile}" | tail -c8 | head -c4 > "${crctmpfile}" > + > +# Reverse crc32 for big-endian systems > +if test "$BIGENDIAN" -eq 1 ; then > + # Note that 'rev' is from util-linux and may not be available, > + # 'xxd' is from vim and may not be available, and 'tac -rs .' > + # does not handle unterminated strings and newlines well, so > + # use plain 'dd' to reverse the 4 bytes reliably and using > + # minimum dependencies: > + crcbetmpfile=$(mktemp) > + ( > + dd if="${crctmpfile}" bs=1 count=1 skip=3 ; > + dd if="${crctmpfile}" bs=1 count=1 skip=2 ; > + dd if="${crctmpfile}" bs=1 count=1 skip=1 ; > + dd if="${crctmpfile}" bs=1 count=1 skip=0 > + ) >> "${crcbetmpfile}" 2>/dev/null > + mv "${crcbetmpfile}" "${crctmpfile}" > +fi > + > +# Add 5th byte set to 0x01 to indicate redundant environment image. > +if test "$REDUNDANT" -eq 1 ; then > + printf '\001' >> "${crctmpfile}" > +fi > + > +# Concatenate the CRC32 and environment block into the final output file. > +cat "${crctmpfile}" "${outtmpfile}" > "${OUTFILE}" > + > +# Clean up the temporary files > +rm -f "${crctmpfile}" "${outtmpfile}" > -- > 2.47.2 >