Thibaut,

John Goerzen forwarded your idea to me.

You can actually implement this on top of the current libarchive
code quite efficiently.  Use the low-level archive_write_open()
call and provide your own callbacks that just count the write
requests.  Then go through and write the archive as usual,
except skip the write_data() part (for tar and cpio formats,
libarchive will automatically pad the entry with NUL bytes).

This may sound slow, but it's really not.  One of the libarchive
unit tests use this approach to "write" 1TB archives in just a couple
of seconds.  (Thist test checks libarchive's handling of very large
archives with very large entries.)  Look at test_tar_large.c
for the details of how this particular test works.  (test_tar_large.c
actually does more than just count the data, but it should
give you the general idea.)

This will work very well with all of the tar and cpio formats.
It won't work well with some other formats where the length
does actually depend on the data.

Cheers,

Tim Kientzle

-------- Original Message --------
Date: Thu, 7 Aug 2008 21:31:27 -0500
From: John Goerzen <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED]
Cc: [EMAIL PROTECTED], [EMAIL PROTECTED]
Subject: FW: Bug#494169: libarchive-dev: Please add a way to precompute (non-compressed) archive size

Hi Tim,

We received the below feature request at Debian.  Not sure if it is
something you would be interested in implementing, but thought I'd
pass it along.

-- John

----- Forwarded message from Thibaut VARENE <[EMAIL PROTECTED]> -----

From: Thibaut VARENE <[EMAIL PROTECTED]>
Date: Thu, 07 Aug 2008 17:37:10 +0200
Reply-To: Thibaut VARENE <[EMAIL PROTECTED]>, [EMAIL PROTECTED]
To: Debian Bug Tracking System <[EMAIL PROTECTED]>
Subject: Bug#494169: libarchive-dev: Please add a way to precompute
        (non-compressed) archive size

Package: libarchive-dev
Severity: wishlist

Hi,

I thought I already reported this, but apparently I didn't so here's the
idea: I'm the author of mod_musicindex, in which I use libarchive to
send on-the-fly tar archives to remote clients.

Right now, the remote client's browser cannot display any ETA /
%complete for the current download since I cannot tell before hand what
will be the exact size of the archive I'm sending them.

It would be very nice if there were some API allowing for the
precomputation of the final size of a non-compressed archive that would
allow me to do something like:

archive_size = archive_size_header(a);
for (<filename in file list>) {
        archive_size += archive_size_addfile(filename);
        /* or using stat() and eg archive_size_addstat() */
}
archive_size += archive_size_footer(a);

(brainfart pseudo code, I hope you get the idea)

so that in the end archive_size will be exactly the size of the output
archive (header/padding included), without having to actually read files
or write the archive itself.

I could thus send the remote client the actual size of the data they're
going to be send beforehand.

The trick is, this size cannot be approximate: the browser will cut the
transfer even if I'm still sending them data if it has received as many
bits as it was told.

I'm under the impression that since this is about non-compressed
archive, and considering the structure of a tar archive, my goal should
be feasible without even having to read any input file. Am I wrong?

Hope I'm quite clear, thanks for your help

T-Bone

-- System Information:
Debian Release: lenny/sid
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: hppa (parisc64)

Kernel: Linux 2.6.22.14 (SMP w/4 CPU cores)
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
Shell: /bin/sh linked to /bin/bash




----- End forwarded message -----



--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to