On 21/04/2021 17.21, Oleksandr Suvorov wrote: > Hi Rasmus, > > On Wed, Apr 21, 2021 at 12:34 AM Rasmus Villemoes > <rasmus.villem...@prevas.dk> wrote: >> >> On 20/04/2021 23.10, Oleksandr Suvorov wrote: >>> Hi Rasmus, >>> >>> Thanks for your feedback! >>> Yes, I noted that there were no possible situations with the trailing >>> code != 0x00, but simply removing the additional trailing 0x00 >>> gives us an empty array default_environment[] for the empty defaultenv file. >>> I need to test whether this case is handled in u-boot properly and >>> then prepare the next patch version :P >> >> No, I'm not suggesting removing the trailing nul byte, it very much has >> to be there - the binary format of the environment is a sequence of >> nul-terminated C strings of the key=value form, concatenated >> back-to-back, terminated by an empty string. > > (/me saying: never answer at night, never answer at night, never > answer at night :-D) > >> >> What I'm suggesting is to take the input file >> >> === >> foo=bar >> >> # Set our IP address >> ip=1.2.3.4 >> === >> >> do the comment- and empty-line stripping (the two first greps), and then >> after that add an extra empty line >> >> === >> foo=bar >> ip=1.2.3.4 >> >> === >> >> and then feed that to the 'replace \n by nul bytes' | 'delete >> backslash+nul+whitespace' | xxd pipe. That way there's always that >> trailing nul on the input to xxd, i.e. in the example above, we would >> feed foo=bar\0ip-1.2.3.4\0\0 into xxd, while with an initially empty >> file xxd would just receive that single nul byte. >> >> It's just that I think terminating the sequence of key=value lines by an >> empty line more exactly matches the binary format. > > Sure, now I see. Your solution is more straight and clear. > Unfortunately, it doesn't work :)
Yeah, I didn't really expect it to. Ah, it's because "set -e" is in effect, so in ( { grep -v '^#' | grep -v '^$$' ; echo '' ; } | \ the return value of the grep -v '^#' | grep -v '^$$' pipeline is that of the second grep, and when there's no input lines that match (such as, with an empty input file), that's an EXIT_FAILURE. So the whole subshell exits at that point, and nothing gets written to defaultenv_autogenerated.h. Doing define filechk_defaultenv.h ( { grep -v '^#' | grep -v '^$$' || true ; echo '' ; } | \ tr '\n' '\0' | \ sed -e 's/\\\x0\s*//g' | \ xxd -i ; ) endef seems to work. Rasmus