Jeff King [off-list ref] writes:
The most robust thing would perhaps be:
fflush(dest->file);
ftruncate(fileno(dest->file), 0);
which leaves the handle intact.
An added benefit of that approach is that there is no need for
the filename field in the dest structure.
Having a separate filename field could be a positive flexibility (it
could be used to open a file, store its FILE* in dest->file, while
storing the name of another file in dest->filename), but also a
negative flexibility (dest->file possibly pointing to a file
different from dest->filename is a source of confusion). As I do
not think any current caller that wants such a flexibility, or
callers in any immediate future, it probably is an overall plus if
we do not have to add the dest->filename field.
(I agree with the rest of your review, especially that it would be
easier to read if this were split into separate refactor and
change-behavior steps).
-Peff