This change adds a fixed-size metadata block at the head of each file's content
entity. The block is versioned, and fixed-size on the theory that it might be
nice to be able to recover the content (if not the full metadata) of the files
if we're ever confronted with data backed up some hypothetical future helper
that stored expanded metadata.
The net effect is that now on restore, we assign the same access mode to the
file that it originally had when backed up.
Also, some of the code was failing to properly free transient heap-based buffers
when it encountered errors. This has been fixed with the addition of a tiny
stack-based object whose job it is to free() its designated pointer from its
destructor.
This change puts the file's access mode into the saved-state blob used by the
file backup helpers. The tests have been updated for the new blob content
format.
What this change *doesn't* do is actually backup/restore the file mode. This
change is a prerequisite for that, but mode preservation in backup/restore will
require adding metadata to the backup data stream itself, so will be approached
a bit more carefully.
(Also fixed one outright bug in the test program: ReadEntityData() had been
changed to return a ssize_t union of either a byte-count or a negative number
indicating error, but the test program was still assuming that nonzero == error,
and was spuriously failing.)