On 4/17/25 14:28, Hong, Yifan wrote:
Hello Rob,

Is there a way to create an empty tar archive with toybox? I tried:

$ ./toybox tar czf foo.tar.gz -T /dev/null
tar: empty archive

So... two terminating 512 byte blocks of zeroes with no other content? You could do it with something like:

  dd if=/dev/zero bs=1k | gzip > foo.tar.gz

I've just never encountered this use case before?

It seems that this comes from from
https://github.com/gfto/toybox/blob/75ebbd1571c85a06c0f4767beb7c20a19068f0b6/toys/pending/tar.c#L763

Tar moved out of pending in something like 2018, but the test and error message still exist on line 1048.

Background The reason I ask is that I want to do this:

tar czf out.tar.gz -T filelist.txt

But filelist.txt could be empty and I expect it to create an empty archive.
If toybox can't create empty archive when -T is empty, I have to use the
following workaround instead (untested pseudocode):

if [ -s filelist.txt ]; then
     tar czf out.tar.gz -T filelist.txt
else
     gzip < /dev/null > out.tar.gz
fi

Technically each tar stream is ended with 2 entirely zeroed 512 byte header blocks, hence the 1k of /dev/zero with dd above. (The gnu/dammit version tends to add lots of extra zero padding blocks at the end for no obvious reason, but back when posix had a standard for this it only REQUIRED two.)

... which works, but it is not quite gracefully handled IMO.

As a reference, GNU tar 1.35 does the following:

# This fails
$ tar czf out.tar.gz
tar: Cowardly refusing to create an empty archive

# This succeeds
$ tar czf out.tar.gz -T /dev/null

I didn't know there was a distinction between them.

So you want something like:

--- a/toys/posix/tar.c
+++ b/toys/posix/tar.c
@@ -1045,7 +1045,7 @@ void tar_main(void)

   // If include file list empty, don't create empty archive
   if (FLAG(c)) {
-    if (!TT.incl) error_exit("empty archive");
+    if (!TT.incl && !FLAG(T)) error_exit("empty archive");
     TT.fd = 1;
   }

Rob
_______________________________________________
Toybox mailing list
Toybox@lists.landley.net
http://lists.landley.net/listinfo.cgi/toybox-landley.net

Reply via email to